2016-07-16 12 views
3

Ich habe eine Matrix und ich bin daran interessiert, Werte zu ändern, die eine bestimmte Bedingung innerhalb dieser Matrix unterschiedlich erfüllen, je nachdem, wo sie sind. Sagen wir, ich habe eine Matrix SmallPic. Wie erhalte ich eine Matrix smallPicB mit den gleichen Dimensionen, die alle Werte über 50 in den ersten zwei Spalten auf 255 geändert haben, während diejenigen, die in der dritten und vierten Spalte sind, in eine 180 geändert werden?Ändern einiger Werte nach einem logischen Index in einem bestimmten Bereich einer Matrix

Ich habe diesen Code, der, aber es ist ziemlich hässlich und erfordert Aufspalten der Matrix und verketten es wieder funktioniert:

smallPic1=smallPic(:,1:2);smallPic1(smalllPic1>50)=255; 
smallPic2=smallPic(:,3:4);smallPic2(smalllPic2>50)=180; 

smallPicB = [smalllPic1 smalllPic2]; 

Wie würden Sie kombinieren die logische Index mit dem Skalar-Index in einem Befehl?

Was nicht funktioniert, ist dies:

smallPic(:,smallPic(:,3:4)>50) = 180 

Hier ist die zweite Erwähnung smallpic innerhalb der Klammern erlaubt keine Indizierung in die richtige Position von smallpic, weil es nicht die gleichen Abmessungen wie smallpic hat . Dieser Befehl ersetzt also Werte in den ersten beiden Spalten von smallPic, die sich in derselben Zeile wie die Werte in der dritten und vierten Spalte über 50 befinden, statt die Werte in der dritten und vierten Spalte selbst zu ersetzen.

Haben Sie noch weitere Vorschläge?

+2

über Ihre Bearbeitung: Deshalb habe ich J definiert, die Spalte Index aller Mitglieder speichert. – saastn

Antwort

2

Es ist wahrscheinlich nicht das, was Sie suchen, aber es kann helfen, wenn Sie viele Aufgaben wie die haben:

J = repmat(1:size(smallPic, 2), size(smallPic, 1), 1) 
smallPic((J<3)&(smallPic>50))=255 
smallPic((J>2)&(J<5)&(smallPic>50))=180 

Sie auch ismember Funktion aufrufen können, wenn Spaltenindizes nicht aufeinander folgend sind:

smallPic(ismember(J, [[1:2 5:6]])&(smallPic>50))=255