Matlab 为什么二维随机游动的一维变量不起作用?

Matlab 为什么二维随机游动的一维变量不起作用?,matlab,random,octave,random-walk,Matlab,Random,Octave,Random Walk,有一个二维的随机游动,你可以找到它在其中完美地工作。然而,当我试图编写一个一维随机游走程序时,我得到了一个错误。节目如下: t=[]; x=[]; for i=1:100000 J=rand; if J<0.5 x(i+1)=x(i)+1; t(i+1)=t(i)+1; else x(i+1)=x(i)-1; t(i+1)=t(i)+1; end end plot(t,x) 以下是错误: 错

有一个二维的随机游动,你可以找到它在其中完美地工作。然而,当我试图编写一个一维随机游走程序时,我得到了一个错误。节目如下:

t=[];
x=[];
for i=1:100000
    J=rand;
    if J<0.5
        x(i+1)=x(i)+1;
        t(i+1)=t(i)+1;
    else
        x(i+1)=x(i)-1;
        t(i+1)=t(i)+1;
    end
end

plot(t,x)
以下是错误:

错误:AI:索引超出范围;值1超出范围0


多谢各位

您会得到一个错误,因为当您实际将x定义为长度为0时,要求MATLAB在第一次迭代中使用x1。因此,您需要使用适当的大小初始化x和t:

x=zeros(1,100001);
t=zeros(1,100001);
或者更改循环以在向量末尾添加新值:

    x(i+1)=[x(i) x(i)+1];

<>因为t和x是空的,因此,不能通过席+ 1和席索引它们。 我相信你应该用全零初始化x和t。

在第一次迭代中,I=1,你有x2=x1+或-1,而x的维数为零。你应该定义x和t的起点,这通常是原点,你也可以稍微修改一下代码

x = 0;
N = 100000;
t = 0 : N;
for i = 1 : N
    x(i+1) = x(i) + 2 * round(rand) - 1;
end
plot(t,x)
不需要循环:

N = 100000;
t = 1:N;
x = cumsum(2*(rand(1,N)<.5)-1);
plot(t,x)
对于2D情况,您可以使用相同的方法:

N = 100000;
%// t = 1:N; it won't be used in the plot, so not needed
x = cumsum(2*(rand(1,N)<.5)-1);
y = cumsum(2*(rand(1,N)<.5)-1);
plot(x,y)
axis square

很好的建议,但你的答案并不能解释OP错误的来源:使用了x1,但未定义感谢这句话,我相应地编辑了答案。@yoh.lej谢谢你的回复+1.但有两个问题:1。为什么第一个程序在没有正确执行的情况下仍然有效?2.为什么它仍然不起作用?试试看;我得到了同样的错误。在链接中,作者用x1=0初始化了x和y;y1=0;你说不工作是什么意思?你还是有错误吗?或者这不是你期望的结果。我得到了一些类似于路易斯·门多发布的东西。对于计算效率来说,尽管他的解要好得多,但库姆森在这方面确实很有效。我在这个答案中只看到一个小小的警告,它从-1或+1开始。当然,如果需要的话,可以通过在开始处添加0来轻松更正。@yoh.lej您是对的。但是,在运算代码中,它甚至没有定义x的初始值应该是什么be@LuisMendo是的,只是在链接中。对于2D,你也可以做x=cumsum2*rand2,N@yoh.lej是的,我也想到了这一点,但它似乎没有添加任何本质上的新内容。另一种选择是使用复数:z=cumsum2*rand1,N