使用多个情节在Matlab中创建电影

使用多个情节在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)); 下面列出了我的代码。是否有我做错

我对Matlab比较陌生,我正在尝试创建一个包含多条曲线(勒让德多项式)的.avi文件,用一个红点跟踪每条曲线。我以前用一组参数方程和linspace做过这件事,看起来效果不错。我认为代码基本上与我在这里要做的相同,但每次尝试运行程序时,我都会收到以下错误消息:

??? 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个数据点,您的
    for
    循环以2的倍数绘制数据。因此,您应该将
    for
    循环限制从
    1:50
    增加到
    1:250
    。换言之:

    for i = 1 : 250
        %// Insert code here
    end
    

一旦我做了这些更改,我就让你的代码正常工作了。

我真是太傻了。不过,谢谢@艾伦-哈哈,不客气。发生在我们所有人身上。祝你好运除了对你下面问题的完美回答之外;在每个循环中绘制新的绘图是很慢的。例如,您可以创建一整套所需的点并使用“get”(例如“get(h,'XData'))和“set”命令移动它们,或者您可以创建一个点并四处移动,同时不从图形中删除旧值(请参见“橡皮擦模式”)。使用“drawnow”更新每个循环中的图形。@A.Klomp-这是一个非常好的观点!