我正在寻找一种更快的方法来减少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秒。