使用多个情节在Matlab中创建电影
我对Matlab比较陌生,我正在尝试创建一个包含多条曲线(勒让德多项式)的.avi文件,用一个红点跟踪每条曲线。我以前用一组参数方程和linspace做过这件事,看起来效果不错。我认为代码基本上与我在这里要做的相同,但每次尝试运行程序时,我都会收到以下错误消息:使用多个情节在Matlab中创建电影,matlab,plot,movie,Matlab,Plot,Movie,我对Matlab比较陌生,我正在尝试创建一个包含多条曲线(勒让德多项式)的.avi文件,用一个红点跟踪每条曲线。我以前用一组参数方程和linspace做过这件事,看起来效果不错。我认为代码基本上与我在这里要做的相同,但每次尝试运行程序时,我都会收到以下错误消息: ??? Index exceeds matrix dimensions. Error in ==> legpolymov at 25 plot(x(1:2*i),y0(1:2*i)); 下面列出了我的代码。是否有我做错
??? Index exceeds matrix dimensions.
Error in ==> legpolymov at 25
plot(x(1:2*i),y0(1:2*i));
下面列出了我的代码。是否有我做错了或只是遗漏了什么,或者是否有更好/更有效的方法来做我想做的事情
谢谢
clc
clear all;
close all;
delete legpolymov.txt
diary legpolymov.txt
figure
hold all
t=linspace(-2,2,500);
x = t;
y0 = 1;
y1 = t;
y2 = (3/2)*t.^2 - (1/2);
y3 = (5/2)*t.^3 - ((3/2)*t);
y4 = (3/8) - ((15/4)*t.^2) + ((35/8)*t.^4);
y5 = ((15/8)*t) - ((35/4)*t.^3) + ((63/8)*t.^5);
plot(x,y0)
plot(x,y1)
plot(x,y2)
plot(x,y3)
plot(x,y4)
plot(x,y5)
axis equal
M=moviein(50);
for i=1:50
plot(x(1:2*i),y0(1:2*i));
plot(x(1:2*i),y1(1:2*i));
plot(x(1:2*i),y2(1:2*i));
plot(x(1:2*i),y3(1:2*i));
plot(x(1:2*i),y4(1:2*i));
plot(x(1:2*i),y5(1:2*i));
hold all
plot(x(2*i),y0(2*i),'k*');
plot(x(2*i),y1(2*i),'k*');
plot(x(2*i),y2(2*i),'k*');
plot(x(2*i),y3(2*i),'k*');
plot(x(2*i),y4(2*i),'k*');
plot(x(2*i),y5(2*i),'k*');
axis([-2 2 -1 1])
a = texlabel('alpha');
title('Legendre Polynomials for (1-x^2)y''''-2xy''+ \alpha * (\alpha +1) = 0');
xlabel('x-axis')
ylabel('y-axis')
M(i)=getframe;
hold off
end
movie(M)
movie2avi(M,'Legendre1','FPS',7)
diary off
原因是您的
y0
变量只是一个值,而y1,…y5
的其他值是数组。因此,在循环中对y0
进行索引时,假设它是一个数组,而不是数组
为了确保运行此代码时大小一致,您需要确保y0
也是1 x 500
数组。因此,您需要将y0
语句替换为:
y0 = ones(1,500);
您的代码应该在执行此替换后运行
一些小调 我只是在我这边运行了这段代码,除了我所做的
y0
更正之外,它似乎没有正确地使用上面的精确形式绘制。为了使其运行,我建议您进行以下更改:
- 将您的
全部保存在
循环的开头的for
语句。这样,所有点(包括曲线)都将被打印。将其从
循环的中间取出,并放在开头for
- 您有500个数据点,您的
循环以2的倍数绘制数据。因此,您应该将for
循环限制从for
增加到1:50
。换言之:1:250
for i = 1 : 250 %// Insert code here end
一旦我做了这些更改,我就让你的代码正常工作了。我真是太傻了。不过,谢谢@艾伦-哈哈,不客气。发生在我们所有人身上。祝你好运除了对你下面问题的完美回答之外;在每个循环中绘制新的绘图是很慢的。例如,您可以创建一整套所需的点并使用“get”(例如“get(h,'XData'))和“set”命令移动它们,或者您可以创建一个点并四处移动,同时不从图形中删除旧值(请参见“橡皮擦模式”)。使用“drawnow”更新每个循环中的图形。@A.Klomp-这是一个非常好的观点!