0

次の図のように、 n 2個の等しいサイズ (8x8) の行列を 1 つの行列に並べて表示します。 ダイアグラム

それらを列ごとに連結してから各行を連結できることは知っていますが、これを達成するためのより簡単な方法があるかどうか知りたいです。

4

3 に答える 3

3

より簡単な方法があります。すべての行列をセル配列に格納してから、形状を変更して行列に戻すことができます。

次の例では、これが行列のCn 2 ×1 セル配列であるとします。

cell2mat(reshape(C, sqrt(numel(C)), []));

結果は、必要に応じて 1 つのタイル張りのマトリックス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

8 行 8 列の行列を作成するループが既にある場合はfor、次のようにすることができます。

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ループがあることを前提としています。また、一度に 1 列のブロックを構築します。注: 最初に行を横切るブロックを使用してビルドする必要がある場合は、インデックスを交換してデータの割り当てと挿入方法を変更する必要があります。n^2m*nAA

于 2013-06-02T03:15:50.420 に答える
-1

Yes there is!

%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 に答える