2013-04-18 367 views
6

私はMatlabの高速実装を探しているという単純な問題があります。私は、値の配列を持っている、のは言わせて:||へのオペランド&&演算子は論理スカラ値に変換可能でなければなりません

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

私はその後、同様のサイズの閾値配列を持っている、のはそれだとしましょう:

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

a内の値については、彼らが対応するよりも0.5倍小さい場合

a(a < a_thresh.*0.4) = 0 
a(a > a_thresh.*1.2) = 0 
0: すなわち、同様に1.2倍のため a_threshの値もゼロに設定する必要があります - a_threshの値Iは、出力が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; 

:私は、次のようなものを使用することができると思いましたそして& &操作は、これを解決する方法上の任意のアドバイス論理スカラー値

に変換可能でなければなりませんか?明らかに、私はこれを行うためにループを使うことができました。それは簡単ですが、私はコードをベクトル化したままにしておきたいと思います。

答えて

14

&&は、スカラーでのみ動作することができますが、&はアレイでも動作できます。 &&&に変更して動作させる必要があります(this questionで詳しく読むことができます)。

更新:
コメントで説明し、あなたの第二の問題について:あなたは(特定の要素だけを選択)インデックスを使用している、そして右側にあなたが作業しているので、左側の要素の数が異なっていますマトリックス全体は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); 

計算自体た場合、私はわからないんだけど正しかったので、私はあなたにチェックするためにそれを残すでしょう。

+0

素晴らしい - それは&&&問題に対処する - 私はいくつかのことを知らなかった、ありがとう!右の要素の数が左の要素の数と異なるという小さな問題があります。これを修正するスマートな方法はありますか? – trican

+0

@trican私はそれをうまくいった、更新を参照してください。 –

+1

多くの皆さん、ありがとうございますEitan - あなたのソリューションは完璧に動作します - そして、私のMatlabの仕事のどこで他のものを使うことができるか分かります – trican

関連する問題