2

たとえば、各行をn回繰り返したい:

A= [123
    456
    789];

だから私はしたい:

b=[123
   123
   123
   456
   456
   456
   789
   789
   789];

私は試しましたrepmat

B = repmat(A,3,1)

しかし、これはb上記の結果にはなりません...どうすればいいですか?

4

2 に答える 2

5

ベクトルの場合、単純repmatに転置で使用し、次のように展開します。

A = [123;456;789];
A = repmat(A.', 3, 1);
A = A(:);

より一般的には、任意の行列/テンソルに対してrepmat、インデックスで使用します。

A = [ 1 2 3; 4 5 6; 7 8 9 ];
A = A(repmat(1:end, 3, 1), :);

または、以下の Colin T Bowers の回答に基づいて、それよりもはるかに高速な代替手段は

A = A( ones(3,1) * (1:end), :);

これは少し読みにくいので、これを使用したときの動作を説明するコメント行を含めてください。

クロネッカー製品も見てください。

A = kron(A, [1;1;1]);

これは非常に役立つ場合があります。

于 2012-11-19T09:07:23.947 に答える
5

Rody がrepmat解決策 (+1) を提供してくれましたが、次のことも指摘する価値があると思いました。

A = [123;456;789];
A = ones(N, 1) * A';
A = A(:);

repmat特に効率的な関数ではないため、桁違いに高速になります。10000 回の反復を超えるクイック スピード テストでは、次の結果が得られます。

Elapsed time is 0.206894 seconds %#repmat solution
Elapsed time is 0.024718 seconds %#My solution

最後のポイントとして、@ Maroun85 が線形インデックスの使用を提案しているコメントに気付きました。しかし、 を呼び出さずに必要なインデックスを構築する賢い方法は見当たらず、repmatスローダウンの元の原因に戻ります。ただし、他の誰かが、必要なインデックス ベクトルを構築する賢い方法を思い付くことができるかもしれません。

編集: Rody は、前述の「賢い方法」を提供するために回答を更新しました。:-)

于 2012-11-19T09:15:38.480 に答える