2016-04-19 9 views
1

Aの要素に0〜255の要素の行列があります。今度は、> 48< 200の要素を平方根に変更したいだけです。行列内の特定のエントリのみの平方根を計算する

私はこのような要素を見つけると置き換えることができます知っている:

A(A>48 & A<200) = 3; 

しかし、私は数に要素を設定する必要はありませんが、私は新しい価値のための要素の値を使用します。このような

何か:

A(A>48 & A<200).^(1/2) 

上記の構文は明らかに正しいではありませんが、私は> 48< 200

である要素の平方根を計算したいループのない方法はあります?

答えて

4

あなたはかなり近いです:

A(A>48 & A<200) = A(A>48 & A<200).^(1/2); 

A > 48 & A < 200Aにのみ特定のエントリに対して操作を適用するlogicalマスクを作成します。したがって、> 48< 200の要素だけを選択したい場合は、その操作を適用するときに、それらの位置にのみ割り当てを戻してください。

トロイHaskinによって推奨されているようで、実際に服用するのではなく、sqrtを使用することをお勧めし

mask = A > 48 & A < 200; 
A(ind) = A(ind).^(0.5); 

マイナー注:あなたが少ないタイピングをしたい場合は

、別途マスクを作成し、割り当てを行います半電力はsqrtと特殊な動作で最適化されています。

そのため、代わりにこれを行う:

mask = A > 48 & A < 200; 
A(ind) = sqrt(A(ind)); 

+0

それは代わりに '&'の '' &&する必要がありますか。 – costrom

+3

@costrom No.少なくとも行列や配列ではありません。行列は短絡動作をサポートしていないので、 '&'を使用する必要があります。 **演算の連鎖内にあるすべての配列/行列の条件をチェックする必要があります**。 '&&'は通常、規約によってスカラーに適用され、 'A'はスカラーではありません。この記事を参照してください:http://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab ...そして、特にユーザーgnoviceのコメント:http://stackoverflow.com/questions/ 1379415/whats-the-difference-between-in-matlab#comment1218885_1379460 – rayryeng

+2

@costrom私は 'sqrt'関数を呼び出すことは、操作が特殊化されているために、 Matlabのパーサーは、その式に式を書きたくない、あるいは書けないようにすることはできません。私のシステムでは、 'sqrt'は約2倍高速です。 – TroyHaskin

関連する問題