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

31 次查看(过去 30 天)
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 个评论
Jan
Jan 2017-6-27
"Works" and "doesn't work" are lean descriptions. Post the error message instead. Note that it contains important information.

请先登录,再进行评论。

回答(1 个)

Jan
Jan 2017-6-27
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 个评论
Gennaro Arguzzi
Gennaro Arguzzi 2017-6-28
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 2017-6-29
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.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Whos 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by