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)的唯一可能的轻微缺陷是您必须记住在更改B之前更改A。可以通过将操作转换为单个命令来消除这个陷阱——在计算表达式的右侧之前,不会将新值分配给变量。

[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

另一种选择是删除 A 中的 0 元素:

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

但是正如@RodyOldenhuis 所说,A(A0)=[]它比A=A(A0). 所以,当涉及到大循环,或者A的大小非常大时,A(A0)=[]应该避免使用。

于 2012-09-13T18:03:56.230 回答