虽然我已经尽力了,但我觉得很难给出一个准确的标题。这是我的问题。
a = 1/(1:10)
b = 3/(1:10)
c = 1/(1:5)
d = 1/(1:11)
我想得到一个向量 e
,这样 e
包含根据从 a
中选择的值的组合计算的乘积, b
、c
和 d
。
例如,假设有两个向量 {1, 2}
和 {3, 4}
,我想得到一个这样的向量 { 1 * 3, 1 * 4, 2 * 3, 2 * 4} = {3, 4, 6, 8}
。
提前致谢!
最佳答案
expand.grid
solution没问题,但在数学中有一个优雅的克罗内克积。
R 有一个函数 kronecker
, 但一次需要两个向量,所以我们需要 Reduce
对于递归应用程序:
oo <- Reduce(kronecker, list(a, b, c, d))
或者,使用 outer
(kronecker
的主力):
rr <- Reduce(outer, list(a, b, c, d))
这对用户更友好,如rr[i, j, u, v]
给你a[i] * b[j] * c[u] * d[v]
.
备注1
请注意 oo
中的元素和 rr
顺序不同。因为对于两个向量 a
和 b
:
kronecker(a, b) ## a[1] * b, a[2] * b ...
outer(a, b) ## a * b[1], a * b[2] ...
因此下面使用kronecker
产生与 rr
相同的结果.
zz <- Reduce(kronecker, list(d, c, b, a))
dim(zz) <- c(length(a), length(b), length(c), length(d))
备注2
该方法可以改编为a[i] + b[j] + c[u] + d[v]
, 通过替换默认操作 "*"
在 outer
和 kronecker
至 "+"
.例如:
Reduce(function (x, y) outer(x, y, "+"), list(a, b, c, d))
备注3
johannes's answer可以改进。 apply
的行式应用是一个性能 killer 。我们可以执行以下操作以获得与 rr
一致的结果.
xx <- Reduce("*", expand.grid(a, b, c, d))
dim(xx) <- c(length(a), length(b), length(c), length(d))
关于r - 如何计算 R 中多个向量组合的乘积?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51849309/