如何从R中几个向量的组合计算产品?

J.Z*_*.Z. 2 combinations r vector permutation multiplication

尽管我已尽力而为,但我觉得很难给出一个准确的头衔.这是我的问题.

a = 1/(1:10)
b = 3/(1:10)
c = 1/(1:5)
d = 1/(1:11)
Run Code Online (Sandbox Code Playgroud)

我想获得的向量e,使得e由来自选自值的组合计算出的产品的a,b,cd.

例如,假设有两个矢量{1, 2}{3, 4},我想获得这样的载体{1 * 3, 1 * 4, 2 * 3, 2 * 4} = {3, 4, 6, 8}.

提前致谢!

李哲源*_*李哲源 8

expand.grid解决方案是确定的,但在数学上有一个优雅的Kronecker积.

R有一个函数kronecker,但它一次需要两个向量,所以我们需要Reduce一个递归的应用程序:

oo <- Reduce(kronecker, list(a, b, c, d))
Run Code Online (Sandbox Code Playgroud)

或者,使用outer(主力kronecker):

rr <- Reduce(outer, list(a, b, c, d))
Run Code Online (Sandbox Code Playgroud)

这是更加人性化,如rr[i, j, u, v]给你a[i] * b[j] * c[u] * d[v].


备注1

请注意元素的顺序oorr不同.因为两个向量ab:

kronecker(a, b)  ## a[1] * b, a[2] * b ...
outer(a, b)      ## a * b[1], a * b[2] ...
Run Code Online (Sandbox Code Playgroud)

因此,以下使用kronecker产生的结果相同rr.

zz <- Reduce(kronecker, list(d, c, b, a))
dim(zz) <- c(length(a), length(b), length(c), length(d))
Run Code Online (Sandbox Code Playgroud)

备注2

该方法可适合于做a[i] + b[j] + c[u] + d[v],通过更换默认操作"*"outerkronecker"+".例如:

Reduce(function (x, y) outer(x, y, "+"), list(a, b, c, d))
Run Code Online (Sandbox Code Playgroud)

备注3

约翰内斯的答案可以得到改善.这种行式应用apply是性能杀手.我们可以执行以下操作以获得与之一致的结果rr.

xx <- Reduce("*", expand.grid(a, b, c, d))
dim(xx) <- c(length(a), length(b), length(c), length(d))
Run Code Online (Sandbox Code Playgroud)