列ベクトル 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 コマンドがあることは知っていますが、それを理解することはできません。
列ベクトル 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 コマンドがあることは知っていますが、それを理解することはできません。
最も迅速で簡単な方法は、論理インデックスを使用することです。
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
中間変数を削除し、構文を少し変更することで、論理インデックス ソリューションをさらに圧縮できます。
B=B(~~A)
A=A(~~A)
中間変数 (つまり ) を削除する際に考えられるわずかな落とし穴は、 を変更する前nz=~~A
に忘れずに変更する必要があることです。この落とし穴は、操作を単一のコマンドに変換することで解消できます。式の右側が評価されるまで、新しい値は変数に割り当てられません。B
A
[A,B] = deal(A(~~A),B(~~A))
Zen (最小量のコマンド文字を探している場合)、効率が低下する可能性があることに同意します (コメントを参照)。
次のように実行できます。
> 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
>
もう 1 つの方法は、A の 0 要素を削除することです。
A0=A==0;
A(A0)=[];
B(A0)=[];
ただし、@RodyOldenhuisが言ったように、A(A0)=[]
より遅いですA=A(A0)
。そのため、大きなループが含まれる場合、または A のサイズが非常に大きい場合A(A0)=[]
は、使用を避ける必要があります。