给定p
每个维度x1,x2,...,xp
的{{1}}个向量,计算其张量/外部/ Kruskal产品(d
- 数组X的最佳方法是什么? {1}}?循环是微不足道的,但很愚蠢。使用重复调用p
可以正常工作,但似乎不是最佳解决方案(并且随着p的增加会变得更慢,显然)。有更好的方法吗? ?
编辑:
我目前最好的是
X[i1,i2,..ip] = x1[i1]x2[i2]...xp[ip])
至少“感觉更好”......
编辑2:回应@Dwin,这是一个完整的示例
outer
答案 0 :(得分:7)
很难超越outer
的表现。这最终会进行矩阵乘法,这是由BLAS库完成的。重复调用outer
也无所谓,因为最后一次调用将主导速度和内存。例如,对于长度为100的向量,最后一次调用至少比前一次调用慢100倍...
在这里获得最佳性能的最佳选择是为R获得最佳BLAS库。默认值不是很好。在Linux上,您可以相当轻松地配置R以使用ATLAS BLAS。在Windows上它更难,但可能。请参阅R for Windows FAQ。
# multiple outer
mouter <- function(x1, ...) {
r <- x1
for(vi in list(...)) r <- outer(r, vi)
r
}
# Your example
d=3
x1 = 1:d
x2 = 1:d+3
x3 = 1:d+6
mouter(x1,x2,x3)
# Performance test
x <- runif(1e2)
system.time(mouter(x,x,x)) # 0 secs (less than 10 ms)
system.time(mouter(x,x,x,x)) # 0.5 secs / 0.35 secs (better BLAS)
我用this place的DYNAMIC_ARCH版本的GOTO BLAS替换了我的Windows Rblas.dll
,如上所示,时间从0.5秒提高到0.35秒。
答案 1 :(得分:1)
答案 2 :(得分:1)
我发现自己想知道kronecker
产品是否符合您的要求。我无法从你的问题描述中确切地说出所需要的内容,但是在一小组论点中这些元素是相同的(虽然与Chalasani解决方案产生的那些不同,你批评的很慢:
kronecker( outer(LETTERS[1:2], c(3, 4, 5),FUN=paste), letters[6:8] ,FUN=paste)
[,1] [,2] [,3]
[1,] "A 3 f" "A 4 f" "A 5 f"
[2,] "A 3 g" "A 4 g" "A 5 g"
[3,] "A 3 h" "A 4 h" "A 5 h"
[4,] "B 3 f" "B 4 f" "B 5 f"
[5,] "B 3 g" "B 4 g" "B 5 g"
[6,] "B 3 h" "B 4 h" "B 5 h"
如果您需要产品,请替换prod
或“*”。在任何情况下,提供一组样本矢量和所需的输出是提出问题的最佳实践。