FrontPage  ページ一覧  検索  更新履歴  RSS  ログイン

Matrix

概要

命令

斜体は未実装

初期化

Matrix(row_size, column_size);

row_size行、column_size列の行列を生成します。

Matrix matrix(row_size, column_size);

要素アクセス

要素番号は1から始まります。10行の行列では添え字は1〜10が有効です。

double& operator()(int row, int column)
row行、column列の要素にアクセスします。参照と代入が可能です。
double d = matrix(row, column);
matrix(row, col) = d;
Matrix_Accesser operator() (Interval rows, Interval columns)
部分スライスを返す。スライスはROWS行COLS列の行列と等価に扱われる。
Interval row, col;
matrix(1<=row<10, 2<col<4) = 10;

演算子

matrix = Matrix
matrix = double
全要素への一括代入を行います。Matrixどうしの代入では行列どうしのサイズがあっている必要があります。
matrix + Matrix
matrix - Matrix
matrix * Matrix
行列同士の演算を行います。行列のサイズはそれぞれ適切なものである必要があります。行列による除算は未定義です。
matrix * ~Matrix
Matrixの行列が対応する要素どうしを乗算します。行列のサイズは両者等しい必要があります。
matrix + double
matrix - double
matrix * double
matrix / double
行列の各要素に対して実数を加減乗除します。

Matrixに対する演算子は内部的にはExpression Templateを採用しております。

変形関数

matrix.transpose()
転置行列を作成して返します。自身を転置するには以下のコードで実行します。
matrix = matrix.transepose()
Matrix& slide(int drow, int dcol)
行、列を指定した要素数だけずらします。
0 1 2
3 4 5

mtx.slide(1,0)

2 0 1
5 3 4
Matrix& rot90(int times=1)
90度回転します。引数に2を指定すると180度回転、3を指定すると270度回転します。
0 1 2
3 4 5

mtx.rot90(1)

3 0
4 1
5 2
Matrix& reshape(int rows, int cols)
行数と列数の異なる別の行列として再解釈します。この関数を実行する前後で要素数が変わってはいけません。
0 1 2
3 4 5

mtx.reshape(2,3)

0 1
2 3
4 5
Matrix& catRow(Matrix &mtx)
行を下に追加します。

mtx =

0 1 2
3 4 5

mtx2 =

6 7 8

mtx.catRow(mtx2) mtx =

0 1 2
3 4 5
6 7 8

その他の関数

int getRows()
行数を返します。
int getCols()
列数を返します。

既知のバグ

  • 自身込みの演算はかなり怪しい動作をする mtx = mtx*another; #=> ???
  • 計算途中のオブジェクトMatrix_Accesserにmatrix(Interval rows, Interval columns)を噛ますと動かない(動くようになる予定)

meshgrid

x座標の値を列に入れた行列、y座標の値を行に入れた行列をそれぞれ作成し、その変数名をx, yと置いてそのまま計算式を書くと要素ごとにその計算式が適用された行列が得られるという、matlabで用いられるテクニックを再実装したもの。

コード例

Interval row, col;
Matrix x = Matrix::mesh(5, 1<=col<=5); // colにx軸の数値範囲
Matrix y = Matrix::mesh(1<=row<=5, 5); // rowにy軸の数値範囲
std::cout << x << std::endl << std::endl << y;

Matrix result = sin(x/5.0*PI) *~ sin(y/5.0*PI); // *~は要素同士の乗算
std::cout << std::endl << std::endl << result;

メッシュグリッドに対応している関数

  • sin
  • cos
  • tan
  • exp
  • pow
  • sqrt

概要

  • 元はdouble。ほとんど変更なしに任意の元に変更可能だが、デフォルト指定がない。ImageMatrix<int>で実装可能だが、今のところその機能がない。
  • メモリ配置はいわゆる矩形型配列。
  • Expression Templeteの技法を採用。一時オブジェクトをいちいち生成しない。またExpression Templete一時オブジェクトをMatrixとほとんど区別なく扱える。
  • 内部アクセスはポインタベースで関数ベースではない。加算で80%の最適化、乗算で50%の最適化が完了。
  • Matlabの行列演算機能の40%(当社比)を実装。

特性値

  • 固有値、固有ベクトル
  • ノルム

特殊関数

double* getElementPtr()
メモリ実体がしない場合0を返す。部分行列や計算途中式には適用不可。

将来的目標

  • 任意の行・列のスライス
    • Interval::allの追加
    • matrix(double, Interval)で列ベクトルの切り出し
    • Matlabでの matrix( [2,8,4] , : ) # 2,8,4行の行ベクトルを組み合わせた行列 式のサポート
  • ベクトル
    • 1行の行列をベクトルとして扱う。VectorがMatrixの派生になる(よくあるVector->Matrix構造と逆)
  • リテラルイニシャライザ
    • matrix--(1,2)(0,5)(10,3) # ()を行を変えて書くと、見た目がわかりやすい。C++の規約で引数が31個までしか保証されないのが難。
  • 疎行列の特殊化
更新日時:2014/09/28 21:03:50
キーワード:[Class] [Math]
参照:[開発メモ] [(逆引き) なんでも] [Version History (2005-2006)] [リファレンスマニュアル]