如何从另一个向量中删除一个向量的元素?

时间:2014-07-17 22:13:29

标签: matlab vector

我有一个双重值A,即

[1,4,7,6]

我也有B,这是一个包含更多值的数组。我有一个新的变量C,它实际上是所有这些数字的双精度值(所有数字都在一个单元格中,而不是五个)。

[1,4,7,6]
[2,6,9,12]
[3,1,17,13]
[5,7,13,19]
[1,5,9,15]

如何从C中删除元素(而不是实际值)?我想结束这个。

 [2,6,9,12,3,1,17,13,5,7,13,19,1,5,9,15]

我如何得到这个?我使用过这些命令:

C(A) = [];

C = C(setdiff(1:length(C),A));

问题在于,当我运行该命令时,我得到的不是我想要的。

[4,7,2,12,3,1,17,13,5,7,13,19,1,5,9,15]

显然,这与我所拥有的不一样。它抛弃了我的其他结果,我需要解决这个具体问题。

提前致谢:)

编辑:

所以我发现它正在以错误的顺序喷出正确的数字。我必须对它进行排序才能使其正常工作。这是一个问题,因为它会导致下一个命令无法正常运行,因为ismember命令存在删除问题(我不知道为什么,我还在处理它)。

1 个答案:

答案 0 :(得分:1)

双数组大小写

如果B是双数组,您可以setdiff使用'rows''stable'选项,如此 -

C = reshape(setdiff(B,A,'rows','stable').',1,[])

使用ismember,您可以执行相同的操作,如此 -

C = reshape(B(~ismember(B,A,'rows'),:).',1,[])

您也可以使用@Amro建议的bsxfun方法 -

C = reshape(B(~all(bsxfun(@eq, B, A),2),:).',1,[])

单元格数组大小写

如果B是一个单元格数组,每个单元格中的元素数量等于A中的元素数量,那么您可以先将其转换为双数组 - B = vertcat(B{:})并且然后使用上述任一工具。

或者您可以使用基于cellfun的方法来避免转换为双数组,如此 -

excl_rows = B(~cellfun(@(x1,x2) isequal(x1,x2), B, repmat({A},size(B,1),1)),:)
C = horzcat(excl_rows{:})

或其他基于cellfun的方法可以避免repmat -

exclB = B(~cellfun(@(x1) isequal(x1,A), B),:)
C = horzcat(exclB{:})

说明示例 -

%// Inputs
A = [1,4,7,6]
B = {[1,4,7,6]
    [2,6,9,12]
    [3,1,17,13]
    [5,7,13,19]
    [1,5,9,15]}

%// Compare each cell of B with A for equality.
%// The output must be a binary array where one would be for cells that have 
%// elements same as A and zero otherwise.
ind = cellfun(@(x1) isequal(x1,A), B) 

%// Thus, ~ind would be a binary array where one would reperesent unequal 
%// cells that are to be selected in B for the final output.
exclB = B(~ind)

%// exclB is still a cell array with the cells that are different from A.
%// So, concatenate the elements from exclB into a vector as requested.
C = horzcat(exclB{:})

输出 -

A =
     1     4     7     6
B = 
    [1x4 double]
    [1x4 double]
    [1x4 double]
    [1x4 double]
    [1x4 double]
ind =
     1
     0
     0
     0
     0
exclB = 
    [1x4 double]
    [1x4 double]
    [1x4 double]
    [1x4 double]
C =
     2     6     9    12     3     1    17    13     5     7    13    19     1     5     9    15