2013-04-18 11 views
6

Ich habe ein einfaches Problem, dass ich nach einer schnellen Implementierung in Matlab suche. Ich habe ein Array von Werten, sagen wir mal:Operanden zum || und && Operatoren müssen in logische Skalarwerte umgewandelt werden können

a = floor(rand(5,5).*255) 

ich dann einen ähnlich großen Schwellenmatrix haben, lassen Sie uns sagen, es ist:

a_thresh = floor(rand(5,5).*255) 

Für Werte innerhalb a wenn sie 0,5x kleiner als die entsprechende sind in a_thresh Wert mag ich den Ausgang 0 sein - der Wert in a_thresh in ähnlicher Weise für 1.2x auch auf Null gesetzt werden sollte, dh:

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 

Für Werte zwischen 0,4x und 0,5x und 1,0x und 1,2x möchte ich einen proportionalen Betrag und sonst zwischen 0,5 und 1,0 Ich möchte den Wert a unverändert verwenden. Ich dachte, ich so etwas wie die folgende verwenden:

a(a>= a_thresh .* 0.4 && a <a_thresh.* 0.5) = ((a - a_thresh.*0.4)/(a_thresh.*0.5 a_thresh.*0.4)) .* a; 

Allerdings habe ich einen Fehler, der sagt:

Operanden || und & & Operationen müssen konvertierbar logische skalare Werte

Alle Ratschläge, wie dieses Problem zu lösen? Natürlich könnte ich dazu Schleifen verwenden, und das wäre trivial, aber ich möchte den Code vektorisiert halten.

Antwort

14

Die Sache && ist, dass es nur auf Skalare arbeiten kann, während & auch auf Arrays arbeiten kann. Sie sollten die && zu & ändern, damit es funktioniert (Sie können mehr darüber in this question lesen).

Update:
In Bezug auf Ihre zweite Problem in einem Kommentar beschrieben: die Anzahl der Elemente auf der linken Seite ist anders, weil Sie verwenden Indizes (Auswahl nur bestimmte Elemente), und auf der rechten Seite mit dem Sie arbeiten die gesamte Matrix a und a_thresh.

Sie benötigen Indizes auf beiden Seiten verwenden, so schlage ich vor, es in einer Variablen speichern und dann als Array-Index verwenden, entlang dieser Linien:

idx = (a >= a_thresh*0.4 & a < a_thresh*0.5); 
a(idx) = ((a(idx)-a_thresh(idx)*0.4) ./ (a_thresh(idx)*0.5*a_thresh(idx)*0.4)) .* a(idx); 

Ich bin mir nicht sicher, ob die Berechnung selbst ist richtig, also überlasse ich es dir zu überprüfen.

+0

Fantastisch - das behebt die &/&& Problem - ich einige, wie ich das nicht wusste, danke! Jetzt habe ich ein kleines Problem, dass die Anzahl der Elemente auf der rechten Seite von der linken abweicht. Gibt es eine kluge Art, das zu beheben? – trican

+0

@trican Ich habe es ausgearbeitet, siehe das Update. –

+1

Vielen, vielen Dank Eitan - Ihre Lösung funktioniert perfekt - und ist eindeutig allgemein genug, dass ich sehen kann, wie ich es anderswo in meiner Matlab-Arbeit verwenden kann – trican

Verwandte Themen