Why can't the index variable of a for loop be stored in a structure or other array?

12 vues (au cours des 30 derniers jours)
Daw-An Wu
Daw-An Wu le 23 Mar 2023
Commenté : Stephen23 le 26 Mar 2023
status.loop1 = 0;
for status.loop1 = 1:10
%do something
end
returns the error "Invalid use of operator." pointing to the dot.
Similarly,
status = [0 0 0];
for status(1) = 1:10
%do something
end
returns "Invalid expression. When calling a function or indexing a variable, use parentheses. Otherwise, check for mismatched delimiters."
Same for cell array.
Why?
More broadly, is there some way to store index variables together? (to keep workspace neat, have access to all status variables in one place, etc)

Réponses (3)

Stephen23
Stephen23 le 23 Mar 2023
Déplacé(e) : Matt J le 23 Mar 2023
"More broadly, is there some way to store index variables together?"
status.loop1 = 1:10;
for k = status.loop1
%do something
end
  1 commentaire
Daw-An Wu
Daw-An Wu le 23 Mar 2023
Hi, I am looking to have "k" bundled up in a structure, or something else. In code with a lot of loops, this avoids a mess of variables in the workspace, and makes it more convenient to pass all those states into a function, or to check how far each loop has gotten - after an error etc.

Connectez-vous pour commenter.


Fangjun Jiang
Fangjun Jiang le 23 Mar 2023
Modifié(e) : Fangjun Jiang le 23 Mar 2023
There is no mention of any requirement on the name of the index varialbe, here in the document for "for",
My explaination is this:
for index = values
statements
end
"index" needs to be a valid variable name, but "status.loop1" or "status(1)" is not a valid variable name.
You could do things like this:
status=[ 0 1 -1];
for k=status
disp(k);
end
0 1 -1
  3 commentaires
Fangjun Jiang
Fangjun Jiang le 24 Mar 2023
  1. It might be a matter of preference. Inside the loop, likely you will need to reference the index variable many times, do you prefer MyData(index), or MyData(mystruct.status.loop1), or MyData(status(1))?
  2. It might be a matter of necessity. status=[0 0 0] can be stored and used as the values to go through the loop, but you still need a "counter" or "pointer" to know what is the current loop thus the next loop. Otherwise, how do you know when to finish the loop or which "0" in status=[0 0 0] are you looping at now? The index variable "k" only has one element, not the copy of status=[0 0 0].
Steven Lord
Steven Lord le 24 Mar 2023
status = struct('index', {1, 2, 3})
status = 1×3 struct array with fields:
index
If that syntax worked, what would you expect this code segment to do? What would the variable status be after it executed? Be specific.
% for status.loop = 4:6
% disp(sum([status.loop])
% end
Note that if I write the expression:
status.index
ans = 1
ans = 2
ans = 3
I get three outputs from this comma-separated list.

Connectez-vous pour commenter.


John D'Errico
John D'Errico le 23 Mar 2023
Surely this is not a big problem?
for ind = 1:10
status.ind = ind;
% do Stuff
end
  2 commentaires
Daw-An Wu
Daw-An Wu le 26 Mar 2023
Yes, that handles the access problem. The main question is still why this is necessary at all.

Connectez-vous pour commenter.

Catégories

En savoir plus sur Loops and Conditional Statements 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