2017-09-04 9 views
0

나는 RcppEigen에서 가중 공분산을위한 함수를 작성하고있다. 단계 중 하나에서 행렬의 열 i와 열 j를 가져 와서 cwiseProduct를 계산하고 싶은데, 이는 어떤 종류의 벡터를 반환해야합니다. cwiseProduct의 출력은 여러 번 재사용 할 수있는 중간 변수로 들어갑니다. 문서에서 보면 cwiseProductCwiseBinaryOp을 반환하며 그 자체로는 두 가지 유형이 있습니다. 내 cwiseProduct 두 개의 열 벡터에서 작동, 그래서 올바른 반환 형식이 Eigen::CwiseBinaryOp<Eigen::ColXpr, Eigen::ColXpr>해야한다 생각했지만 오류 네임 스페이스에 ColXpr 아이겐고유 반환 형식의 .cwiseProduct?

#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; 
} 

나는 또한 스파 스 벡터에 저장하는 시도를라는 이름의 멤버를 얻을

나는 제품을 저장하지 않으면
Eigen::SparseVector<double> prod = X.col(i).cwiseProduct(X.col(j)); 

뿐만 아니라 컴퓨팅과 같은 있지만, 모든

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

에 저장하지 전혀 함수는 매우 빨리 반환되어 cwiseProduct는 비싼 함수가 아니라는 것을 암시합니다. SparseVector에 저장하면 기능이 매우 느려서 SparseVector가 올바른 반환 유형이 아니며 Eigen이 해당 유형으로 가져 오기 위해 추가 작업을하고 있다고 생각하게 만듭니다.

답변

3

Eigen은 표현 템플릿을 사용하므로, 표현식을 지정하지 않으면 본 표현식은 본질적으로 no-op입니다. 귀하의 경우에는 SparseVector에 할당하는 것이 옳은 일입니다. 속도와 관련하여 컴파일러 최적화를 ON으로 컴파일하십시오 (예 : -O3).

그럼에도 불구하고 전체 계산을 더 빨리 작성할 수있는 방법이 있다고 생각합니다. 예를 들어 X.col(i).cwiseProduct(X.col(j))이 모두 비어 있지 않습니까? 그렇지 않으면 두 번째 루프를 다시 작성하여 겹치는 열의 스파 스 집합에서만 반복해야합니다. 효율적인 매트릭스 제품을 활용하기 위해 루프를 상호 교환 할 수도 있습니다.