I want to delete rows from a matrix but its giving me the error "Matrix index is out of range for deletion"
    8 visualizaciones (últimos 30 días)
  
       Mostrar comentarios más antiguos
    
    Eduardo Rocha
 el 22 de Nov. de 2016
  
    
    
    
    
    Respondida: Kaushik Godbole
 el 22 de Abr. de 2022
             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 (6266x1). 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 3819x1; however, its 4503x1. Can somebody please help me?
0 comentarios
Respuesta aceptada
  Matthew
      
 el 22 de Nov. de 2016
        
      Editada: Matthew
      
 el 22 de Nov. de 2016
  
      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.
Más respuestas (1)
  Kaushik Godbole
 el 22 de Abr. de 2022
        Hello Eduardo,
The method suggested by Mathew works. However for some reason if you are required to iterate forward and still delete rows/columns in a 'for' loop and you know those rows/cloumns with reference to the original unmodified matrix, then you need to include a counter which keeps track of how many rows have been deleted. The following code illustrates how to delete only the even rows of a matrix while iterating forward. You can modify it for any 'if' condition you want.
n = 10;
A = rand(n,n);
counter = 0; %% Declaring counter to be zero
for number = 1:n
    if rem(number,2) == 0
        A(number - counter,:) = []; %% Takes care of changing index numbers of the rows
        counter = counter + 1; %% Takes into account row deletion
    end
end
0 comentarios
Ver también
Categorías
				Más información sobre Matrix Indexing en Help Center y File Exchange.
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!