【GSLで数値計算4】
行列の積の計算
本稿では、GSL(GNU科学技術計算ライブラリ)を用いて行列の積を行うサンプルプログラムを示します。→ GNU科学技術計算ライブラリのインストール(Windows, VisualStudio2017)はこちら
//////////////////////////////////////////////////////////////////////// // 行列の積と和の計算 //////////////////////////////////////////////////////////////////////// //https://www.gnu.org/software/gsl/doc/html/linalg.html#examples #include#include #include #include #include int main(void) { // 行列の準備 double a_data[] = { 0.11, 0.12, 0.13, 0.21, 0.22, 0.23 }; double b_data[] = { 1011, 1012, 1021, 1022, 1031, 1032 }; double c_data[] = { 0.00, 0.00, 0.00, 0.00 }; //GSL行列インスタンスの生成 gsl_matrix_view A = gsl_matrix_view_array(a_data, 2, 3); gsl_matrix_view B = gsl_matrix_view_array(b_data, 3, 2); gsl_matrix_view C = gsl_matrix_view_array(c_data, 2, 2); // C= \alpha {\rm op}(A) {\rm op}(B) + \beta C gsl_blas_dgemm( CblasNoTrans, // 行列Aの変換 {\rm op}(A)(※1) CblasNoTrans, // 行列Bの変換 {\rm op}(B)(※1) 1.0, // alpha &A.matrix, // A &B.matrix, // B 0.0, // beta &C.matrix // 戻り値 ); //(※1)変換なし:CblasNoTrans, 転置:CblasTrans, エルミート転置:CblasConjTrans //計算結果の表示 std::cout << "計算結果の表示1" << std::endl; std::cout << "[ " << C.matrix.data[0] << " " << C.matrix.data[1] << std::endl; std::cout << " " << C.matrix.data[2] << " " << C.matrix.data[3] << " ]" << std::endl; std::cout << "計算結果の表示2" << std::endl; std::cout << "[ " << c_data[0] << " " << c_data[1] << std::endl; std::cout << " " << c_data[2] << " " << c_data[3] << " ]" << std::endl; std::string s; std::cin >> s; return 0; }
実行結果
(※)計算結果を格納するC.matrix.dataとCを生成するために準備した配列c_dataは同じメモリを参照しています。