Быстрое умножение матрицы на матрицу за матрицей

Мне нужно умножить три матрицы 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 
Другие вопросы по тегам