一次一个地将一个数组中的元素添加到另一个数组中

时间:2016-06-08 06:49:55

标签: matlab

如果我有一个数组

A = [2 4 6 8]

和另一个数组

B = [1 2 3 4 5 6 7]

然后我想取A的第一个元素,即2,并将其添加到B的每个元素中,并将结果数组保存到矩阵C
接下来,我想要4,将其添加到B的每个元素,然后再将其保存到C
同样,对于68元素,重复相同的过程。

如何在不使用循环的情况下获取矩阵C

C = [(3 4 5 6 7 8 9)' (5 6 7 8 9 10 11)'  (7 8 9 10 11 12 13)'  (9 10 11 12 13 14 15)']

2 个答案:

答案 0 :(得分:6)

只需使用bsxfun

>> C = bsxfun(@plus, A, B.')

C =

     3     5     7     9
     4     6     8    10
     5     7     9    11
     6     8    10    12
     7     9    11    13
     8    10    12    14
     9    11    13    15

答案 1 :(得分:0)

另一种可能性是平铺并立即执行。为此,您有很多选项,具体取决于参数大小或内存约束或就地覆盖自由等。

复制数组的一种方法是提供外部(也称为二元或一等)产品

因此,当您执行以下乘法时:

[1]
[1]    
[1] * [a b c ... ]
[1]
[1]

结果是具有相同行的等级1矩阵

[a b c ... ]
[a b c ... ]
[a b c ... ]
[a b c ... ]
[a b c ... ]

你可以用matlab函数repmat做同样的事情,它以更通用的方式重复数组,并在内部依赖bsxfun。这里的简单版本就足够了。

# repmat(A,number of repetitions vertically,number of repetitions horizontally)
repmat([a b c ...]',1,n)

再次对n=4

说同样的话
[a a a a]
[b b b b]
[c c c c]
    .
    .
    .

你也可以使用kron这是通过meshgrid实现的Kronecker产品,因此基本上是2D(简而言之就是第二个参数,每个图块乘以第一个参数的元素)

kron([1;1;1;1;1],[a b c d e])

与第一个参数给出相同的结果。现在您可以看到,根据参数的大小或创建的临时数组的数量,您可以使用这些方法的混合,尽管它们执行相同的操作。例如;内部不同的两个等效命令是

C = ones(length(B),1)*A + repmat(B',1,length(A));

C = kron(ones(length(B),1),A) + kron(ones(1,length(A)),B')

因此,根据A和B的大小,如果您需要高性能,可以从这些替代方案中受益。因此,一半的操作可以以一种方式完成,另一部分可以另一种方式完成。这是一门艺术,而不是科学。但是,在这些尺寸下,它们是相当微小的差异。