MATLAB: I want to delete rows from a matrix but its giving me the error “Matrix index is out of range for deletion”

arraycell arraycell arraysdelete rowsdouble

percentage_consumo= Preos2013S1(:,6)/maxconsumo;
percentage_precos= Preos2013S1(:,21)/maxpreco;
b = cellfun(@(x)str2double(x), teste1);
b2=b;
for k=2:length(teste1)
if b(k)~= 0
percentage_consumo(k,:) = [];
percentage_precos(k,:) = [];
b2(k)=[];
end
end
i=0;
for k=2:length(Preos2013S1(:,6))
if b(k)~=0
i=i+1;
end
end
All this arrays of doubles have the same size (6266×1). Besides the error that I don't understand, b2 still has a lot of rows with numbers that are not 0. And since i=2447, b2 should be 3819×1; however, its 4503×1. Can somebody please help me?

Best Answer

Hi Eduardo,
One thing about deleting rows from an array while inside a for loop is that you have to account for rows that you've already deleted in previous iterations of the for loop.
For instance if you start iterating over an array with four rows, and in the first iteration you delete the first row, then when you get to the fourth iteration, there are at most three rows left. Hence if you try to delete the 'fourth' row, you are attempting to delete a non-existent row, and matlab will tell you that the "Matrix index is out of range for deletion".
A fairly easy solution to this is to iterate backwards over the array - i.e.
for k=length(teste1): -1: 2
if b(k)~= 0
percentage_consumo(k,:) = [];
percentage_precos(k,:) = [];
b2(k)=[];
end
end
This way you delete the end rows first, and you never try to access the rows where deletions are causing indexes to shift.
As for the second question - it would be helpful if you could provide more concrete examples.