(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>
int main()
{
//mat1
Eigen::MatrixXd mat1(3, 5);
for (int i = 0; i < mat1.rows(); i++)
{
for (int j = 0; j < mat1.cols(); j++)
{
mat1(i, j) = (double)i + (double)j;
}
}
std::cout << mat1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//vec1
Eigen::VectorXd vec1 = Eigen::VectorXd::LinSpaced(5, 1, 5);
std::cout << vec1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//sin(cos, exp, logも同様に演算可能)
std::cout << mat1.array().sin() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行列からベクトルを減算
std::cout << mat1.rowwise() - vec1.transpose() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//全ての要素の和(sum)、積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)
std::cout << mat1.sum() << "," << mat1.prod() << "," << mat1.mean() << ","
<< mat1.maxCoeff() << "," << mat1.minCoeff() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
std::cout << mat1.rowwise().sum() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//列ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
std::cout << mat1.colwise().sum() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行の参照(row) 列の参照(col)も同様
std::cout << mat1.row(2) << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//ブロック参照(1行3列目から2x2行列を抜き出し)
std::cout << mat1.block(1, 3, 2, 2) << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//3x7行列にリサイズ(追加した列は0で初期化)
mat1.conservativeResizeLike(Eigen::MatrixXd::Zero(3, 7));
std::cout << mat1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//mat2の1番右の列からmat1の列数(7列)に、mat1全てを代入する
Eigen::MatrixXd mat2 = Eigen::MatrixXd::Ones(3, 8);//全て1で初期化
mat2.rightCols(mat1.cols()) = mat1.rightCols(mat1.cols());
std::cout << mat2 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
return 0;
}
#include <Eigen/Core>
int main()
{
//mat1
Eigen::MatrixXd mat1(3, 5);
for (int i = 0; i < mat1.rows(); i++)
{
for (int j = 0; j < mat1.cols(); j++)
{
mat1(i, j) = (double)i + (double)j;
}
}
std::cout << mat1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//vec1
Eigen::VectorXd vec1 = Eigen::VectorXd::LinSpaced(5, 1, 5);
std::cout << vec1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//sin(cos, exp, logも同様に演算可能)
std::cout << mat1.array().sin() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行列からベクトルを減算
std::cout << mat1.rowwise() - vec1.transpose() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//全ての要素の和(sum)、積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)
std::cout << mat1.sum() << "," << mat1.prod() << "," << mat1.mean() << ","
<< mat1.maxCoeff() << "," << mat1.minCoeff() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
std::cout << mat1.rowwise().sum() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//列ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
std::cout << mat1.colwise().sum() << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//行の参照(row) 列の参照(col)も同様
std::cout << mat1.row(2) << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//ブロック参照(1行3列目から2x2行列を抜き出し)
std::cout << mat1.block(1, 3, 2, 2) << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//3x7行列にリサイズ(追加した列は0で初期化)
mat1.conservativeResizeLike(Eigen::MatrixXd::Zero(3, 7));
std::cout << mat1 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
//mat2の1番右の列からmat1の列数(7列)に、mat1全てを代入する
Eigen::MatrixXd mat2 = Eigen::MatrixXd::Ones(3, 8);//全て1で初期化
mat2.rightCols(mat1.cols()) = mat1.rightCols(mat1.cols());
std::cout << mat2 << std::endl;
std::cout << "-------------------------------------------------------------" << std::endl;
return 0;
}
3.実行結果
・行列からベクトルを減算
・全ての要素の和(sum)、積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)
・行ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
・列ごとの和(sum) 積(prod)、平均(mean)、最大(maxCoeff)、最小(minCoeff)も同様
・行の参照(row) 列の参照(col)も同様
・ブロック参照(1行3列目から2x2行列を抜き出し)
・3x7行列にリサイズ(追加した列は0で初期化)
・mat2の1番右の列からmat1の列数(7列)に、mat1全てを代入する
4.参考文献
【C++】Eigen関数一覧
Eigen ー C++で線形代数を!(2)
c – 新しい値にゼロ値を指定したconservativeResize()
Is there a way to insert row/column in matrix (Eigen C++)?
0 件のコメント:
コメントを投稿