代码之家  ›  专栏  ›  技术社区  ›  JCWong

特征-返回类型。CWISE产品?

  •  0
  • JCWong  · 技术社区  · 7 年前

    我在RcppEigen中写了一个加权协方差的函数。在其中一个步骤中,我想取矩阵X的第I列和第j列,并计算cwiseProduct,它应该返回某种向量。cwiseProduct的输出将进入一个中间变量,该变量可以多次重用。从文件来看 cwiseProduct 返回a CwiseBinaryOp 它本身有两种类型。我的cwiseProduct在两个列向量上运行,因此我认为正确的返回类型应该是 Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr> 命名空间Eigen中没有名为ColXpr的成员

    #include <RcppEigen.h>
    // [[Rcpp::depends(RcppEigen)]]
    
    Rcpp::List Crossprod_sparse(Eigen::MappedSparseMatrix<double> X, Eigen::Map<Eigen::MatrixXd> W) {
      int K = W.cols();
      int p = X.cols();
    
      Rcpp::List crossprods(W.cols());
    
      for (int i = 0; i < p; i++) {
        for (int j = i; j < p; j++) {
          Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr> prod = X.col(i).cwiseProduct(X.col(j));
          for (int k = 0; k < K; k++) {
            //double out = prod.dot(W.col(k));
          }
        }
      }
      return crossprods;
    }
    

    我也试着把钱存到SparseVector里

    Eigen::SparseVector<double> prod = X.col(i).cwiseProduct(X.col(j));
    

    X.col(i).cwiseProduct(X.col(j));
    

    1 回复  |  直到 7 年前
        1
  •  5
  •   ggael    7 年前

    SparseVector 是正确的做法。关于速度,请确保编译时对编译器进行优化(如 -O3 ).

    尽管如此,我相信有一种更快的方法来编写整体计算。例如,你确定 X.col(i).cwiseProduct(X.col(j)) 是否非空?如果没有,则应重写第二个循环,以仅在重叠列的稀疏集上迭代。循环也可以互换以利用有效的矩阵乘积。