2016-05-19 1 views
1

私は小さな問題がありますが、解決方法はわかりません。リファレンスでEigen :: Matrixを使用する方法

始めましょう: マルチスレッドを使用して大きなEigen Matrixで作業する必要があります。 各スレッドは行列にアクセスする必要があります。ディメンションはプログラムの実行中に指定されるので、main()内で宣言し、グローバルではなく宣言する必要があります。私は成功せずにさまざまなソリューションを試しました。私は "参照渡し"のようなものを検索しますが、このメソッドは固有行列では機能しません。 ここには小さな例があります。誰かが私にこの問題を解決する方法を教えてもらえますか?プログラムは高速でなければならないので、次のようなものが必要です: - 行列をファイルに保存し、各スレッドでファイルを読み込み、行列で作業し、行列をファイルに保存し、ファイルを再度読み込みます最善の方法、私は思う...;)誰かがより良い解決策を知っていますか? ありがとうございました!

void calc() { 
    // work on the Matrix 
} 

int main() { 
    Eigen::Matrix<bool, a, b> Mat; 
    // Start some thread(calc); 
    cout << Mat; 
} 
+1

だけで、それは 'マトリックスをタイプを使用している'参照してcalc'に 'Mat'を渡します& '。また、グローバルに宣言して 'Mat.resize(rows、cols); 'を呼び出すこともできますが、それは醜いです。 – ggael

答えて

0

Si!固有ベクトルを参照として渡すことができます。ここで

は作業例です:

#include <iostream> 
#include <Eigen/Dense> 

void calc(Eigen::MatrixXf& mat) { 
    mat = Eigen::MatrixXf::Constant(mat.rows(), mat.cols(), 1.0); 
} 

int main() { 
    Eigen::MatrixXf Mat; 
    Mat = Eigen::Matrix4f::Identity(); 
    std::cout << Mat << std::endl; 
    calc(Mat); 
    std::cout << Mat << std::endl; 
} 
  • 出力:

    1 0 0 0  
    0 1 0 0  
    0 0 1 0  
    0 0 0 1 
    
    1 1 1 1 
    1 1 1 1 
    1 1 1 1 
    1 1 1 1 
    
+0

ありがとうございました!これは小さな変更で動作します: これはスレッド付きの作業コードです(-lpthreadでコンパイルされます)。問題は、スレッドの初期化でstd :: ref(Mat)を使用しないことでした。 の#include の#include の#include ボイド計算値(固有:: MatrixXf&マット){ マット=固有:: MatrixXf ::定数(mat.rows()、mat.cols()、1.0) ; } int main(){ Eigen :: MatrixXf Mat; Mat = Eigen :: Matrix4f :: Identity(); std :: cout << Mat << std :: endl; std :: thread a(calc、std :: ref(Mat)); // calc(Mat); std :: cout << Mat << std :: endl; } – MttD

関連する問題