保存嵌套 for 循环的输出:粒子在多个时间步长内随机移动

Save output from nested for loop: random movement of particles over many time steps

我是 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

我想创建一个 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