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

时间:2017-08-22 14:33:30

标签: arrays matlab for-loop nested-loops

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

我想为每个时间步创建一个包含每个粒子d值的200 * 50数组。

有人可以帮忙吗?提前谢谢。

2 个答案:

答案 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