次の図のように、 n 2個の等しいサイズ (8x8) の行列を 1 つの行列に並べて表示します。
それらを列ごとに連結してから各行を連結できることは知っていますが、これを達成するためのより簡単な方法があるかどうか知りたいです。
次の図のように、 n 2個の等しいサイズ (8x8) の行列を 1 つの行列に並べて表示します。
それらを列ごとに連結してから各行を連結できることは知っていますが、これを達成するためのより簡単な方法があるかどうか知りたいです。
より簡単な方法があります。すべての行列をセル配列に格納してから、形状を変更して行列に戻すことができます。
次の例では、これが行列のC
n 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)), []))
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^2
m*n
A
A
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;