Быстрое умножение матрицы на матрицу за матрицей
Мне нужно умножить три матрицы X(Nxk), FF(kxk) и X(Nxk) (снова). Который является t(xi) * FF * xi, где xi является i-й строкой X, i=1:N. Результатом будет матрица из одного столбца с N строками. Умножение также можно рассматривать также как X * FF * t (X).
(Nxk) означает "N строк, k столбцов", * - алгебраическое умножение, t () транспонирование.
Проблема в том, что N довольно большое (больше 100к). Я нашел несколько советов по быстрому умножению с использованием drop и sweep. Но они рассматривают только половину проблемы - умножение вектора на матрицу.
Я хочу избежать умножения на два этапа A = XFF и затем A t (X) из-за размера X. Поэтому мне нужна некоторая функция или подсказка, которые умножают три матрицы за раз (ну, до возможно), чтобы сделать расчет как можно быстрее в R.
1 ответ
Если вам просто нужен XFX ', drop
а также sweep
красные селедки. Эти посты описывают разные проблемы.
Вы можете увидеть, если Matrix
дает вам достаточно скорости, прежде чем перейти к чему-либо более сложному.
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