Beyond the State-of-the-Art

最先端を超えたいと思ってる(大嘘)エンジニアのブログ

C++の線形代数ライブラリ 〜固有値問題の観点から〜

Qiitaからの移植です。

はじめに

C++ Advent Calendar 2019の21日目の記事です。当日公開に間に合いませんでした。申し訳ありません!!!

科学技術計算では線形代数はとても重要です。連立方程式、固有値問題、行列分解等の計算は至るところで登場します。線形代数ができないと科学技術計算はまともにできないと言っても過言ではありません。

そこでこの記事では、C++の線形代数ライブラリをいくつか紹介したいと思います。線形代数と一言に言っても、多種多様な計算があるので、ここでは個人的に馴染みのある固有値問題に絞って1、代表的なライブラリを紹介したいと思います。

ライブラリ紹介

CLAPACK

Fortran製の神ライブラリLAPACKを機械的にC言語に変換して作られたものです。LAPACKは固有値問題ソルバーがめちゃくちゃ充実していて、三重対角行列といった特殊な型の行列用のソルバーなんかもあります。

注意しないといけないのは配列のメモリ格納方式はFortranでは列優先であるが、C言語は行優先であることですね。CLAPACKでは行列を1次元配列で表現して使うと思うので、その違いは大事です。

関数の引数の数が多く、引数用にちゃんとメモリを確保する作業が大変というのが、自分の体感でした。

C++用のLapack++もありますが、しばらくの間メンテされてないようです。最後のリリースはC++11以前ですね。

CLAPACK以外では

等がありますが、調査不足のため後日改めて加筆修正します。

どちらのライブラリも密行列・疎行列が扱えて、 - ArmadilloはMatlabを意識したインターフェースになっている - Eigenは導入が簡単 といった特徴があるようです。

関連書籍


  1. 大学院時代は研究で物理学の数値計算をやっていて、固有値問題をよく解いていました。