逐矩阵快速乘法矩阵
fast multiplication matrix by matrix by matrix
我需要将三个矩阵 X(Nxk)、FF(kxk) 和 X(Nxk) 相乘(再次)。即t(xi) * FF * xi,其中xi为X的第i行,i=1:N。结果将是具有 N 行的单列矩阵。乘法也可以看做 X * FF * t(X).
(Nxk)代表"N rows, k columns",*为代数乘法,t()转置。
问题是N很大(超过100k)。我找到了一些使用 drop and sweep 进行快速乘法的建议。但是他们只考虑了问题的一半——向量乘以矩阵。
由于 X 的大小,我想避免在 A=XFF 和 At(X) 两个阶段进行乘法运算。所以我需要的是一些函数或提示,一次将三个矩阵相乘(嗯,尽可能多),以便在 R 中尽可能快地进行计算。
如果您只需要 XFX',drop
和 sweep
是转移注意力的问题。这些帖子描述了不同的问题。
你可以先看看 Matrix
是否给你足够的速度,然后再做任何事情 more involved。
library(Matrix)
library(microbenchmark)
# sparse matrix from Matrix
data(CAex)
# create a possible FF
set.seed(1)
FF = matrix(rnorm(length(CAex)), nrow = nrow(CAex), ncol = nrow(CAex))
# not a sparse matrix
CA = as.matrix(CAex)
microbenchmark(
matrix = CA %*% crossprod(FF, CA),
Matrix = CAex %*% crossprod(FF, CAex))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# matrix 561.170 563.952 654.8408 588.1250 651.673 1403.389 100 b
# Matrix 94.356 102.866 173.1130 119.9435 165.542 1815.316 100 a
我需要将三个矩阵 X(Nxk)、FF(kxk) 和 X(Nxk) 相乘(再次)。即t(xi) * FF * xi,其中xi为X的第i行,i=1:N。结果将是具有 N 行的单列矩阵。乘法也可以看做 X * FF * t(X).
(Nxk)代表"N rows, k columns",*为代数乘法,t()转置。
问题是N很大(超过100k)。我找到了一些使用 drop and sweep 进行快速乘法的建议。但是他们只考虑了问题的一半——向量乘以矩阵。
由于 X 的大小,我想避免在 A=XFF 和 At(X) 两个阶段进行乘法运算。所以我需要的是一些函数或提示,一次将三个矩阵相乘(嗯,尽可能多),以便在 R 中尽可能快地进行计算。
如果您只需要 XFX',drop
和 sweep
是转移注意力的问题。这些帖子描述了不同的问题。
你可以先看看 Matrix
是否给你足够的速度,然后再做任何事情 more involved。
library(Matrix)
library(microbenchmark)
# sparse matrix from Matrix
data(CAex)
# create a possible FF
set.seed(1)
FF = matrix(rnorm(length(CAex)), nrow = nrow(CAex), ncol = nrow(CAex))
# not a sparse matrix
CA = as.matrix(CAex)
microbenchmark(
matrix = CA %*% crossprod(FF, CA),
Matrix = CAex %*% crossprod(FF, CAex))
# Unit: microseconds
# expr min lq mean median uq max neval cld
# matrix 561.170 563.952 654.8408 588.1250 651.673 1403.389 100 b
# Matrix 94.356 102.866 173.1130 119.9435 165.542 1815.316 100 a