如何在元胞数组中创建循环并重塑矩阵

How to create a loop in a cell array and reshape matrix

我有以下脚本来计算流体扰动。 我正在读取 2D 速度场,然后将此数据存储在单元阵列中。 在本示例中,我只有 4 个来自不同时间步长的速度场,但最终我将拥有大约 300+

速度场存储在元胞数组中并且该部分有效。我需要帮助的是创建一个循环,然后重塑元胞数组中的矩阵并存储为单独的矩阵。

到目前为止我有

%% Calculating the Perturbation
% The perturbation is calculated by subtracting the average velocity form
% the instantaneous. 
% Below are the instantaneous velocity fields in each direction

% u velocity
U = num2cell(u,1);

% v velocity
V = num2cell(v,1);

% w velocity
W = num2cell(w,1);

从这里开始,我现在想重塑元胞数组中的矩阵并保存如下:

%% Reshape the velocity vectors into matrices



u1d = reshape(cell2mat(U(1,1)),[nx ny]);
u2d = reshape(cell2mat(U(1,2)),[nx ny]);
u3d = reshape(cell2mat(U(1,3)),[nx ny]);
u4d = reshape(cell2mat(U(1,4)),[nx ny]);

v1d = reshape(cell2mat(V(1,1)),[nx ny]);
v2d = reshape(cell2mat(V(1,2)),[nx ny]);
v3d = reshape(cell2mat(V(1,3)),[nx ny]);
v4d = reshape(cell2mat(V(1,4)),[nx ny]);

w1d = reshape(cell2mat(W(1,1)),[nx ny]);
w2d = reshape(cell2mat(W(1,2)),[nx ny]);
w3d = reshape(cell2mat(W(1,3)),[nx ny]);
w4d = reshape(cell2mat(W(1,4)),[nx ny]);

现在这个方法很长,我不确定如何创建一个循环来重塑矩阵,然后如上所示重命名它们。单独处理会花费很长时间,我想处理 300 多个文件。我非常感谢这方面的帮助。我已经手动完成了,这就是我的知识。

我想要它的原因是 u1d, u2d...v1d, v2d .... w1d... 是为了计算两点相关性。所以一旦我得到 u1d....etc 我将从平均速度场中减去它。这是代码的另一部分。我需要帮助来为这部分创建一个循环。

首先,一些提示:

  • cell2mat(U(1,1)) 等同于 U{1,1}。你应该更喜欢后者,它更有效,因为它不进行函数调用。

  • 命名变量 u1d, u2d, u3d, ... 通常不是一个好主意。您已经想到可以使用元胞数组 U 来存储向量,您也应该将这些存储在元胞数组中:ud{1}ud{2}ud{3}、...

鉴于这两点,您可以使用循环来完成您的工作:

for ii=1:4
   ud{ii} = reshape(U{ii},[nx ny]);
end

然而,在这种情况下实际上什至没有必要使用元胞数组,像这样进行索引:U{1,1} 和像这样:u(:,1) 一样需要做很多工作。您应该更喜欢后者,因为这就是数据的输入方式:您避免了生成元胞数组所需的副本。

给定大小为 nxk 的数值数组 u,具有 k 个向量(在您的示例中为 k=4),并且 n==nx*ny每个元素的个数,可以这样:

ud = reshape(u, nx, ny, k);

相同
ud = reshape(u, nx, ny, []);

在最后一个版本中,MATLAB 计算出 k 的大小应为 u

从这里开始,您索引 ud(:,:,1) 以获得您的 u1d,等等

请注意 reshape 不会复制数据。 ud 将引用与 u 相同的数据,直到您更改两个数组之一。一旦您尝试更改其中一个中的数据,就会制作完整数组的副本。这叫做"lazy copying"。如果你不需要保留u,我建议你不要创建一个新的变量,直接做u = reshape(u...)。这将防止数据被复制。