このブログでは、Eigen C++ テンプレートライブラリを C++Builder および VCL で使用する方法について説明いたします。
Table of Contents
Eigen C++テンプレートライブラリとは何ですか?
Eigen は、線形代数 (行列、ベクトル、数値ソルバー、および関連アルゴリズム) 向けの C++ テンプレートライブラリです。やさしい線形代数入門はこちらを参照ください。EigenはC++標準ライブラリ以外のライブラリには依存しておらず、つまり必要なのはC++標準ライブラリのみです。またEigenはヘッダー ファイルのみで構成されているため、事前にコンパイルする必要はありません。リンク先のバイナリライブラリも設定されたヘッダー ファイルもありません。 Eigen はヘッダーで定義された純粋なテンプレートライブラリとなります。
線形代数とは?
線形代数は、直線や平面、ベクトル空間、線形変換に必要な写像を研究する学問です。比較的歴史は浅く、1800年代に連立一次方程式の未知数を求めるために定式化されました。一次方程式は、いくつかの項が未知である一連の項と数学的演算にすぎません。(例: y = 4 * x + 1)
このような方程式は、2 次元グラフ上の線を記述するという意味で一次方程式です。この線は、方程式やモデルがyの値に何を与えるかを調べるために、未知数xに異なる値を代入することで得られます。
Eigen を使用するには、こちらからEigenのソースコードをダウンロードして展開してください。Eigen サブディレクトリ内のヘッダー ファイルは、Eigen を使用してプログラムをコンパイルするために必要な唯一のファイルです。 ヘッダーファイルはすべてのプラットフォームで共通です。 CMake を使用したり、何かをインストールしたりする必要はありません。
C++BuilderでEigenライブラリを使用するには?
(1)こちらからEigenのソースコードをダウンロードしてください。下図のリンクをクリックすると、zipファイルがダウンロードできます。
(2) root.zipという名前のファイルがダウンロードされますので、任意のパスに展開してください。
例えば、ここでは展開後のrootというフォルダ名をEigen3に変更し、C:¥Users¥Public¥Documentsフォルダ以下にコピーします。コピー後のEigenライブラリのルートパスは
C:¥Users¥Public¥Documents¥Eigen3 とします。
(3) C++BuilderのインクルードパスとライブラリパスにEigenソースフォルダを追加します。IDEメニューのツール|オプション|言語|C++|パスとディレクトリのダイアログで設定できます。
(4) システムインクルードパスにC:¥Users¥Public¥Documents¥Eigen3を追加します。
下図は、Windows32ビット向けのClangコンパイラ(bcc32c)での設定例:
(5) ライブラリパスにC:¥Users¥Public¥Documents¥Eigen3¥EigenとC:¥Users¥Public¥Documents¥Eigen3¥Eigen¥srcを追加します。
下図は、Windows32ビット向けのClangコンパイラ(bcc32c)での設定例:
Windows 64ビット向けのClangコンパイラ(bcc64)でも同様の方法で設定できます。ただし、従来のBorlandコンパイラ(bcc32)には未対応で、インクルードパスとライプラリパスにEigenのライブラリパスを設定してもビルドできませんので、どうかご注意ください。
なお、Eigenライブラリのパスは、上記の設定方法以外にもIDEメニューのプロジェクト|オプション|ビルド|C++(共通オプション)のインクルードパスとライブラリパスに設定する方法でも可能です。下図は、その設定例となります。
C++BuilderでEigenライブラリを使用したチュートリアル
それでは、実際にC++Builder 12でEigenライブラリを使用した簡単なVCLアプリケーションを作成してみましょう。
(1)C++BuilderのIDEメニューからファイル|新規作成|VCLアプリケーション-C++Builder を選択し、プロジェクトを新規作成
(2)新規作成したプロジェクトを保存
(3)VCLプロジェクトからEigenライブラリを使用するには、C++Builderのインクルードパスとライブラリパスに設定しておく必要があります。もしEigenライブラリのパスを設定していない場合は、前節の「C++BuilderでEigenライブラリを使用するには?」をご参照ください。
(4)Eigenライブラリを使用するプログラムを記述する際は、以下のようにEigen/Denseをインクルードします。
1 |
#include <Eigen/Dense> |
上記のコードによりEigen Matrixクラス(密行列と配列の操作)を使用することができます。
さらにEigen IOFormatクラスを使用するには、以下のようにコードを定義します。
1 2 |
using Eigen::MatrixXd; using Eigen::IOFormat; |
(5)フォーム上にTLabelコンポーネントを1個、TMemoコンポーネントを1個、そしてTButtonを1個 配置します。
(6) Button1のOnClickイベントハンドラに処理を実装します。
実装するコードは、以下の通りです。
Label1.Captionに、使用するEigenのバージョンを表示します。
そして以下の手順で行列を生成します。
- double の 3*3 行列を定義する
- MatrixXd m(3,3);
- 行列に -1 から +1 までの乱数を入力する
- m.setRandom(3,3);
- +と- 、そして * を使用して 3 つのマトリックスの項目を変更する
- m(0,2) = m(0,0) + m(0,1);
- m(1,2) = m(1,0) – m(1,1);
- m(2,2) = m(2,0) * m(2,1);
- 最後に行列の結果をMemo1へ出力する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
void __fastcall TForm1::Button1Click(TObject *Sender) { // App adapted from Eigen documentation for VCL app // display Eigen version number Label1->Caption = "Using Eigen version: " + IntToStr(EIGEN_WORLD_VERSION) + "." + IntToStr(EIGEN_MAJOR_VERSION) + "." + IntToStr(EIGEN_MINOR_VERSION); // define a 3x3 matrix of doubles MatrixXd m(3,3); // Fill matrix with random numbers between -1 and +1 m.setRandom(3,3); // Change three matrix items using + - and * m(0,2) = m(0,0) + m(0,1); m(1,2) = m(1,0) - m(1,1); m(2,2) = m(2,0) * m(2,1); // output matrix using strings Memo1->Lines->Clear(); Memo1->Lines->Text = ConvertToString(m).c_str(); } |
(7) C++Builderのプロジェクトをビルドします。
もし以下のようなエラーが表示される場合は、
[bcc32c 致命的エラー] Unit1.cpp(6): ‘Eigen/Dense’ file not found
Eigenソースコードのライブラリパスが間違っていますので、前節の「C++BuilderでEigenライブラリを使用するには?」をご参照いただき、正しいパスを設定してください。
(8)ビルドが完了したら、アプリケーションを実行し、Buttonを押してください。
実行した画面の結果は、以下の通りです。
以下は、このプロジェクトの完全なソースコードです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
#include <vcl.h> #pragma hdrstop #include <Eigen/Dense> using Eigen::MatrixXd; using Eigen::IOFormat; #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // create string stream from Eigen Matrix static std::string ConvertToString(const Eigen::MatrixXd& mat){ std::stringstream ss; IOFormat CleanFmt(Eigen::FullPrecision, 0, ", ", "n", "[", "]"); ss << mat.format(CleanFmt); return ss.str(); } void __fastcall TForm1::Button1Click(TObject *Sender) { // App adapted from Eigen documentation for VCL app // display Eigen version number Label1->Caption = "Using Eigen version: " + IntToStr(EIGEN_WORLD_VERSION) + "." + IntToStr(EIGEN_MAJOR_VERSION) + "." + IntToStr(EIGEN_MINOR_VERSION); // define a 3x3 matrix of doubles MatrixXd m(3,3); // Fill matrix with random numbers between -1 and +1 m.setRandom(3,3); // Change three matrix items using + - and * m(0,2) = m(0,0) + m(0,1); m(1,2) = m(1,0) - m(1,1); m(2,2) = m(2,0) * m(2,1); // output matrix using strings Memo1->Lines->Clear(); Memo1->Lines->Text = ConvertToString(m).c_str(); } //--------------------------------------------------------------------------- |
C++BuilderとVCLでEigen C++テンプレートライブラリを使用したチュートリアルは以上となります。
C++ BuilderおよびVCLでEigen C++テンプレートライブラリを使用するには、こちらからC++ Builder 12のトライアル版(30日間無料)をダウンロードし、インストールしてみてください!
関連ドキュメント
- やさしい線形代数入門
- Eigen Matrixクラス(密行列と配列の操作)
- Eigen IOFormatクラス
- Eigen Getting Startedのサンプル
- Matrixクラスに関する長いチュートリアル
Design. Code. Compile. Deploy.
Start Free Trial Upgrade Today
Free Delphi Community Edition Free C++Builder Community Edition