Matlab:根据2D数组创建3D数组

时间:2015-08-27 14:44:27

标签: arrays matlab

我想创建作为2d数组函数的3d数组,并在每个2D数组上应用矩阵运算。现在我使用for循环创建一系列2d数组,如下面的代码所示:

for i=1:50
    F = [1 0 0; 0 i/10 0; 0 0 1]; 
    B=F*F';
end

如果没有for循环,有没有办法做到这一点?我尝试过这样的事情:

F(2,2) = 0:0.1:5;

f=1:0.1:5;
F=[1 0 0; 0 f 0; 0 0 1];

在没有循环的情况下创建它们,但两者都给出了尺寸不一致的错误。

我还想在我的代码中对F执行矩阵运算,例如

B=F*F';

并希望将F的某些组件绘制为其他内容的函数。在这种情况下是否可以完全消除for循环?

2 个答案:

答案 0 :(得分:4)

如果我理解你想要的是什么,你需要将50个2D矩阵堆叠成一个3D矩阵,其中间条目从1/10变为50/10 = 5,步长为1/10。你差不多了。您需要做的是首先创建一个3D矩阵堆栈,然后将3D矢量分配给中间条目。

这样的事情可以做到:

N = 50;
F = repmat(eye(3,3), [1 1 N]);
F(2,2,:) = (1:N)/10; %// This is 1/10 to 5 in steps of 1/10... or 0.1:0.1:5

首先预先分配一个矩阵F,它是所有切片的单位矩阵,然后将每个切片的中间行和中间列替换为i/10 i = 1, 2, ..., 50

因此,要获得i th 切片,只需执行:

out = F(:,:,i);

次要注意事项

我注意到你最终要做的是3D矩阵的矩阵乘法。该操作未在MATLAB中定义,也未在线性代数上下文中定义。如果要独立地乘以每个2D切片,最好使用for循环。在此上下文中不支持使用本机操作进行矢量化。

要在循环中执行此操作,您可以为每个切片执行以下操作:

B = zeros(size(F)); 
for ii = 1 : size(B,3) 
    B(:,:,ii) = F(:,:,ii)*F(:,:,ii).'; 
end

...但是,检查矩阵的属性,唯一不同的是中间条目。如果执行矩阵乘法,则每个切片的所有条目将是相同的...除了中间,其中条目本身是平方的。如果你通过另一个转置多个一个切片并不重要。身份的转置仍然是身份。

如果你的矩阵将是这样的,你可以只用它自己进行逐元素乘法:

B = F.*F;

如果F除了上面的内容之外的任何其他内容,将会有效。

答案 1 :(得分:3)

创建矩阵很简单:

N = 50;
S    = cell(1,N);
S(:) = {eye(3,3)};
F        = cat(3, S{:});
F(2,2,:) = (1:N)/10;

另一种(更快)的方式是:

N = 50;
F        = zeros(3,3,N);
F(1,1,:) = 1;
F(2,2,:) = (1:N)/10;
F(3,3,:) = 1;

然后您可以通过以下方式获取第3个矩阵(例如)

F(:,:,3)