是否有足够快的解决方法来使矩阵乘以超出内存限制?

时间:2016-02-08 22:05:04

标签: c++ r out-of-memory matrix-multiplication

我有两个距离矩阵d_X:n x n和d_Y:m x m。

set.seed(1)
n <- 2
m <- 3
d_X <- as.matrix(dist(runif(n)))
d_Y <- as.matrix(dist(runif(m)))

从矩阵d_X和d_Y矩阵G:nm x nm形成:

G <- matrix(nrow = n*m,ncol = n*m)
for(i in 1:n) {
      for (j in 1:m) {
            for(ii in 1:n) {
                  for(jj in 1:m) {
                        G[(i-1)*m+j,(ii-1)*m+jj] = abs(d_X[i, ii] - d_Y[j, jj])
                  }
            }
      }
}

还有矩阵U:nm * 1:

U <- runif(m*n)

我的目标是计算G%*%U。现在,当nm为200时,我们需要6GB来分配G。由于G是对称的,我们可以通过正确恢复它来节省一半的空间。

在实践中,nm尺寸最多为5000,这使得分配G成为不可能。由于我只需要G%*%U的值,因此将它逐个计算就足够了。我正在努力寻找一种有效的方法。

*时间也很重要

由于我必须运行这些计算数千次,因此计算G%*%U需要合理的时间也很重要。在Gn小于100的情况下,我使用了以下函数来加速计算m

Rcpp::cppFunction('NumericMatrix G_mat(NumericMatrix d_X, NumericMatrix d_Y) {
                  NumericMatrix G(d_X.nrow()*d_Y.nrow(),d_X.nrow()*d_Y.nrow());
                  for (int i = 0; i <d_X.nrow(); i++) {
                  for (int j = 0; j < d_Y.nrow(); j++) {
                  for (int ii = 0; ii < d_X.nrow(); ii++) {
                  for (int jj = 0; jj < d_Y.nrow(); jj++) {
                  G(i*d_Y.nrow()+j,ii*d_Y.nrow()+jj) = fabs(d_X(i, ii) - d_Y(j, jj));
                  };
                  };
                  };
                  };
                  return(G);
                  }
                  ')

所以我想这个解决方法也应该用C ++实现,以获得最佳结果(速度方面)?怎么做?

1 个答案:

答案 0 :(得分:1)

也许这个

Array ( [0] => 13.3R[1] => 4.2 )