我有以下脚本来计算流体扰动。我正在读取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,我将从平均速度场中减去它。这是代码的另一部分。我需要帮助来创建此部分的循环。
您应该考虑使用assignin
。例如,下面的代码将创建变量x1,x2,x3,x4作为4个变量,并带有4x4混合随机变量。
for k1 = 1:4
assignin("base",sprintf("x%0.0f",k1),rand(4))
end
首先,一些指针:
cell2mat(U(1,1))
与U{1,1}
相同。您应该选择后者,因为它不执行函数调用,所以效率更高。
命名变量u1d
,u2d
,u3d
,...通常不是一个好主意。您已经知道可以使用单元格数组U
存储向量,也应该将它们存储在单元格数组中:ud{1}
,ud{2}
,ud{3}
,...
在这种情况下,实际上甚至没有必要使用单元格数组,要做这样的索引工作如下:U{1,1}
如下:u(:,1)
。首选后者,因为这是数据的输入方式:避免生成单元格数组所需的副本。
给定大小为u
x n
的数字数组k
,并带有k
个向量(在您的示例中为k=4
,并且每个元素中的n==nx*ny
个元素的数目,您可以:
ud = reshape(u, nx, ny, k);
与]相同>
ud = reshape(u, nx, ny, []);
在此最新版本中,MATLAB计算出应将
k
的大小指定为u
。
从这里开始,您索引ud(:,:,1)
以获取您的u1d
,等等。>