用MATLAB从一维数组生成二维数组

5

请问是否有一种方法可以从一个一维数组生成一个二维数组,其中二维数组的行是通过重复一维数组中对应元素生成的。

例如:

1D array      2D array

  |1|       |1 1 1 1 1|
  |2|       |2 2 2 2 2|
  |3|  ->   |3 3 3 3 3|
  |4|       |4 4 4 4 4|
  |5|       |5 5 5 5 5|
4个回答

9

为了提供更多帮助,以下是我的一些建议:

A = (1:5)'

  1. Using indices [faster than repmat]:

    B = A(:, ones(5,1))
    
  2. Using matrix outer product:

    B = A*ones(1,5)
    
  3. Using bsxfun() [not the best way of doing it]

    B = bsxfun(@plus, A, zeros(1,5))
    %# or
    B = bsxfun(@times, A, ones(1,5))
    

3
@merv:你可以在 http://www.mathworks.com/access/helpdesk/help/techdoc/matlab_prog/f8-784135.html#br8fs0d-4 阅读更多关于“提高性能技术”的内容。 @woodchips:你提供的第一个示例与gnovice给出的相同。第二个示例并不真正是repmat的通用替代方法,只适用于这个特定的A情况。 - Amro

8
你可以使用 REPMAT 函数来实现这个功能:
>> A = (1:5).'

A =

     1
     2
     3
     4
     5

>> B = repmat(A,1,5)

B =

     1     1     1     1     1
     2     2     2     2     2
     3     3     3     3     3
     4     4     4     4     4
     5     5     5     5     5

编辑:额外的回答! ;)

对于你的示例,REPMAT 是最直接的函数。然而,另一个很棒的函数是KRON,你可以按如下方式使用它作为解决方案:

B = kron(A,ones(1,5));

对于小向量和矩阵,KRON可能会稍微更快,但对于较大的矩阵来说它要慢得多。


1

0
你可以尝试这样做:
a = [1 2 3 4 5]'
l = size(a)
for i=2:5
    a(1:5, i) = a(1:5)

循环只是不断将列附加到末尾。


1
对于小矩阵,这种解决方案更快,但对于较大的尺寸,repmat是一个更好的解决方案。(使用1000x1000矩阵,repmat要快500多倍!) - Doresoom
我同意,我的解决方案相当幼稚,通常使用repmat更好/更优雅的解决方案。 - zdav

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