Why I receive an error when my code is in function but not when he's in editor ?
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Pi_etudiant
el 24 de En. de 2024
Comentada: Walter Roberson
el 26 de En. de 2024
I want to decrease my size of code, i created different function for this. But I receive a problem in one function.
This is my code and it's works when it's in editor of matlab :
for i = 1:size(Z(j).ContractionsExt_Interp,1)
pat = "visible";
NumContraction(i) = contains(visibilite(i),pat);
if NumContraction(i) == 0
Z(j).ContractionsExt_Interp_Select(i,:) = [];
else
end
end
But if I put him in my function i receive this error message: "Matrix index is out of range for deletion." for the ligne of deletion Z(j).ContractionsExt_Interp_Select(i,:) = [];
I don't understand why and how fix it. Somebody can help ?
4 comentarios
Stephen23
el 24 de En. de 2024
Editada: Stephen23
el 24 de En. de 2024
"I don't understand why ..."
The problem is very simple: you are trying to access elements of an array that do not exist.
Lets consider this simple example vector with 4 elements:
V = 1:4
Now lets do exactly what a FOR loop would do looking at each element from 1...4:
V(1)
V(2)
Lets randomly remove the 2nd element:
V(2)=[]
Question: how many elements does the vector have now? While you consider that, lets continue with the FOR loop:
V(3)
V(4)
Does the vector have 4 elements? (hint: no). We get an error when we try to access an element that does not exist.
"... and how fix it."
Loop over the array in reverse.
Respuesta aceptada
Bruno Luong
el 24 de En. de 2024
Editada: Bruno Luong
el 24 de En. de 2024
Loop in reverse would fix the issue (cross interaction between deletion that makes array strinks and loop index)
for i = size(Z(j).ContractionsExt_Interp,1):-1:1 % change here
pat = "visible";
NumContraction(i) = contains(visibilite(i),pat);
if NumContraction(i) == 0
Z(j).ContractionsExt_Interp_Select(i,:) = [];
else
end
end
1 comentario
Más respuestas (1)
Bruno Luong
el 24 de En. de 2024
Editada: Bruno Luong
el 24 de En. de 2024
You could consider to vectorize the test instead of using for loop and the side effect when deleting array element(s). I don't know your data class and organization, but it could go something like this;
NumContraction = contains({ visibility }, pat);
Z(j).ContractionsExt_Interp_Select(NumContraction & NumContraction(:)'==0) = [];
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!