-1

3 つの行列 X(Nxk)、FF(kxk)、X(Nxk) (再び) を乗算する必要があります。これは t(xi) * FF * xi で、xi は X の i 番目の行、i=1:N です。結果は、N 行の単一列の行列になります。乗算も X * FF * t(X) と見なすことができます。

(Nxk) は「N 行、k 列」を表し、* は代数乗算、t() 転置です。

問題は、N が非常に大きい (100k 以上) ことです。ドロップスイープを使用して高速乗算を行うためのアドバイスをいくつか見つけました。しかし、彼らは問題の半分、つまりベクトルと行列の乗算だけを考慮しています。

X のサイズのため、A=X FF と A t(X)の 2 つの段階での乗算を避けたいと思います。したがって、必要なのは、3 つの行列を一度に乗算する関数またはヒントです (まあ、 R で計算をできるだけ速くするためです。

4

1 に答える 1

0

XFXが必要なだけで、dropsweepニシンである場合。これらの投稿では、さまざまな問題について説明しています。

もっと複雑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 
于 2016-03-12T13:16:51.653 に答える