Операнды || Операторы and && должны быть преобразованы в логические скалярные значения.

У меня простая проблема, я ищу быструю реализацию в Matlab. У меня есть массив значений, скажем:

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

Затем у меня есть пороговый массив аналогичного размера, скажем, это:

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

Для значений в a, если они на 0,5x меньше, чем соответствующее значение в a_thresh, я хочу, чтобы результат был 0 - аналогично для 1,2x значение в a_thresh также должно быть установлено равным нулю, т.е.:

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

Для значений между 0,4x и 0,5x и 1,0x и 1,2x мне нужна пропорциональная величина, а в остальных случаях между 0,5 и 1,0 я хочу использовать значение a без изменений. Я подумал, что могу использовать что-то вроде следующего:

 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;

Однако я получаю сообщение об ошибке:

Операнды к || и && операции должны быть преобразованы в логические скалярные значения

Есть какие-нибудь советы, как это решить? Очевидно, я мог бы использовать для этого циклы, и это было бы тривиально, но я хочу сохранить векторизованный код.


person trican    schedule 18.04.2013    source источник


Ответы (1)


Особенность && в том, что он может работать только с скалярами, тогда как & может работать и с массивами. Вы должны изменить && на &, чтобы он заработал (подробнее об этом можно прочитать в этот вопрос).

Обновление:
Что касается вашей второй проблемы, описанной в комментарии: количество элементов слева другое, потому что вы используете индексы (выбирая только определенные элементы), а справа вы ' Переработаем всю матрицу a и a_thresh.

Вам нужно использовать индексы с обеих сторон, поэтому я предлагаю сохранить его в переменной, а затем использовать в качестве индекса массива в следующих строках:

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

Я не уверен, верен ли сам расчет, поэтому оставлю его на ваше усмотрение.

person Eitan T    schedule 18.04.2013
comment
Потрясающе - это решает проблему & / && - я как-то не знал этого, спасибо! Теперь у меня небольшая проблема, что количество элементов справа отличается от левого. Есть ли способ исправить это? - person trican; 18.04.2013
comment
Большое, большое спасибо Eitan - ваше решение работает отлично - и достаточно общее, чтобы я мог видеть, как я могу использовать его в других местах моей работы над Matlab. - person trican; 19.04.2013