このブログを検索

2019年9月15日日曜日

【C++】 Eigen行列の初期化

【C++】 Eigen行列の初期化
(2019年9月15日)


■使用ソフト
・Visual Studio Community 2019


■言語
・C/C++


■Windows SDK バージョン
・10.0.17763.0
 ※Windows SDK バージョンの変更方法


■使用ライブラリ
・Eigen 3.3.7
 ※Eigen行列計算ライブラリ導入方法


■手順
1.コンソールアプリを作成する。
新しいプロジェクトの作成→コンソールアプリ→プロジェクト名と場所を指定して作成

2.C++ファイル(.cpp)を以下のとおり変更する。
#include <iostream>
#include <Eigen/Core>
#include <random>

int main()
{
    //全ての値が0の3x5行列
    Eigen::MatrixXd mat1 = Eigen::MatrixXd::Zero(3, 5);
    std::cout << mat1 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //全ての値が1の3x5行列
    Eigen::MatrixXd mat2 = Eigen::MatrixXd::Ones(3, 5);
    std::cout << mat2 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //全ての値が7の3x5行列
    Eigen::MatrixXd mat3 = Eigen::MatrixXd::Constant(3, 5, 7);
    std::cout << mat3 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //5x5の単位行列
    Eigen::MatrixXd mat4 = Eigen::MatrixXd::Identity(5, 5);
    std::cout << mat4 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //全ての値が乱数の3x5行列(範囲-1.0~1.0)
    Eigen::MatrixXd mat5 = Eigen::MatrixXd::Random(3, 5);
    std::cout << mat5 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //任意の乱数の3x5行列(int型)
    std::random_device seed;
    std::mt19937 random(seed());
    std::uniform_int_distribution<> number(1, 6);//int型の1~6の乱数
    Eigen::MatrixXd mat6 = Eigen::MatrixXd::Zero(3, 5).unaryExpr([&](double dummy) {return number(random); });
    std::cout << mat6 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //任意の乱数の3x5行列(double型)
    std::random_device seed2;
    std::mt19937 random2(seed2());
    std::uniform_real_distribution<> number2(1, 6);//double型の1~6の乱数
    Eigen::MatrixXd mat7 = Eigen::MatrixXd::Zero(3, 5).unaryExpr([&](double dummy) {return number2(random2); });
    std::cout << mat7 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    //要素の直接参照
    Eigen::MatrixXd mat8(3, 5);
    for (int i = 0; i < mat8.rows(); i++)
    {
        for (int j = 0; j < mat8.cols(); j++)
        {
            mat8(i, j) = i + j;
        }
    }
    std::cout << mat8 << std::endl;

    std::cout << "-------------------------------------------------------------" << std::endl;

    return 0;
}

3.実行結果
・全ての値が0の3x5行列
・全ての値が1の3x5行列
・全ての値が7の3x5行列
・5x5の単位行列
・全ての値が乱数の3x5行列(範囲-1.0~1.0)
・任意の乱数の3x5行列(int型)
・任意の乱数の3x5行列(double型)
・要素の直接参照

4.参考文献
ベクトル/行列演算の定番ライブラリEigen

【C++】Eigen関数一覧

Eigen ー C++で線形代数を!(2)

Eigen matrix library filling a matrix with random float values in a given range

0 件のコメント:

コメントを投稿