2016-11-28 8 views
8

私はこの行列を持っている:検索の奇妙な行動()

a = [1 2 2 1; 1 1 2 2] 

% 1  2  2  1 
% 1  1  2  2 

私はすべて1ののを見つけて、ゼロにそれらを載せていきたいと思います。

[~, a_i] = find(a == 1); 
a(a_i) = 0 

% 0  2  2  1 
% 0  0  2  2 

なぜ、最初の行にまだ1がありますか?あなただけfindの第二の出力を使用しているので、

+4

を使用する質問が面白いです、と非常に良い答えを得ました。しかし、タイトルをfind()_の奇妙な振る舞いに変更することをお勧めします。現在のタイトル(_find()が動作していない)を見たときの私の最初の考えは "もちろんです" –

答えて

7

あなたはそれをやっている方法、あなただけの列のインデックス1年代のを得ています。

[~, col] = find(a == 1) 
% 1 1 2 4 

あなたはaへのインデックスとしてこれを使用する場合には、線形インデックスとしてこれらを治療し、0にのみ第一、第二、およびaで4番目の値を変更することが起こっています。リニアインデックスはcolumn-major orderで実行されます。これにより、表示されている出力が得られます。あなたが何をしようとして行うには

、あなたは、行と列のインデックスを取得し、あなたがaへのインデックスに使用することができ、線形インデックスにこれらを変換するsub2indを使用するfind両方の出力を必要とします。

[row, col] = find(a == 1); 
a(sub2ind(size(a), row, col)) = 0; 

これは単に直接線形インデックスを返し、それを使用findの単一出力バージョンを使用するように非常に簡単です。

ind = find(a == 1); 
a(ind) = 0; 

いっそ、単に論理的インデックスに

a(a == 1) = 0; 
+0

ありがとう!私は今、私のエラーを理解しています! :) – henry