1. ホーム
  2. matlab

[解決済み] 演算子のオペランドは、論理スカラー値に変換可能でなければならない。

2022-02-11 04:34:55

質問

簡単な問題があり、Matlabで高速に実装できるものを探しています。私は値の配列を持っています, としましょう:

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

次に、同じような大きさの閾値の配列があり、それをこう呼ぶことにします。

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

の中の値については a の対応する値より0.5倍小さい場合,その値は a_thresh の値の1.2倍の場合も同様に0を出力させたい。 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;

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

||| および && 操作のオペランドは、論理的なスカラー値に変換可能でなければなりません。

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

どのように解決するのですか?

に関すること && に対してのみ操作できることです。 スカラー 一方 & は配列も操作できます。を変更する必要があります。 && から & を使用して動作させることができます(詳しくは この質問 ).

更新しました。
コメントにある2つ目の問題について: 左側はインデックスを使用している(特定の要素のみを選択している)ため、要素の数が異なっており、右側は行列全体を扱っています。 aa_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);

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