我有 n 2 个大小相同 (8x8) 的矩阵,我想将它们平铺成一个矩阵,如下图所示:
我知道我可以逐列连接它们,然后连接每一行,但我想知道是否有更简单的方法来实现这一点。
我有 n 2 个大小相同 (8x8) 的矩阵,我想将它们平铺成一个矩阵,如下图所示:
我知道我可以逐列连接它们,然后连接每一行,但我想知道是否有更简单的方法来实现这一点。
有一个更简单的方法,您可以将所有矩阵存储在一个元胞数组中,然后重新整形并转换回矩阵:
在以下示例中,假设这C
是您的 n 2 ×1 矩阵元胞数组:
cell2mat(reshape(C, sqrt(numel(C)), []));
结果是所需的单个平铺矩阵A
。
a = ones(2); b = 2 * a; c = 3 * a; d = 4 * a;
C = {a, b, c, d};
A = cell2mat(reshape(C, sqrt(numel(C)), []))
结果是:
A =
1 1 3 3
1 1 3 3
2 2 4 4
2 2 4 4
注意子矩阵的顺序:它们按列排列。如果你想A
成为:
A =
1 1 2 2
1 1 2 2
3 3 4 4
3 3 4 4
那么你必须通过转置版本C
来重塑:
cell2mat(reshape(C', sqrt(numel(C)), []))
如果您已经有一个for
创建 8×8 矩阵的循环,则可以执行以下操作:
M = 8; % Rows of each block matrix
N = 8; % Columns of each square block matrix
m = 2; % Number of blocks across
n = 2; % Number of blocks vertically
A(m*n*M,N) = 0; % Preallocate an m*n*M-by-N column of blocks
for i = 1:m*n
a = rand(M,N); % Create your data, just random here
A(1+M*(i-1):M*i,:) = a; % Insert data
end
A = reshape(A,[M*m N*n]); % Reshape to obtain block matrix
这假设您有一个for
循环遍历所有n^2
(或m*n
)案例。此外,它一次构建A
一列块。注意:如果您需要首先使用跨行的块来构建它,那么您需要A
通过交换索引来更改数据的分配和插入方式。
就在这里!
%Assuming your matrices are A1, A2, A3 and A4:
A = zeros(size(A1)*2);
A(1:8,1:8) = A1;
A(9:16, 1:8) = A2;
A(1:8, 9:16) = A3;
A(9:16, 9:16) = A4;