在Matlab中更快地减少向量中的一些项目



我正在寻找一种更快的方法来减少Matlab中向量中某些数字的值,例如我有这个向量:

向量a=[1 21 35 44 45 67 77 83 93 100]

然后我要删除元素35,45,77,所以:

RemoveVector b =(3、5、7)RemoveElements c =[35岁,45岁,77]

删除元素后,应该是:

Vector=[1 21 43 65 80 90 97]

请注意,除了删除元素外,所有下一个元素在1中减少它们的值,我在Matlab中编写了以下代码:

a(:,b) = [];
b = fliplr(b);
for i=1:size(a,2)
    for j=1:size(c,2)
        if(a(1,i)>=c(1,j))
            a(1,i) = a(1,i) -1;
        end
    end
end

但是太慢了,m0=2.8*10^-3秒,有没有更快的算法?

@Geoff有一个很好的整体方法,但调整可以在O(n)而不是O(n*k)中完成:

adjustment = zeros(size(a));
adjustment(b(:)) = 1;
a = a - cumsum(adjustment);
a(b(:)) = [];

我认为在从a中删除索引在b中给出的元素之前,代码可以先执行所有递减

% copy a
c = a;
% iterate over each index in b
for k=1:length(b)
    % for all elements in c that follow the index in b (so b(k)+1…end)
    % subtract one
    c(b(k)+1:end) = c(b(k)+1:end) - 1;
end
% now remove the elements that correspond to the indices in b
c(b) = [];

试试上面的方法,看看会发生什么!

非常感谢Geoff和Ben的回答,我已经用这种方法证明了这两个答案:

tic
a=[1 21 35 44 45 67 77 83 93 100];
b=[3 5 7];
%Code by Geoff
c = a;
for k=1:length(b)
    % for all elements in c that follow the index in b (so b(k)+1…end)
    % subtract one
    c(b(k)+1:end) = c(b(k)+1:end) - 1;
end
c(b) = [];
m1 = toc;

tic
a=[1 21 35 44 45 67 77 83 93 100];
b=[3 5 7];
%Code by Ben
adjustment = zeros(size(a));
adjustment(b(:)) = 1;
a = a - cumsum(adjustment);
a(b(:)) = [];
m2 = toc;

在我的机器中的结果是m1=1.2648*10^-4秒和m2=7.426*10^-5秒,第二个代码更快,我的第一个代码给出m0 = 2.8*10^-3秒。

相关内容

最新更新