我正在Matlab中编写一个简单的脚本,我在其中比较相邻元素,如果它们之间存在差异,则删除其中一个元素。
for i=1:length(Vector) - 1
if Vector(i+1) - Vector(i) == 1
Vector(i) = [];
end
if i == length(Vector)
break
end
端
但是,我收到的错误是我的索引超出范围。我不知道为什么,我的算法似乎应该可行。使用内部函数可能有更简单的方法吗?
答案 0 :(得分:3)
问题是当你这样做时:
Vector(i) = []
您正在更改数组的大小,这将首先产生您不想要的结果,其次是代码中的if条件不会阻止脚本超出范围。解决这个问题的一种方法是使用辅助矢量。
Vector = [1,5,6,3,5,7,8,9];
tmp = [];
j = 1;
for i=1:length(Vector)-1
if Vector(i+1) - Vector(i) == 1
continue
end
tmp(j) = Vector(i);
j = j + 1;
end
tmp(end+1) = Vector(end);
Vector = tmp
请注意,我假设你总是希望保留最后一个元素。
如果你想避免for循环,你也可以这样做:
Vector = [1,5,6,3,5,7,8,9];
tmp = circshift(Vector, [0,-1]); %shifted version of Vector
tmp(end) = Vector(end)+2; %To ensure that the last element will be included
index = tmp-Vector ~= 1; %indices that satisfy the condition
Vector = Vector(index)
答案 1 :(得分:2)
pabaldenedo是正确的,问题是在迭代过程中删除元素。
更好的解决方案就是对搜索和删除进行矢量化:
mask = [diff(Vector) == 1, 0]; % find elements where the step is 1
Vector = Vector(~mask); % exclude them
这也应该快得多。
如果重复的元素比前一个元素大一个,则应该删除它,你可以重复它。不幸的是,MATLAB没有do-while循环。
mask = [diff(Vector) == 1, 0]; % find elements where the step is 1
while any(mask) % if we found elements to exclude
Vector = Vector(~mask); % exclude them
mask = [diff(Vector) == 1, 0]; % search again
end
答案 2 :(得分:0)
我想这个
当你有一个大小为1的向量时,如果Vector(i + 1) - Vector(i)== 1
可能是问题,索引i + 1不存在