保存嵌套 for 循环的输出:粒子在多个时间步长内随机移动
Save output from nested for loop: random movement of particles over many time steps
我是 MATLAB 新手,正在尝试模拟一些随机粒子运动。
我要
- 从深度 = 0 开始我的粒子,
- 然后在每个时间步,将它们移动(游泳速度)*(随机数)以表示游泳速度的随机变化。
- 然后我想改变每个粒子的深度,方法是将其在该时间步长的随机游动速度添加到其原始深度。
- 最后我想创建一个数组来显示每个粒子在每个时间步的深度。
我正在尝试将嵌套 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
我想创建一个 200*50 的数组,其中包含每个粒子每个时间步的 d
的值。
有人可以帮忙吗?提前致谢。
您可以添加
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
首先,一些 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
循环,转而使用 "vectorized" 代码——这是在 MATLAB 中编写时需要掌握的东西。
好的,让我们根据您的描述分解您想做的事情。
"I'm trying to start my particles at depth = 0"
太棒了,我们已经用 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
通过一开始就设置整个数组,我们对计算机的内存更加友好,这(通常)会更快并且是最佳实践。
"Then move them by (swimming speed)*(random number) to represent random variation in swimming speeds"。还添加这些随机速度并将它们存储在数组中。这部分都可以实现如下:
% 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
所以整个代码,只有关键注释(以显示它有多紧凑)将是:
% Set up parameters
nT = 200; N = 50; w = 0.05;
% Set up results matrix, including initial conditions by row 1 (all 0)
d = zeros(nT, N);
% Loop, storing results to d
for t = 2:nT
d(t,:) = d(t-1,:) + w*rand(1,N);
end
我是 MATLAB 新手,正在尝试模拟一些随机粒子运动。
我要
- 从深度 = 0 开始我的粒子,
- 然后在每个时间步,将它们移动(游泳速度)*(随机数)以表示游泳速度的随机变化。
- 然后我想改变每个粒子的深度,方法是将其在该时间步长的随机游动速度添加到其原始深度。
- 最后我想创建一个数组来显示每个粒子在每个时间步的深度。
我正在尝试将嵌套 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
我想创建一个 200*50 的数组,其中包含每个粒子每个时间步的 d
的值。
有人可以帮忙吗?提前致谢。
您可以添加
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
首先,一些 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
循环,转而使用 "vectorized" 代码——这是在 MATLAB 中编写时需要掌握的东西。
好的,让我们根据您的描述分解您想做的事情。
"I'm trying to start my particles at depth = 0"
太棒了,我们已经用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
通过一开始就设置整个数组,我们对计算机的内存更加友好,这(通常)会更快并且是最佳实践。
"Then move them by (swimming speed)*(random number) to represent random variation in swimming speeds"。还添加这些随机速度并将它们存储在数组中。这部分都可以实现如下:
% 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
所以整个代码,只有关键注释(以显示它有多紧凑)将是:
% Set up parameters
nT = 200; N = 50; w = 0.05;
% Set up results matrix, including initial conditions by row 1 (all 0)
d = zeros(nT, N);
% Loop, storing results to d
for t = 2:nT
d(t,:) = d(t-1,:) + w*rand(1,N);
end