2017-03-01 2 views
0

私は1000x1000の行列A(0から150の値を含む)と181x1のベクトルBを持っています。私の行列Aでは、同じサイズのAを保ちながらBにある値だけを残したいと思います。 関数ismemberを試しましたが、期待した結果が得られません。だから私は、私は、コード関数の交点で行列の寸法誤差を回避するにはどうすればよいですか?

A=A.*intersect(A,B,'stable'); 

として何をすべきかですここで、他の機能 を試してみました。しかし、私はどうやって問題を解決するため、このエラー

Error using .* 
Matrix dimensions must agree. 

を行うことができますか?

+0

BにないAの要素の値はどうなるべきですか?ゼロは大丈夫ですか? –

+0

はい今のところ私はゼロになるという事実を残します –

答えて

2

次のように必要なのは、このタスクのためのismemberです:

A = A.*ismember(A,B); 
% ismember(A,B) gives the logical matrix containing 1's for the indexes whose values 
% are present in `B` and 0's for all other indexes. When this logical matrix is 
% element-wise multiplied with A, all the indexes of A whose elements are not in B 
% become zero 

あなたのコードが動作しないのはなぜ? intersect(A, B, 'stable')で、あなたは(おそらく)Aの要素の数に等しい(非常に少ないおそらく)以下を含む列ベクトルを取得しているためだ

。等しい場合でも、Aは列ベクトルではないため、要素単位でAを掛けると同じエラーが発生します。要素ごとの乗算では、両方の行列の順序が同じである必要があります。これは、行列の各要素に他の行列の対応する要素を掛けることができるためです。

ismemberで上に示したコードは、コメントですでに説明した通りです。

+1

答えを受け入れる:) –

1

2つの行列ABを乱数で作成します。 Cは、ABの両方の値を持つ配列で、ismemberを使用して、Aの値を選択して保持することができます。

A = randi([0 150], 1000, 1000); 
B = randi([0 150], 181, 1); 
C = intersect(A, B, 'stable'); 
A(~ismember(A, C)) = 0; 
関連する問題