web-dev-qa-db-ja.com

||へのオペランドおよび&&演算子は論理スカラー値に変換可能である必要があります

Matlabでの高速な実装を探しているという単純な問題があります。私は値の配列を持っています、例えば:

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

次に、同じサイズのしきい値配列があります。たとえば、次のようになります。

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

a内の値がa_threshの対応する値より0.5倍小さい場合、出力を0にします。同様に1.2xの場合、a_threshの値も次のように設定する必要があります。ゼロ、ie

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;

ただし、次のようなエラーが発生します。

||へのオペランドおよび&&操作は論理スカラー値に変換可能である必要があります

これを解決する方法について何かアドバイスはありますか?明らかに、ループを使用してこれを行うことができ、それは簡単ですが、コードをベクトル化したままにしておきたいと思います。

6
trican

&&については、スカラーでのみ動作できるのに対し、&は配列でも動作できるということです。動作させるには、&&&に変更する必要があります(詳細については、 この質問 を参照してください)。

更新:
コメントで説明されている2番目の問題について:インデックスを使用している(特定の要素のみを選択している)ため、左側の要素の数が異なり、右側ではマトリックス全体を操作しています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);

計算自体が正しいかどうかわからないので、確認はお任せします。

14
Eitan T