R中的外/张量产品

时间:2012-01-06 21:46:46

标签: r outer-join

给定p每个维度x1,x2,...,xp的{​​{1}}个向量,计算其张量/外部/ Kruskal产品(d - 数组X的最佳方法是什么? {1}}?循环是微不足道的,但很愚蠢。使用重复调用p可以正常工作,但似乎不是最佳解决方案(并且随着p的增加会变得更慢,显然)。有更好的方法吗? ?

编辑:

我目前最好的是

X[i1,i2,..ip] = x1[i1]x2[i2]...xp[ip])

至少“感觉更好”......

编辑2:回应@Dwin,这是一个完整的示例

outer

3 个答案:

答案 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)

您可以使用tensor包。

还有%o%功能

A <- matrix(1:6, 2, 3)
D <- A %o% A

答案 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或“*”。在任何情况下,提供一组样本矢量和所需的输出是提出问题的最佳实践。