重复矩阵的每一行

3

我有一个大小为m乘以n的变量A。我想生成一个大小为m乘以m*nB变量,如下所示的示例。

示例:
A = [1 2 3;
     4 5 6;
     7 8 9]

应该得到的结果是

B = [1 2 3 4 5 6 7 8 9;
     1 2 3 4 5 6 7 8 9;
     1 2 3 4 5 6 7 8 9]

有没有不使用循环的方法来实现这个?mn是变量。
5个回答

6
您需要使用Matlab的repmat函数: B = repmat(A,M,N)可以创建一个大矩阵B,由A复制M行、N列形成。矩阵B的大小为[size(A,1)*M, size(A,2)*N]。语句repmat(A,N)可以创建一个N行、N列的平铺矩阵。
针对您的具体情况,一个解决方案可能是:
A=A';
B=repmat(A(:)',3,1);

对于一般情况,可能有一个解决方案:

A_aux=reshape(A',1,size(A,1)*size(A,2));
B=repmat(A_aux,size(A,1),1); 

Repmat看起来是正确的,但像向量一样转置和整形矩阵似乎是不可取的。考虑当A=rand(2)时输出应该是什么。 - Dennis Jaheruddin
1
我将矩阵变形为向量的形式,因为我认为@Meher81希望矩阵B包含矩阵A在每行中展开为向量的形式。 - Nerea González Vázquez
我确实误解了问题,但是我认为你的解决方案中也有一个小错误(输出只有1列),所以我冒昧更新了这个答案并加入了一些我的元素。--- 我不确定你是否有意取消了我的编辑,请务必检查一下。 - Dennis Jaheruddin
谢谢您的评论,@Dennis。我想我已经解决了一列输出问题。谢谢 :) - Nerea González Vázquez

4

正如@Nerea所提到的,Repmat确实是这里的解决方法。这个解决方案应该会给出与他相同的答案,但我个人认为它更加优雅:

B=repmat(reshape(A',1,[]),size(A,1),1);

4
为了包含一个相当快速的bsxfun解决方案:

bsxfun

A = [1  2  3  4;
     5  6  7  8;
     9 10 11 12]

A = A.' %'
B = bsxfun(@plus,zeros(size(A,2),1),A(:).')

或者使用kron,但它肯定会更慢:

A = A.'
B = kron(A(:),ones(1,size(A,2))).'

B =

     1     2     3     4     5     6     7     8     9    10    11    12
     1     2     3     4     5     6     7     8     9    10    11    12
     1     2     3     4     5     6     7     8     9    10    11    12

1
bsxfun非常好玩! - Shai
3
你已经掌握了bsxfun的使用方法! :-) - Luis Mendo

3

repmat

[m n] = size(A);
B = ones(m,1) * reshape( A.', 1, [] );

0
一种方法是使用 repmatreshapepermute 的组合!
out = repmat(reshape(permute(A,[3 2 1]),1,[]),size(A,1),1,1);

或者另一种方法,不使用reshape,但变成了两行代码

out1 = permute(A,[3 2 1]);
out = repmat(out1(:).',size(A,1),1,1);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接