我正在编写代码,我想检查一个vector array
元素并检查当前元素是否等于前一个x(m)=x(m+1)
,然后将其删除,如果没有将其保留在数组中...怎么做?
在这里,我试图做的事情:
vg=vg1(441777:448207);
j=zeros(size(vg));
for m=1:6431;
if m+1<6432
if vg(m)==vg(m+1)
j(m)=[];
else
j(m)=vg(m);
end
end
end
但是它不起作用并且它给出了错误,所以我可以知道该怎么做吗?
答案 0 :(得分:0)
问题很可能是因为您正在循环中从j
中删除元素,然后尝试访问这些元素。您应该只有j
个NaN
个值,然后删除最后的NaN
值。
j = nan(size(vg));
% Go ahead and keep the first value
j(1) = vg(1);
% Just start at 2 and look backwards rather than using an if statement
% every time through the loop
for m = 2:numel(vg)
% Only change the value in j to a number if it's new
if vg(m - 1) ~= vg(m)
j(m) = vg(m);
end
end
% Remove all of the NaN values (the duplicates)
j = j(~isnan(j));
更好的矢量化方法是使用diff
计算连续元素之间的差异,并确定不同数字的位置(diff
结果为~= 0
)并仅保留这些元素使用diff(values) ~= 0
的输出作为values
的逻辑索引。
values = [1 1 2 3 4 4 4 5 5 1 2 2];
result = values([true, diff(values) ~= 0]);
% 1 2 3 4 5 1 2
请注意,我们必须将true
添加到diff(values) ~= 0
输出的开头,因为我们希望始终包含第一个元素。
答案 1 :(得分:0)
上面的代码不起作用,因为矢量j的长度在循环内发生变化。因此,在某个步长m大于长度(j),这会增加误差。
此外,matlab中的for循环非常慢,因此矩阵形式计算更可取(并且更清晰)。
vg = [1 1 2 3 4 4 4 5 5 1 2 2];
df = [1 diff(vg)];
vg(df == 0) = [];