从数组中删除元素

时间:2018-06-22 06:51:30

标签: arrays matlab indexing elements indices

问题:

我有两个数组AB

A = [0, 1, 2, 3]; %A will always be from 0 to N where N in this case is 3.

B = [0, 1, 3,   1, 9, 4, 6,    2, 5, 9, 10, 11,   3, 8, 1, 5, 9, 10]; 

weights_B = [3, 4, 5, 6]; 

我想比较A的第一个元素和3的第一个B元素,以及A的第二个元素和下一个4的元素B中的。如果A的元素相等,则将其从B中删除。因此,在示例中:

 if (A(1) == B(1:3))
 remove A(1) from B 

类似地,

我想将A(2)4的下一个B元素进行比较,即与B(4:7)进行比较:

if (A(2) == B(4:7))
remove A(2) from B 

我想将A(3)5的下一个B元素进行比较,即与B(8:12)

if (A(3) == B(8:12))
remove A(3) from B 

我想将A(4)6的下一个B元素进行比较,即与B(13:18)

if (A(4) == B(13:18))
remove A(4) from B 

注意:数组weights_B确定B中应分别与A(1), A(2), .. , A(4)比较的元素数

因此,B最后应包含以下元素:

  B = [1, 3, 9, 4, 6, 5, 9, 10, 11, 8, 1, 5, 9, 10]; 

所需的解决方案:

有什么方法可以做到而不必对索引进行硬编码?

5 个答案:

答案 0 :(得分:4)

这是一种无需硬编码的方法:

Bw = mat2cell(B, 1, weights_B); % split into chunks
result = cell(size(Bw)); % initiallize result
for k = 1: numel(A)
    result{k} = Bw{k}(Bw{k}~=A(k)); % fill each chunk of the result
end
result = [result{:}]; % concatenate into a row vector

答案 1 :(得分:4)

出于多样性的考虑,以下是使用splitapply进行此操作的方法:

function out = q50982235
A = 0:3;
B = [0, 1, 3,   1, 9, 4, 6,    2, 5, 9, 10, 11,   3, 8, 1, 5, 9, 10]; 
weights_B = [3, 4, 5, 6];

a_ind = 0; % acts as a "global" variable for the inner function

G = repelem( 1:numel(weights_B), weights_B ); % this creates a vector of groups
out = cell2mat( splitapply(@movdif, B, G) );

function out = movdif(B)
  a_ind = a_ind + 1;
  out = {B(B ~= A(a_ind))};
end

end

以上方法之所以有效,是因为处理组的顺序是可预测的。

此解决方案需要R2015b。

答案 2 :(得分:2)

尝试一下

A = [0, 1, 2, 3]; 
B = [0, 1, 3,   1, 9, 4, 6,    2, 5, 9, 10, 11,   3, 8, 1, 5, 9, 10]; 

weights_B = A + A(end);

border_0 = zeros(size(A));
border_1 = zeros(size(A));

border_0(1) = 1;
border_1(end) = length(B);

for i= 2:length(A)
    border_0(i) = border_0(i-1) + weights_B(i-1);
    border_1(i-1) = border_0(i)-1;
end

C = [];
for i= 1:length(border_0)
    shift = 0;
    if (i > 1)
        shift = border_1(i-1);
    end

    C = [C  B(    find(B(border_0(i):border_1(i))~=A(i)) + shift     )]
end

答案 3 :(得分:-2)

foo

答案 4 :(得分:-4)

由于您要比较A的元素与B的前3个元素,然后比较4个元素,因此需要包含索引。 您可以简单地使用循环。

for(int i=0;i<B.length;i++){
 if((A[0]==B[i])&&i<3){
 B[i]=B[i+1];
 }
 else if((A[0]==B[i])&&i>3){}
  B[i]=B[i+1];
 }

然后调整数组B的更新大小。