Effacer les filtres
Effacer les filtres

Error in for loop: Index exceeds matrix dimensions.

37 vues (au cours des 30 derniers jours)
Me
Me le 1 Août 2024 à 13:09
Modifié(e) : VBBV le 1 Août 2024 à 14:47
Hi everyone! I need help with my code.I have a matrix (300x300) with some equal rows, and I need to eliminate the duplicate rows. I can't solve the error. Can anyone help me??Thank you very much!
Below I copy the part of the code with the error and a simplified example.
clear all
matrix_f=[1 2 3; 1 2 3; 4 5 6; 7 8 9; 7 8 9; 10 11 12];
for k=1:length(matrix_f(:,1))
if matrix_f(k,1)==matrix_f(k+1,1)
matrix_f(k+1,:)=[];
end
end
  1 commentaire
VBBV
VBBV le 1 Août 2024 à 14:46
Modifié(e) : VBBV le 1 Août 2024 à 14:47
@Me, you need to give the column dimension for the matrix in the for loop and use size function instead of length
clear all
matrix_f=[1 2 3; 1 2 3; 4 5 6; 7 8 9; 7 8 9; 10 11 12];
for k=1:size(matrix_f,2) % give the column dimension here
if isequal(matrix_f(k,:),matrix_f(k+1,:)) % use isequal function for check
matrix_f(k,:)=[]; % delete duplicate rows of numbers
end
end
matrix_f % result
matrix_f = 4x3
1 2 3 4 5 6 7 8 9 10 11 12
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>

Connectez-vous pour commenter.

Réponse acceptée

Aquatris
Aquatris le 1 Août 2024 à 14:08
Modifié(e) : Aquatris le 1 Août 2024 à 14:09
You have essentially made two mistakes:
  1. matrix_f only has 6 rows. You setup up your for loop such that k is 1 2 3 4 5 6 . When k is 6, you are trying to reach the 7th row of matrix_f, which does not exist. So your for loop should iterate from 1 to [length(matrix_f(:,1)-1].
  2. Within the for loop you change the size of matrix_f by removing rows. If you want to do this type of manipulation, you should just store the index you want to remove and remove the rows once your for loop is done. Otherwise indexing becomes messed up and you will run into the same issue, trying to reach a row that does not exist.
  3. You only remove rows that are next to each other.
Of course vectorizing the code is always better as in @Torsten answer.
clear all
matrix_f=[1 2 3; 1 2 3; 4 5 6; 7 8 9; 7 8 9; 10 11 12];
idx2remove = [];
for k=1:(length(matrix_f(:,1))-1)
if matrix_f(k,1)==matrix_f(k+1,1)
idx2remove = [idx2remove;k];
end
end
matrix_f(idx2remove,:) = [];
matrix_f
matrix_f = 4x3
1 2 3 4 5 6 7 8 9 10 11 12
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
  1 commentaire
Me
Me le 1 Août 2024 à 14:17
Thank you very much!

Connectez-vous pour commenter.

Plus de réponses (1)

Torsten
Torsten le 1 Août 2024 à 13:20
Modifié(e) : Torsten le 1 Août 2024 à 13:22
matrix_f=[1 2 3; 1 2 3; 4 5 6; 7 8 9; 7 8 9; 10 11 12];
unique(matrix_f,'stable','rows')
ans = 4x3
1 2 3 4 5 6 7 8 9 10 11 12
<mw-icon class=""></mw-icon>
<mw-icon class=""></mw-icon>
Note that this code will remove all duplicate rows in the matrix, not only subsequent ones.
  1 commentaire
Me
Me le 1 Août 2024 à 14:16
Many thanks to you too!

Connectez-vous pour commenter.

Catégories

En savoir plus sur Matrix Indexing dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by