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,c和d.
例如,假设有两个矢量{1, 2}和{3, 4},我想获得这样的载体{1 * 3, 1 * 4, 2 * 3, 2 * 4} = {3, 4, 6, 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
请注意元素的顺序oo和rr不同.因为两个向量a和b:
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],通过更换默认操作"*"中outer和kronecker到"+".例如:
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)
| 归档时间: |
|
| 查看次数: |
115 次 |
| 最近记录: |