Why I receive an error when my code is in function but not when he's in editor ?
2 ビュー (過去 30 日間)
古いコメントを表示
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 件のコメント
Stephen23
2024 年 1 月 24 日
編集済み: Stephen23
2024 年 1 月 24 日
"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.
採用された回答
Bruno Luong
2024 年 1 月 24 日
編集済み: Bruno Luong
2024 年 1 月 24 日
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 件のコメント
その他の回答 (1 件)
Bruno Luong
2024 年 1 月 24 日
編集済み: Bruno Luong
2024 年 1 月 24 日
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 件のコメント
参考
カテゴリ
Help Center および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!