我的任务是在Matlab中制作一个3d螺旋磁通管动画,我不知道该怎么做。
我唯一拥有的动画体验是用于绘制9个太阳系行星轨道的2d轨迹,我使用下面的代码(其中z是27列矩阵,其列按照x序列排序, y,z代表9个行星的9倍)
% Plot 9 empty plots
p = plot3(nan(9), nan(9), nan(9));
for k = 1:size(z, 1)
% Update all of the plot objects at once
set(p, {'XData'}, num2cell(z(1:k, 1:3:25), 1).', ...
{'YData'}, num2cell(z(1:k, 2:3:26), 1).', ...
{'ZData'}, num2cell(z(1:k, 3:3:27), 1).')
drawnow
end
所以,直觉上,我已经尝试将其调整为我所具有的螺旋通量管如下(其中x,y和z是21 x 301矩阵,因此我假设在每个时间步骤我必须冲浪行x,y和z因此达到所需的时间步长):
p = surf(nan(21,301), nan(21,301), nan(21,301));
for k = 1:size(x,1)
% Update all of the plot objects at once
set(p, {'XData'}, num2cell(x(1:k, :), [1 301]), ...
{'YData'}, num2cell(y(1:k, :), [1 301]), ...
{'ZData'}, num2cell(z(1:k, :), [1 301]))
drawnow
end
然而,这样做我不断收到错误
Error using matlab.graphics.chart.primitive.Surface/set
Size mismatch in Param Cell / Value Cell pair.
我知道我可能在某个地方犯了一个愚蠢的错误,但任何人都可以帮忙吗?或者,如果我完全采用这种方式,任何人都可以通过错误的方式让我知道吗?!
(NB如果有帮助,在原始脚本中绘制螺旋通量管,代码为:)
surf(x,y,z,'facecolor', Colour, 'edgecolor',EdgeColour,...
'facelighting','gouraud')
谢谢!
答案 0 :(得分:0)
我不是100%确定我得到你想要的东西,但你可以尝试:
for k = 1:size(x,1)
surf(num2cell(x(1:k, :) ,num2cell(y(1:k, :), num2cell(z(1:k, :);
M(i)=getframe;
end
然后通过以下方式将其显示为电影:
numberofrepitions=3 % as often as you want to have it play in a row
movie(M,numberofrepetitions)
可能更容易在某些随机数据上显示,因为您没有提供任何数据:
x=[1 2 3; 2 3 4; 3 4 5];
y=[19 17 15; 13 11 9; 7 5 3];
z=[1 1 2; 2 1 1; 3 3 3];
for i=1:10
surf(x,y,z);
M(i)=getframe;
x=x+10;
y=y+20;
z=z+25;
end
movie(M,3)
创建的绘图的形式没有改变,但你可以看到轴移动,所以我想它也可以用于表面三角测量的不同形式。
答案 1 :(得分:0)
您收到该错误,因为以下命令仅创建一个surf
对象
p = surf(nan(21,301), nan(21,301), nan(21,301));
numel(p)
% 1
如果这是您想要的,那么您不想使用'{XData}'
符号,而只需使用普通'XData'
等。
但是,如果执行想要创建多个surf
对象,则需要在循环内执行此操作。 然后您应该能够按照自己喜欢的方式更新它们。
答案 2 :(得分:0)
此代码获得了所需的动画
p = surf(nan(21,301), nan(21,301), nan(21,301));
for k = 1:301
% Update all of the plot objects at once
set(p, 'XData', x(:, 1:k), ...
'YData', y(:, 1:k), ...
'ZData', z(:, 1:k))
drawnow
end
因此,从基点的初始圆圈开始,动画显示随着时间的推移,这个初始圆圈上升(并扭曲)时形成的管道。
我们不再需要围绕'XData'等的{},因为我们只需要一个对象的冲浪,而不是之前的9个。
感谢您获得此答案的所有帮助!