0

我有 n 2 个大小相同 (8x8) 的矩阵,我想将它们平铺成一个矩阵,如下图所示: 图表

我知道我可以逐列连接它们,然后连接每一行,但我想知道是否有更简单的方法来实现这一点。

4

3 回答 3

3

有一个更简单的方法,您可以将所有矩阵存储在一个元胞数组中,然后重新整形并转换回矩阵:

在以下示例中,假设这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)), []))
于 2013-06-02T10:26:48.263 回答
0

如果您已经有一个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通过交换索引来更改数据的分配和插入方式。

于 2013-06-02T03:15:50.420 回答
-1

就在这里!

%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;
于 2013-06-02T02:21:03.087 回答