我有列向量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命令来执行此操作,但无法弄清楚。
答案 0 :(得分: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
答案 1 :(得分:2)
您可以通过删除中间变量并稍微更改语法来进一步压缩逻辑索引解决方案。
B=B(~~A)
A=A(~~A)
删除中间变量(即nz=~~A
)的唯一可能的小缺点是,您必须记住在更改B
之前更改A
。通过将操作转换为单个命令可以取消这个缺陷 - 在评估表达式的右侧之前,不会将新值分配给变量。
[A,B] = deal(A(~~A),B(~~A))
Zen(如果你正在寻找最少量的命令字符),虽然我同意效率可能会受到影响(见评论)。
答案 2 :(得分: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
>
答案 3 :(得分:1)
另一种方法是删除A:
中的0元素A0=A==0;
A(A0)=[];
B(A0)=[];
Howerver as @RodyOldenhuis说,A(A0)=[]
比A=A(A0)
慢。因此,当涉及大循环或A的大小非常大时,应避免使用A(A0)=[]
。