2016-11-05 2 views
1

다음 코드 조각에 문제가 있습니다. 몇 가지 조사를 한 후에 별도의 줄에서 문제를 찾아 냈지만 지금 해결 방법을 모르겠습니다.Eigen Sparse LU solver 반환 값

typedef double ComplexType; 

typedef std::complex<ComplexType> Complex; 

typedef Eigen::SparseMatrix<Complex, Eigen::ColMajor, long long> SparseMatrixT; 

typedef Eigen::SparseVector<Complex, Eigen::ColMajor, long long> SparseVectorC; 

typedef Eigen::SparseLU<SparseMatrixT, Eigen::COLAMDOrdering< long long>> SolverT; 


SparseVectorC Solve(const Eigen::Ref<const SparseVectorC>& Rhs) 
{ 
    auto _Result = m_LU.solve(Rhs); //SolverT m_LU; defined and "prepared" elsewhere 

    SparseVectorC Result = _Result; // cause error C2512 

    return Result; 
} 

오류 표시

\ 고유 \ SRC \ 코어 \의 solve.h (125) : 오류 C2512 : '아이겐 :: 내부 :: 평가자 < 아이겐 :: 스파 스 벡터 < 컴플렉스, 0, 오래 오래>> ':

가 없습니다 적절한 기본 생성자 내가 조밀 한 벡터의 스파 스 중 하나의 결과를 얻을 수있는 방법 (그것이 우 달리 스파 스 있어야되지 않기 때문에). 행렬 크기가 너무 커서 추가 복사본이 불쾌 할 수 있습니다.
_Result 변수가 드문 드문 드문 드문 드문 드문 있지만 sparse 또는 dense 벡터 (사용 가능성이있는 메서드 인 toDense()가 사본을 생성 할 수 있음)를 지정하지 않아도 작동하지 않습니다.

답변

1

SparseLU::solve은 희소 행렬을 rhs로 허용하지만 사용자가 알았 듯이 어쨌든 결과가 다르므로 특별한 경로가 없습니다. 그래서 내부적으로, rhs가 드문 드문 한 행렬이라면, 실제적으로 풀리기 전에 내부적으로 dense vector로 변환됩니다. 수치 0은 드문 드문 행렬을 출력하기 위해 삭제됩니다. 따라서 귀하의 경우에는 RhsVectorXcd에 더 잘 복사하고 Solve은 밀도가 VectorXcd을 반환하도록하십시오.

컴파일 오류에 대한 대답은 Eigen (편집 : 변경 집합 80c2b4346260에서 수정 됨)의 문제입니다. 여전히 희소 한 rhs와 결과를 유지하려는 경우 Ref<const SparseVectorC>Ref<const SparseMatrixT>으로 바꾸면 해결할 수 있습니다. SparseVectorC을 사용할 때보 다 오버 헤드가 없습니다.