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

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

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

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

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

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

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

для значений между 0.4 x и 0.5 x и 1.0 x и 1.2 x я хочу пропорциональную сумму, а также где между 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;

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

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

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

1 ответов


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

обновление:
Что касается вашей второй проблемы, описанной в комментарии: количество элементов слева отличается, потому что вы используете индексы (выбирая только определенные элементы), а справа вы работаете со всей матрицей 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);

Я не уверен, что сам расчет правильный, поэтому я оставлю его вам, чтобы проверить.