如何在元胞数组中创建循环并重塑矩阵
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)
一样需要做很多工作。您应该更喜欢后者,因为这就是数据的输入方式:您避免了生成元胞数组所需的副本。
给定大小为 n
xk
的数值数组 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...)
。这将防止数据被复制。
我有以下脚本来计算流体扰动。 我正在读取 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)
一样需要做很多工作。您应该更喜欢后者,因为这就是数据的输入方式:您避免了生成元胞数组所需的副本。
给定大小为 n
xk
的数值数组 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...)
。这将防止数据被复制。