我是MATLAB的新手,并尝试模拟一些随机粒子运动。
我想
我试图将嵌套for循环的输出保存为数组来实现此目的,但它目前还没有工作。我的代码写在下面
nT = 200 %number of timesteps
N = 50 %particles
w = 0.05 %swimming speed
d = zeros(1,N)
for i = 1:N
d(i) = 0
end
for ts = 1:nT
for i = 1:N
r(i) = rand
d_new(i) = d(i) + w*rand
d(i) = d_new(i)
end
end
我想为每个时间步创建一个包含每个粒子d
值的200 * 50数组。
有人可以帮忙吗?提前谢谢。
答案 0 :(得分:1)
首先,一些MATLAB基础知识。您通常不需要循环遍历数组中的所有元素,例如
N = 50
d = zeros(1,N); % You've created an array of zeros, 1 row by N columns
% You don't need the following loop, as that goes over each element
% in 'd' and sets it equal to 0 - something we've already done.
% for i = 1:N
% d(i) = 0;
% end
当您更改每个粒子的深度值时,这也适用。下面我展示你可以摆脱内部for
循环,转而支持"矢量化"代码 - 这是在MATLAB中编写时要掌握的东西。
好的,让我们根据您的描述来分解您想要做的事情。
"我试图在深度= 0&#34时启动我的粒子; 很棒,我们已经用{创造了这个' {1}}。更好的是为每个时间步创建一行。这样我们就可以在经历时间循环时保存
d = zeros(1,N);
通过设置整个阵列开始,我们在计算机的记忆中更加友善,这将(通常)更快,是最佳实践。
"然后按(游泳速度)*(随机数)移动它们以表示游泳速度的随机变化" 。还要添加这些随机速度并将它们存储在一个数组中。这一部分都可以实现如下:
nT = 200 % Number of time steps
N = 50 % Number of particles
d = zeros(nT, N); % Matrix of zeros, row per timestep, column per particle
所以整个代码,只有关键评论(以显示它的紧凑程度)将是:
% Set up initial variables
w = 0.05 % Swimming speed
% Set up some time loop. Start from row 2, as row 1 is our initial conditions
for t = 2:nT
% Create a random value for each particle at once
r = rand(1,N);
% Apply random movement to the particles, store in next time step
% We access row 't', all columns using d(t,:)
d(t,:) = d(t-1,:) + w*r;
end
答案 1 :(得分:-2)
您可以添加
d_new_value(ts, i) = d(i)
之后
d_new(i) = d(i) + w*rand
d(i) = d_new(i)
在这种情况下,for
之后,d_new_value
将是200x50矩阵。
或者你可以做到
d_new_value = [];
for ts = 1:nT
for i = 1:N
r(i) = rand
d_new(i) = d(i) + w*rand
d(i) = d_new(i)
end
d_new_value = [d_new_value; d];
end