c++ - 是否有(足够快的)解决方法来乘以超出内存限制的矩阵?

标签 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 需要合理的时间也很重要。在 nm 小于一百的情况下,我使用以下函数来加速计算 G:

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++ 实现以获得最佳结果(速度方面)?怎么做?

最佳答案

也许是这样

A <- numeric(m*n)
for(i in 1:n) {
  for (j in 1:n) {
    A[((i-1)*m+1):(i*m)]= A[((i-1)*m+1):(i*m)] + abs(d_Y-d_X[i,j])%*%U[((j-1)*m+1):(j*m)]
  }
}

关于c++ - 是否有(足够快的)解决方法来乘以超出内存限制的矩阵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35280251/

相关文章:

c++ - 代码在 Visual Studio 中编译良好,但在使用 g++ 的 Unix 终端中编译不佳。我在多维 vector 处出错。为什么?

c# - Visual Studio 构建期间出现 PostSharp OutOfMemoryException

c++ - 运算符重载 C++

c++ - 当我用 libgcc 替换 libstdc++ 时,为什么我的 C++ 程序可以正确链接

r - ggplot2scale_fill_gradient2不显示中间颜色

r - 子集 POSIXct,丢失时区

php - Azure SDK for php blob 下载导致内存不足

java - Buttons背景引起的OutOfMemory

php - 从 PHP 调用已编译的 C++ 可执行文件以创建套接字

r - 在knitr或pander输出中保留表的名字吗?