繁体   English   中英

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

[英]Matlab: creating 3D arrays as a function of 2D arrays

我想创建作为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循环?

如果我正确理解了您想要的内容,则需要将50个2D矩阵堆叠到3D矩阵中,其中中间项从1/1050/10 = 51/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 ,该矩阵F是所有切片的单位矩阵,然后将每个切片的中间行和中间列替换为i/10 ,其中i = 1, 2, ..., 50

因此,要获得第i 切片,只需执行以下操作:

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除以上以外的其他值,则此功能将无效

创建矩阵很容易:

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;

然后,您可以通过以下方式获得第三个矩阵(例如):

F(:,:,3)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM