2013-04-18 7 views
6

Mam prosty problem, że szukam szybkiego wdrożenia w Matlab. Mam tablicę wartości, powiedzmy:Operandy do || i && operatory muszą być wymienialne na logiczne wartości skalarne

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

Mam następnie podobnie wielkości tablicę progowej, powiedzmy to:

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

Dla wartości w a jeśli są 0,5x mniejszy niż odpowiadający wartość w a_thresh Chcę być wyjście 0 - podobnie do 1,2x wartość w a_thresh powinny być również ustawiony na zero, tj:

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

Dla wartości między 0,4x a 0,5x i 1,0x i 1,2x chcę proporcjonalnej kwoty, a gdzie indziej od 0,5 do 1,0 chcę używać niezmienionej wartości a. Myślałem, że mogę używać coś jak następuje:

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; 

Jednakże pojawia się błąd, który mówi:

operandy do || i & & operacje muszą być wymienialne na logicznej skalarne wartości

Wszelkie porady, w jaki sposób rozwiązać ten problem? Oczywiście mogłem użyć pętli, aby to zrobić i byłoby to banalne, ale chcę zachować wektoryzację kodu.

Odpowiedz

14

Rzecz o && jest to, że może on działać tylko na skalarów, natomiast & może działać na tablicach, jak również. Należy zmienić && na &, aby działało (więcej informacji na ten temat można znaleźć w this question).

Aktualizacja:
Odnośnie drugiego problemu opisanego w komentarzu: liczba elementów po lewej stronie jest inna, ponieważ używasz indeksów (wybór tylko niektórych elementów), a po prawej pracujesz z cała macierz: a i .

Trzeba użyć indeksów w obie strony, więc proponuję przechowywać ją w zmiennej, a następnie użyć go jako indeks tablicy, wzdłuż tych linii:

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); 

Nie jestem pewien, czy sama kalkulacja jest poprawny, więc zostawię to do sprawdzenia.

+0

Fantastyczne - to dotyczy problemu && && - I jak się tego nie dowiedziałam, dzięki! Teraz mam mały problem, że liczba elementów po prawej stronie różni się od lewej. Czy istnieje inteligentny sposób naprawienia tego? – trican

+0

@trican Zrobiłem to, proszę zobaczyć aktualizację. –

+1

Wiele, wiele dzięki Eitan - twoje rozwiązanie działa idealnie - i jest wystarczająco ogólne, że mogę zobaczyć, jak mogę go używać gdzie indziej w mojej pracy Matlaba – trican