0

我正在 Matlab 中编写一个简单的脚本,我在其中比较相邻元素并删除其中一个,如果它们之间的差异是一个。

for i=1:length(Vector) - 1
if Vector(i+1) - Vector(i) == 1
    Vector(i) = [];
end
 if i == length(Vector) 
    break
 end

结尾

但是,我收到一个错误,即我的索引超出范围。我不知道为什么,我的算法在我看来应该可以工作。是否有更简单的方法来使用内部函数来做到这一点?

4

3 回答 3

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)
于 2013-08-25T20:57:50.743 回答
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
于 2013-08-25T21:11:40.750 回答
0

我认为这

如果向量(i+1) - 向量(i) == 1

当你有一个大小为 1 的向量时可能是问题索引 i+1 不存在

于 2013-08-25T19:54:56.293 回答