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

问题描述 投票:1回答:2

我有以下脚本来计算流体扰动。我正在读取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,我将从平均速度场中减去它。这是代码的另一部分。我需要帮助来创建此部分的循环。

arrays matlab matrix reshape cell-array
2个回答
0
投票

您应该考虑使用assignin。例如,下面的代码将创建变量x1,x2,x3,x4作为4个变量,并带有4x4混合随机变量。

for k1 = 1:4
    assignin("base",sprintf("x%0.0f",k1),rand(4))
end

0
投票

首先,一些指针:

  • cell2mat(U(1,1))U{1,1}相同。您应该选择后者,因为它不执行函数调用,所以效率更高。

  • 命名变量u1du2du3d,...通常不是一个好主意。您已经知道可以使用单元格数组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,等等。>

© www.soinside.com 2019 - 2024. All rights reserved.