2016-11-05 47 views
1

我在下面的一段代碼中遇到問題,經過一些研究,我在單獨的一行中單獨列出了問題,但不知道現在如何解決該問題。Eigen稀疏LU解算器返回值

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,長長>>':無

適當的默認構造函數我怎樣才能得到的結果稀疏,密集向量(因爲它不應該是不同於在RHS稀疏)。矩陣大小(可能)很大,所以額外的副本會令人不快。
變量_Result顯然是稀疏的,但是對稀疏或密集向量(使用可用的方法toDense()可能會生成副本)都無效(無論是否投射)。

回答

1

儘管SparseLU::solve接受稀疏矩陣作爲rhs,但沒有特殊的路徑,因爲正如你也注意到的,在大多數情況下,結果是無論如何都要定義的。所以在內部,如果rhs是一個稀疏矩陣,那麼在實際求解之前它會內部轉換爲密集向量。數字零點然後被丟棄以輸出一個稀疏矩陣。所以在你的情況下,最好將Rhs複製到VectorXcd,並讓Solve也返回緻密VectorXcd

要回答的編譯錯誤,那就是在本徵的問題(編輯:固定在變更80c2b4346260)。如果您仍想堅持使用稀疏的rhs和結果,那麼您可以通過將Ref<const SparseVectorC>替換爲Ref<const SparseMatrixT>來解決此問題。與使用SparseVectorC相比,不會有任何開銷。