2017-10-06 47 views
0
close all; 
hold on 

%Edited 
M = zeros(100,500); 
% 

for count = 0:99 
x = []; 
p = 0; 
for i = 1:499 

    n = rand(1); 

    if n > 0.5 
     p = p+1; 
    end 

    if n < 0.5 
     p = p-1; 
    end 

    x(i) = p; 
end 


%Edited 
for j = 1:500 
    M(n,j) = x(j); 
end 
% 


X = abs(x); 
Y = 1:length(X); 

ps = csapi(X,Y); 
fnplt(ps) 

end 

hold off 
grid on 
title('Random Walk Distances') 
xlabel('Distance from the Origin') 
ylabel('Each Iteration of the Experiment') 

我的意图是找出代码绘制的所有曲线的平均曲线。为此,我正在考虑为数组的每个索引寻找平均值,然后绘制该曲线,但是,我只保留最后一次迭代的值,我如何将所有值存储在大矩阵中。在每个循环后存储数组

编辑:我已经包围了我正在考虑的变化(%),但它不起作用。 国家:

错误Random_walk_1D(第30行)

M(N,j)的= X(N);

下标索引必须是实数正整数或逻辑。

+0

[预分配内存](https://de.mathworks.com/help/matlab/matlab_prog/preallocating-arrays.html)获取正确大小的矩阵,并将结果存储到循环内该矩阵的适当索引处。 – mikkola

+0

你有一个如何做到这一点的例子吗?如果'n'是例如 – James

+0

'0.3',那么'M(0.3,j)'是错的,不是吗?因为好的,下标指数必须是真实的正整数或逻辑。 –

回答

1

你的代码中的主要思想并不差,但是你混合了变量名和索引,并不是所有的循环都和你的向量一样长。

例如:

你的第一个循环越过变量count

for count = 0:99 
... 
end 

但在第二次循环中,您试图将分配给M(n,j)

for j = 1:500 
    M(n,j) = x(j); 
end 
然而

您的变量n被分配给一个随机数。你应该将其更改为:

for j = 1:500-1 
    M(count+1,j) = x(j); 
end 

正如你看到的我也不得不减少元件的数量,以500-1作为x只有499项:

for i = 1:499 
.... 
end 

我建议你尽量不要硬编码,而是使用变量:

close all; 
hold on 

%Edited 
m1=100; 
m2=499; 
M = zeros(m1,m2); 

for count = 0:m1-1 
x = []; 
p = 0; 
for i = 1:m2 

    n = rand(1); 

    if n > 0.5 
     p = p+1; 
    end 

    if n < 0.5 
     p = p-1; 
    end 

    x(i) = p; 
end 


%Edited 
for j = 1:m2 
    M(count+1,j) = x(j); 
end 

X = abs(x); 
Y = 1:length(X); 

ps = csapi(X,Y); 
fnplt(ps) 

end 

hold off 
grid on 
title('Random Walk Distances') 
xlabel('Distance from the Origin') 
ylabel('Each Iteration of the Experiment') 

我建议您将脚本放入函数中并运行此函数。
一旦出现错误,请在此处放置一个断点,并查看变量/索引的外观,以了解错误的原因。这将帮助你自己调试你的代码。

+0

谢谢你的帮助,我现在能够解决我的问题。 – James

相关问题