在MATLAB中选择或消除矢量数组中的索引

时间:2016-12-10 15:50:39

标签: matlab

我正在编写代码,我想检查一个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  

但是它不起作用并且它给出了错误,所以我可以知道该怎么做吗?

2 个答案:

答案 0 :(得分:0)

问题很可能是因为您正在循环中从j中删除元素,然后尝试访问这些元素。您应该只有jNaN个值,然后删除最后的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) = [];