R是否优化了矩阵乘法的顺序?
Does R optimise the order of matrix multiplications?
如果我将 3 个矩阵相乘,比如 ABC。根据矩阵的大小,执行 (AB)C 或 A(BC) 可能更有效。如果我评估:
A %*% B %*% C
这会被优化吗?
感谢 Beauvel 上校让我走上了正确的道路 - 只需测试一下。使用 wikipedia 中的示例并适当放大:
> mult <- 100
> ar <- 10 * mult
> ac <- 30 * mult
> br <- 30 * mult
> bc <- 5 * mult
> cr <- 5 * mult
> cc <- 60 * mult
>
> A <- matrix(rnorm(ar * ac), ar, ac)
> B <- matrix(rnorm(br * bc), br, bc)
> C <- matrix(rnorm(cr * cc), cr, cc)
>
> system.time({ (A %*% B) %*% C })
user system elapsed
3.01 0.00 3.01
> system.time({ A %*% (B %*% C) })
user system elapsed
25.34 0.03 25.37
> system.time({ A %*% B %*% C })
user system elapsed
2.98 0.00 2.98
> system.time({ t(C) %*% t(B) %*% t(A) })
user system elapsed
25.61 0.03 25.64
顺便说一句 - R 从左到右求值。
如果我将 3 个矩阵相乘,比如 ABC。根据矩阵的大小,执行 (AB)C 或 A(BC) 可能更有效。如果我评估:
A %*% B %*% C
这会被优化吗?
感谢 Beauvel 上校让我走上了正确的道路 - 只需测试一下。使用 wikipedia 中的示例并适当放大:
> mult <- 100
> ar <- 10 * mult
> ac <- 30 * mult
> br <- 30 * mult
> bc <- 5 * mult
> cr <- 5 * mult
> cc <- 60 * mult
>
> A <- matrix(rnorm(ar * ac), ar, ac)
> B <- matrix(rnorm(br * bc), br, bc)
> C <- matrix(rnorm(cr * cc), cr, cc)
>
> system.time({ (A %*% B) %*% C })
user system elapsed
3.01 0.00 3.01
> system.time({ A %*% (B %*% C) })
user system elapsed
25.34 0.03 25.37
> system.time({ A %*% B %*% C })
user system elapsed
2.98 0.00 2.98
> system.time({ t(C) %*% t(B) %*% t(A) })
user system elapsed
25.61 0.03 25.64
顺便说一句 - R 从左到右求值。