gpt4 book ai didi

r - R中的外/张量积

转载 作者:行者123 更新时间:2023-12-04 11:28:47 27 4
gpt4 key购买 nike

给定 p矢量 x1,x2,...,xp每个维度d ,计算它们的张量/外/Kruskal 乘积的最佳方法是什么(p -array X 与条目 X[i1,i2,..ip] = x1[i1]x2[i2]...xp[ip]) ?循环是微不足道的,但很愚蠢。使用重复调用 outer 工作正常,但似乎并不就像最佳解决方案一样(并且随着 p 的增加会变慢,显然)有更好的方法吗?

编辑:

我目前最好的是

array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))

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

编辑 2:为了回应@Dwin,这是一个完整的例子
d=3
x1 = 1:d
x2 = 1:d+3
x3 = 1:d+6
array(apply(expand.grid(x1, x2, x3), 1, prod), dim=rep(d, 3))

, , 1

[,1] [,2] [,3]
[1,] 28 35 42
[2,] 56 70 84
[3,] 84 105 126

, , 2

[,1] [,2] [,3]
[1,] 32 40 48
[2,] 64 80 96
[3,] 96 120 144

, , 3

[,1] [,2] [,3]
[1,] 36 45 54
[2,] 72 90 108
[3,] 108 135 162

最佳答案

很难超越 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)

我更换了我的 Windows Rblas.dll使用 DYNAMIC_ARCH 版本的 GOTO BLAS 位于 this place如上所示,这将时间从 0.5 秒提高到 0.35 秒。

关于r - R中的外/张量积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com