matlab 删除行或列时出现:矩阵索引超出删除范围 问题的解决和新思路

删除某些行或者某些列

有时候我们需要将读取的.xlsx文件中的某些列或者某些行进行删除,比如存在以下的数据,需要删除第一列相同的前i-1行元素,如下面的第3行。matlab 删除行或列时出现:矩阵索引超出删除范围  问题的解决和新思路

原程序

A=xlsread('shunxu_data.xlsx');
K = A(:,1);
num = length(A)
for i = 1:num-1
   if K(i) == K(i+1) 
       A(i,:) = [];
   end
end
xlswrite('new.xlsx',A,'A:G');

但是这样处理的话会报错:
matlab 删除行或列时出现:矩阵索引超出删除范围  问题的解决和新思路
但是显示A(i,:)的话并无任何问题。

经过反复研究,得到问题的原因是:每循环一次,就会删除了一行,这样新的i与原来的i就不一样,也就是存在多组需要删除的数据的话,A(i,:) = [];会导致需要索引的i>仅存的长度。
比如:共有100行,需要删行i=71的数据,在删除了第30行之后,总的数据就只有70行,要删除71行的数据,就无法索引,即“矩阵索引超出删除范围”。

解决方法1

可以设定一个新的矩阵,将符合要求的数据写入新的矩阵,既避免了删除数据的问题,而且写操作也快与删操作。

解决方法2

为了防止在删除i遍历时与i有关的数据会出现的问题,我们可以统一操作,将需要删除的数据全部改写为新数据,比如[1 1 1 1 1 1],这样删除[1 1 1 1 1 1]的数据就不会收到变量i 的影响,就不会存在超出索引范围的问题。

最后的程序

A=xlsread('shunxu_data.xlsx');
K = A(:,1);
num = length(A)
t=1;
for i = 1:num-1
   if K(i) == K(i+1) %直接删除会导致A(i,:)会超出索引范围
       A(i,:) = [1 1 1 1 1 1 1];
   end
   if A(i,:) ~= [1 1 1 1 1 1 1]
        data(t,:)=A(i,:)
        t = t+1;
   end   
end
xlswrite('newRGB50_200.xlsx',data);
上一篇:matlab数据处理-mat\scope\xlsx\txt格式(电机控制类)


下一篇:从零学习node爬虫