3

列ベクトル A と B があります。

A'= [1 2 0 0 1 4]
B'= [1 2 3 4 5 6]

A のゼロを除外し、B の対応する要素を削除して、次のようにします。

A' = [1 2 1 4] 
B' = [1 2 5 6]

これを行うための簡単な MATLAB コマンドがあることは知っていますが、それを理解することはできません。

4

4 に答える 4

5

最も迅速で簡単な方法は、論理インデックスを使用することです。

A = [1 2 0 0 1 4].';
B = [1 2 3 4 5 6].';

nz = (A ~= 0); %# logical matrix for non-zeros in A

A = A(nz)      %# non-zeros of A
B = B(nz)      %# corresponding elements in B

別の方法は、少し遅いです

nz = find(A); %# vector of linear indices to non-zero elements

A = A(nz)     %# non-zeros of A
B = B(nz)     %# corresponding elements in B
于 2012-09-13T17:25:08.323 に答える
2

中間変数を削除し、構文を少し変更することで、論理インデックス ソリューションをさらに圧縮できます。

B=B(~~A)
A=A(~~A)

中間変数 (つまり ) を削除する際に考えられるわずかな落とし穴は、 を変更する前nz=~~Aに忘れずに変更する必要があることです。この落とし穴は、操作を単一のコマンドに変換することで解消できます。式の右側が評価されるまで、新しい値は変数に割り当てられません。BA

[A,B] = deal(A(~~A),B(~~A))

Zen (最小量のコマンド文字を探している場合)、効率が低下する可能性があることに同意します (コメントを参照)。

于 2012-09-13T17:51:37.200 に答える
1

次のように実行できます。

> A = [1 2 0 0 1 4]
A =

   1   2   0   0   1   4

> B = [1 2 3 4 5 6]
B =

   1   2   3   4   5   6

> V = find(A~=0)        % get the indices for which A <> 0 
V =

   1   2   5   6

> A = A(V)              % select elements from A
A =

   1   2   1   4

> B = B(V)              % select elements from B
B =

   1   2   5   6

> 
于 2012-09-13T16:10:09.380 に答える
1

もう 1 つの方法は、A の 0 要素を削除することです。

A0=A==0;
A(A0)=[]; 
B(A0)=[];

ただし、@RodyOldenhuisが言ったように、A(A0)=[]より遅いですA=A(A0)。そのため、大きなループが含まれる場合、または A のサイズが非常に大きい場合A(A0)=[]は、使用を避ける必要があります。

于 2012-09-13T18:03:56.230 に答える