{} and () brackets - creating array in for loop
显示 更早的评论
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
2017-6-27
"Works" and "doesn't work" are lean descriptions. Post the error message instead. Note that it contains important information.
回答(1 个)
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
2017-6-27
编辑:Gennaro Arguzzi
2017-6-28
per isakson
2017-6-27
编辑:per isakson
2017-6-27
The error message says () and your code {}. Thus it's not the code you show that throws the error.
"I don't understand how use () and {}" The answer by Andrey Rubshtein at Stackoverflow is good.
Gennaro Arguzzi
2017-6-28
编辑:Gennaro Arguzzi
2017-6-28
@Gennaro Arguzzi: If immagine has not been created before, Matlab assumes, it is a double arrays. But then it tries to assign the image replied by frame2im to one element. This must fail. With the curly braces, each image is stored as a cell element.
This would work also:
immagine = uint8([]);
t = 0:0.1:10; % No square brackets
for i=1:5
plot(t,t.^i)
f = getframe(gcf);
immagine(:, :, :, i) = frame2im(f);
end
About the square brackets: https://www.mathworks.com/matlabcentral/answers/35676-why-not-use-square-brackets
Gennaro Arguzzi
2017-6-28
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.
类别
在 帮助中心 和 File Exchange 中查找有关 Image Arithmetic 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!