[Eigen]Eigenでautoは禁止なのか?

六花です。
たまたま以下のサイトを拝読して、「そうだっけ?」と思ったので調べてみました。

混ぜるな危険! Eigenとauto
https://qiita.com/sakisakira/items/7c6952e59e958cefe7fa

検証環境:
Windows 10
Microsoft Visual Studio Community 2019 Version 16.8.6
Eigen version : 3.3.9

ソースコードはほとんどリンク先の方のもので、少しだけ書き換えました。


#include <iostream>
#include <complex>
#include "../Eigen/Eigen/Core"
#include "../Eigen/Eigen/LU"
#include <typeinfo>

using namespace std;
using namespace Eigen;

int main(void) {
    std::cout << "Eigen version : " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << std::endl;

    MatrixXd m0(2, 2);
    m0 << 1, 2, 3, 4;

    const auto m1 = m0 * m0.inverse() * m0;
    cout << "m1:\n" << m1 << endl;

    const MatrixXd m2 = m0 * m0.inverse() * m0;
    cout << "m2:\n" << m2 << endl;

    while(true){}
}

10回くらい試してみましたが、m1もm2も同じ値になりました。


#include <iostream>
#include <complex>
#include "../Eigen/Eigen/Core"
#include "../Eigen/Eigen/LU"
#include <typeinfo>

using namespace std;
using namespace Eigen;

int main(void) {
    std::cout << "Eigen version : " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << std::endl;

    MatrixXd m0(2, 2);
    m0 << 1, 2, 3, 4;

    auto counterFalse = 0;
    for (auto i = 0; i < 10000; ++i)
    {
        const auto m1 = m0 * m0.inverse() * m0;
        const MatrixXd m2 = m0 * m0.inverse() * m0;

        bool isFalse = false;
        for (auto x = 0; x < 2; ++x)
        {
            for (auto y = 0; y < 2; ++y)
            {
                if (m1(y, x) != m2(y, x)) { isFalse = true; }
            }
        }
        if (isFalse) { ++counterFalse; }
    }

    cout << "一致しない数 : " << counterFalse << endl;

    while(true){}
}

このソースコードで検算してみましたが、やはり同じ値になりました。
環境が全然違いますし、また5年以上前の記事なので比較は難しいですが、現時点ではautoに値を代入しても問題ないようです。
計算の基本的な部分は、定期的に検算した方が良いですね。

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です