2017-12-25 52 views
0

私はCigenで作成した行列をEigenで作成していますが、その行列の列を参照によって関数に渡したいと思います。新しいものを作り出すことなく。C++ Eigen:行列の列を参照によって関数に渡す

これは私のサンプルコード上記のコードで

int changeTwo(Eigen::Ref<Eigen::ArrayXd> f) { 
    for (int i = 0; i < 10; i++) { 
     f(i) = 2; 
    } 
} 

ある、fは行列の列となり、私は例えば2にその列の最初の10個の要素を変更することを望む、私が

note: this candidate was rejected because at least one template argument could not be deduced

:私はこのエラーを取得するしかし

int main(int argc, const char * argv[]) { 

    Eigen::MatrixXd randomMat = Eigen::MatrixXd::Random(1000,2); 
    changeTwo(randomMat.col(0)); 
} 

:このような機能を実行するために願っています

私はこのような列を渡そうとしました:changeTwo(randomMat.col(0).array());、しかしそれは同じエラーをもたらしました。

何がうまくいかなかったかのヒントを得ることができますか?

+1

[再現することはできません](HTTPS:/ /gist.github.com/anonymous/c882eaf23d21f35dbcdb9dae23614bfe)(固有3.3.4)。 –

+0

私はアンリ・メンケと同じ結果を得ました。同じ結果を再現することはできません。上記のスニペットをコンパイルして実行することができました。サンプルサイズを小さくして(20,2)、関数呼び出しの前後に印刷しました。それは最初の10個の要素を十分に変更したことになります。 –

答えて

1

Win7 64ビットを実行しているインテルクアッドコアエクストリームで私のIDE用MS:Visual Studio 2017 CEをダウンロードしてセットアップしました。私はこれをx86版としてコンパイルしました。 私は同じエラーを再現できませんでした:私はHenri Menkeと合意しています。私はコンパイルして、エラーなしでこれを実行することができたし、ここに私のコードです:

#include <iostream> 
#include <fstream> 

#include <Eigen/Eigen> // force to include full lib 

using Eigen::MatrixXd; 

void changeTwo(Eigen::Ref<Eigen::ArrayXd> f) { 
    for (int i = 0; i < 10; i++) { 
     f(i) = 2; 
    } 
} 

int main() { 
    std::ofstream out; 

    Eigen::MatrixXd randomMat = Eigen::MatrixXd::Random(20, 2); 
    std::cout << randomMat << std::endl; 
    std::cout << std::endl; 

    out.open("EigenResults.txt"); 
    out << randomMat << std::endl; 
    out << std::endl; 

    changeTwo(randomMat.col(0)); 
    std::cout << randomMat << std::endl; 
    out << randomMat << std::endl; 

    out.close(); 

    std::cout << "\nPress any key and enter to quit." << std::endl; 
    char q; 
    std::cin >> q; 

    return 0; 
} 

出力: - コンソールから& EigenResults.txt

-0.997497 0.97705 
    0.127171 -0.108615 
-0.613392 -0.761834 
    0.617481 -0.990661 
    0.170019 -0.982177 
-0.0402539 -0.24424 
-0.299417 0.0633259 
    0.791925 0.142369 
    0.64568 0.203528 
    0.49321 0.214331 
-0.651784 -0.667531 
    0.717887 0.32609 
    0.421003 -0.0984222 
0.0270699 -0.295755 
    -0.39201 -0.885922 
-0.970031 0.215369 
-0.817194 0.566637 
-0.271096 0.605213 
-0.705374 0.0397656 
-0.668203 -0.3961 

     2 0.97705 
     2 -0.108615 
     2 -0.761834 
     2 -0.990661 
     2 -0.982177 
     2 -0.24424 
     2 0.0633259 
     2 0.142369 
     2 0.203528 
     2 0.214331 
-0.651784 -0.667531 
    0.717887 0.32609 
    0.421003 -0.0984222 
0.0270699 -0.295755 
    -0.39201 -0.885922 
-0.970031 0.215369 
-0.817194 0.566637 
-0.271096 0.605213 
-0.705374 0.0397656 
-0.668203 -0.3961