2013-08-25 222 views
0

我正在写在Matlab一个简单的脚本,其中我比较相邻元件和删除其中之一是否有它们之间的差别是一个。在阵列中删除元素,索引超出范围(Matlab的)

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

不过,我发现了一个错误,我的指标是出界。我不知道为什么,我的算法似乎应该工作。有没有更简单的方法来使用内部函数来做到这一点?

回答

3

的问题是,当你这样做:

Vector(i) = [] 

你改变哟大小UR阵列,并且将首先产生一个结果,你是不是在找和第二代码后面的,如果条件不阻止脚本去出界。解决这个问题的一种方法是使用辅助矢量。

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 

请注意,我假设你总是想保留最后一个元素。

如果你想避免循环,你也可以这样做:

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) 
0

我觉得这

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

,当你有大小1索引i的载体可能是问题+ 1不存在

+0

,我认为你是对的。也许有是不是以这种方式 – l3win

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 
+0

为什么你必须包括在第一线的矢量零比较元素这样做的更好的办法?掩模= [DIFF(向量)== 1,0] – l3win

+0

没关系,得到它,THX – l3win