MATLABで2X2行列を4X4行列に変換するにはどうすればよいですか?
質問
次の方法で2X2マトリックスを4X4マトリックスに変換するには、ヘルプが必要です:
A = [2 6;
8 4]
次のようになります:
B = [2 2 6 6;
2 2 6 6;
8 8 4 4;
8 8 4 4]
どうすればいいですか?
解決
A = [2 6; 8 4];
% arbitrary 2x2 input matrix
B = repmat(A,2,2);
% replicates rows & columns but not in the way you want
B = B([1 3 2 4], :);
% swaps rows 2 and 3
B = B(:, [1 3 2 4]);
% swaps columns 2 and 3, and you're done!
他のヒント
Jasonのソリューションよりもさらに簡単に実行できます。
B = A([1 1 2 2], :); % replicate the rows
B = B(:, [1 1 2 2]); % replicate the columns
もう1つの解決策を次に示します。
A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );
インデックス作成を使用してすべてを実行し、Aのサイズや形状に依存しません。
これは動作します:
A = [2 6; 8 4];
[X,Y] = meshgrid(1:2);
[XI,YI] = meshgrid(0.5:0.5:2);
B = interp2(X,Y,A,XI,YI,'nearest');
これは、x、y∈{1,2}からx、y∈{0.5、1、1.5、2}へのA(x、y)の2次元最近傍補間です。
編集:Jason SとMartijnのソリューションの出発点です。これはおそらく最も短く明確なソリューションだと思います:
A = [2 6; 8 4];
B = A([1 1 2 2], [1 1 2 2]);
これは、任意の行列に対して機能する単純なインデックス付けに基づく方法です。各要素をMxNサブマトリックスに展開する必要があります。
A(repmat(1:end,[M 1]),repmat(1:end,[N 1]))
例:
>> A=reshape(1:6,[2,3])
A =
1 3 5
2 4 6
>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
ans =
1 1 1 1 3 3 3 3 5 5 5 5
1 1 1 1 3 3 3 3 5 5 5 5
1 1 1 1 3 3 3 3 5 5 5 5
2 2 2 2 4 4 4 4 6 6 6 6
2 2 2 2 4 4 4 4 6 6 6 6
2 2 2 2 4 4 4 4 6 6 6 6
メソッドの動作を確認するために、インデックス作成を詳しく見てみましょう。連続した数字の単純な行ベクトルから始めます
>> m=3; 1:m
ans =
1 2 3
次に、最初の次元でM回繰り返して、マトリックスに拡張します
>> M=4; I=repmat(1:m,[M 1])
I =
1 2 3
1 2 3
1 2 3
1 2 3
マトリックスを使用して配列のインデックスを作成する場合、マトリックス要素は標準のMatlabの順序で連続して使用されます。
>> I(:)
ans =
1
1
1
1
2
2
2
2
3
3
3
3
最後に、配列のインデックスを作成するとき、「end」キーワードは、対応する次元の配列のサイズに評価されます。その結果、この例では、以下は同等です。
>> A(repmat(1:end,[3 1]),repmat(1:end,[4 1]))
>> A(repmat(1:2,[3 1]),repmat(1:3,[4 1]))
>> A(repmat([1 2],[3 1]),repmat([1 2 3],[4 1]))
>> A([1 2;1 2;1 2],[1 2 3;1 2 3;1 2 3;1 2 3])
>> A([1 1 1 2 2 2],[1 1 1 1 2 2 2 2 3 3 3 3])
所属していません StackOverflow