如果我有一个数组
A = [2 4 6 8]
和另一个数组
B = [1 2 3 4 5 6 7]
然后我想取A
的第一个元素,即2
,并将其添加到B
的每个元素中,并将结果数组保存到矩阵C
。
接下来,我想要4
,将其添加到B
的每个元素,然后再将其保存到C
。
同样,对于6
和8
元素,重复相同的过程。
如何在不使用循环的情况下获取矩阵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)']
答案 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的大小,如果您需要高性能,可以从这些替代方案中受益。因此,一半的操作可以以一种方式完成,另一部分可以另一种方式完成。这是一门艺术,而不是科学。但是,在这些尺寸下,它们是相当微小的差异。