Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 从数组中删除元素 问题:_Arrays_Matlab_Indexing_Elements_Indices - Fatal编程技术网

Arrays 从数组中删除元素 问题:

Arrays 从数组中删除元素 问题:,arrays,matlab,indexing,elements,indices,Arrays,Matlab,Indexing,Elements,Indices,我有两个数组A和B: 我想将A的第一个元素与B的前3个元素进行比较,将A的第二个元素与B的下4个元素进行比较。如果A的元素相等,我将其从B中删除。因此在示例中: if (A(1) == B(1:3)) remove A(1) from B 同样地 我想将A2与B的下4个元素进行比较,即B4:7: 我想将A3与B的下5个元素进行比较,即与B8:12进行比较 我想将A4与B的下6个元素进行比较,即B13:18 注:数组权重_B确定了B中应分别与A1、A2、…、进行比较的元素数量,A4 因此,

我有两个数组A和B:

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

 if (A(1) == B(1:3))
 remove A(1) from B 
同样地

我想将A2与B的下4个元素进行比较,即B4:7:

我想将A3与B的下5个元素进行比较,即与B8:12进行比较

我想将A4与B的下6个元素进行比较,即B13:18

注:数组权重_B确定了B中应分别与A1、A2、…、进行比较的元素数量,A4

因此,B最终应具备以下要素:

  B = [1, 3, 9, 4, 6, 5, 9, 10, 11, 8, 1, 5, 9, 10]; 
所需解决方案:
有没有办法不用硬编码索引就可以做到这一点?

因为要将A的元素分别与B的前3个和4个元素进行比较,就需要包含索引。
   A = [0, 1]; 
   B = [0, 1, 3, 1, 4, 5, 6]; 
   % Split B into cells 
   C{1} = B(1:3) ;    % this can be coded if more splits are required 
   C{2} = B(4:end) ;
   % removing the lements 
   for i = 1:2
       C{i}(C{i}==A(i))=[] ;  % remove the elements in C{i} present in A(i)
   end
   cell2mat(C)
您可以简单地使用loop

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的更新大小。

因为要将A的元素分别与B的前3个和4个元素进行比较,所以需要包含索引。 您可以简单地使用loop

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的更新大小。

试试这个

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
试试这个

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

这里有一种不用硬编码的方法:

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

这里有一种不用硬编码的方法:

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

为了多样性,这里有一种方法可以使用:

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


此解决方案需要R2015b。

为了实现多样性,这里有一种方法可以使用:

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



此解决方案需要R2015b。

编辑:在else语句中,使用[1]这不是Matlab代码。此外,问题特别指出,无需硬编码指示符号,请尊重问题附带的语言标记。编辑:在else语句中,使用[1]这不是MATLAB代码。此外,问题特别指出,无需硬编码指示符号,请尊重问题附带的语言标记。问题被标记为MATLAB。如果A=[0,1,2]和B=[0,1,3,1,4,5,6,2,3,9,11];现在我还要比较A中的2和B中的2,3,9,11,答案应该是B=[1,3,4,5,6,3,9,11];你能做到这一点而不必手动输入索引吗?这并不能真正回答问题。这个问题明确地说,如果A=[0,1,2]和B=[0,1,3,1,4,5,6,2,3,9,11],那么不必硬编码指示符号会发生什么;现在我还要比较A中的2和B中的2,3,9,11,答案应该是B=[1,3,4,5,6,3,9,11];你能做到这一点而不必手动输入索引吗?这并不能真正回答问题。问题明确地说,不必硬编码指示,我只需阅读您对湿婆答案的评论。是否有规则,a的哪个元素应该与B的哪个范围进行比较?为什么在比较A2和A3的A1和4个元素时,你会选择B的3个元素?@Anton我将重新措辞这个问题,让它更清楚。等等,我有一个答案idea@Anton我用所需的规则更改了描述。希望你更清楚。非常感谢你!我发布了一个新版本。请试试看,我刚刚读了你对湿婆回答的评论。是否有规则,a的哪个元素应该与B的哪个范围进行比较?为什么在比较A2和A3的A1和4个元素时,你会选择B的3个元素?@Anton我将重新措辞这个问题,让它更清楚。等等,我有一个答案idea@Anton我用所需的规则更改了描述。希望你更清楚。非常感谢你!我发布了一个新版本。试一试如果A=[0,1,2]和B=[0,1,3,1,4,5,6,2,3,9,11];现在我还要比较A中的2和B中的2,3,9,11,答案应该是B=[1,3,4,5,6,3,9,11];你能做到这一点而不必手动输入索引吗?请阅读我对这个问题的评论。我们需要一个规则,它描述a中的元素和B中的范围之间的映射。这并不能真正回答这个问题。这个问题明确地说,如果A=[0,1,2]和B=[0,1,3,1,4,5,6,2,3,9,11],那么不必硬编码指示符号会发生什么;现在我还要比较A中的2和B中的2,3,9,11,答案应该是B=[1,3,4,5,6,3,9,11];你能做到这一点而不必手动输入索引吗?请阅读我对这个问题的评论。我们需要一个规则,它描述a中的元素和B中的范围之间的映射。这并不能真正回答这个问题。问题明确地说,无需硬编码指示感谢您的回答!我选择你的答案是因为当我使用非常大的矩阵时,它是计算问题最快的。谢谢你的答案!我选择你的答案是因为当我使用非常大的矩阵时,它是计算问题最快的。
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
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