2017-10-06 48 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

相關問題