4

次の方法で 2X2 マトリックスを 4X4 マトリックスに変換する際に助けが必要です。

A = [2 6;
     8 4]

なる必要があります:

B = [2 2 6 6;
     2 2 6 6;
     8 8 4 4;
     8 8 4 4]

どうすればいいですか?

4

7 に答える 7

23

MATLAB の新しいバージョン (R2015a 以降) では、これを行う最も簡単な方法は次のrepelem関数を使用することです。

B = repelem(A, 2, 2);

古いバージョンの場合、他の (大部分) インデックス ベースのソリューションに代わる簡単な方法は、関数kronandを使用することonesです。

>> A = [2 6; 8 4];
>> B = kron(A, ones(2))

B =

     2     2     6     6
     2     2     6     6
     8     8     4     4
     8     8     4     4
于 2009-10-29T14:06:28.830 に答える
12

Jason のソリューションよりもさらに簡単に実行できます。

B = A([1 1 2 2], :);  % replicate the rows
B = B(:, [1 1 2 2]);  % replicate the columns
于 2009-10-29T13:37:47.090 に答える
9

もう1つの解決策は次のとおりです。

A = [2 6; 8 4];
B = A( ceil( 0.5:0.5:end ), ceil( 0.5:0.5:end ) );

インデックスを使用してすべてを行い、A のサイズや形状に依存しません。

于 2009-10-29T14:02:09.493 に答える
4

これは機能します:

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]);
于 2009-10-29T13:19:19.613 に答える
2
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!
于 2009-10-29T13:33:39.350 に答える
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])
于 2011-02-24T13:32:11.970 に答える
-4

これを可能にする Reshape() 関数があります...

例えば:

reshape(array, [64, 16])

ここで素晴らしいビデオチュートリアルを見つけることができます

乾杯

于 2009-10-29T12:52:26.640 に答える