{} and () brackets - creating array in for loop

15 vues (au cours des 30 derniers jours)
Gennaro Arguzzi
Gennaro Arguzzi le 27 Juin 2017
Commenté : Jan le 29 Juin 2017
Hi everyone. I read the following answer on stack exchange:
Why this code work:
t=[0:0.01:5];
a=[0:1:5];
n=length(a);
for i=1:n
plot(t,t.^a(i));
M(i)=getframe(gcf);
end
while this does not work:
t=[0:0.1:10];
for i=1:5
plot(t,t.^i)
f=getframe(gcf);
immagine(i)=frame2im(f);
end
but immagine{i}=frame2im(f); works?
I don't understand how use () and {}. In M(i) the () brackets work, while in immagine(i) don't work.
Thank you very much for your help.
  1 commentaire
Jan
Jan le 27 Juin 2017
"Works" and "doesn't work" are lean descriptions. Post the error message instead. Note that it contains important information.

Connectez-vous pour commenter.

Réponses (1)

Jan
Jan le 27 Juin 2017
It depends on how the variable is defined before the loop:
clear('M'); % Now M is not defined and the first access determines the type
t = 0:0.01:5;
a = 0:1:5;
for i = 1:length(a)
plot(t,t.^a(i));
M(i) = getframe(gcf);
end
You could initialize M by this also:
M = {};
Then the assignment M(i) must fail, but M{i} is correct. Cell arrays are indexed using curly braces, all other arrays use round parenthesis.
If immagine(i) fails, it is immagine was a cell array before. Then:
immagine{i} = frame2im(f);
or
immagine(i) = {frame2im(f)};
works, whereby the first is more efficient: The latter creates a scalar cell array and assigns it.
Please read the documentation about cells: doc cell The Getting Started chapters of the documentation are very useful also.
  6 commentaires
Gennaro Arguzzi
Gennaro Arguzzi le 28 Juin 2017
In the case of:
M(i) = getframe(gcf);
why does the code work?
clear all
close all
t=[0:0.01:5];
a=[0:1:5];
n=length(a);
for i=1:n
plot(t,t.^a(i));
M(i)=getframe(gcf);
end
Maybe this behaviour is related to the natur of the output of getframe and frame2im? In the right case, why?
Jan
Jan le 29 Juin 2017
While
immagine(i)=frame2im(f)
tries to assign an array to a scalar,
M(i)=getframe(gcf)
assigns a scalar struct to a scalar. Try this:
clear('A', 'B', 'C')
A(1) = 15 % Now A is a double
tmp.CData = rand(640, 480, 3);
tmp.Map = [];
B(1) = tmp; % Now B is a struct
C(1) = [15, 16] % Error: cannot assign vector to scalar
Clear now?
Again: It is a good programming practice to avoid unnecessary square brackets.

Connectez-vous pour commenter.

Community Treasure Hunt

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

Start Hunting!

Translated by