/************************************************************************ * Matrix * * 要素の数が静的に決まる2次元行列クラス。 * 同じ要素数の2次元配列との演算もサポート。 * ただし、掛け算とInverse()は縦横同じ要素数でなければ爆弾。 * 基本的に例外なし、実行時チェックなしの速度重視クラス。 ************************************************************************/ #ifndef ATS_MATRIXXXX_H #define ATS_MATRIXXXX_H // ats_MatrixXxX.h #include #include #include namespace ats { template class Matrix3D; // 循環参照解決 // D = Dimension template class Matrix { friend Matrix3D; private: T_FLOAT m_matrix[D1][D2]; public: // Constructor / Destructor ----------------------------------------------------- Matrix() { Initialize(); } // boolをとるコンストラクタについて ---------------------------- // 普通に使えば、初期化は保証されているが、初期化しないという // 選択肢を提供する。これは派生を重ねる時に生じるコンストラク // タのオーバーヘッドを抑えるためである。 // ------------------------------------------------------------- Matrix(const bool init) { // 初期化するかしないかを選択する。 if(init){ Initialize(); } } Matrix(const T_FLOAT a[D1][D2]) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = a[i][j]; }} } // Copy Constructor Matrix(const Matrix& a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = a(i,j); }} } virtual ~Matrix() {} virtual void Initialize() { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = 0; }} } virtual Matrix& Inverse() { Matrix tmp(false); for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ tmp(i,j) = m_matrix[j][i]; }} return (*this = tmp); } // Getter / Setter --------------------------------------------------------- inline T_FLOAT& operator()(int a, int b) { return m_matrix[a][b]; } inline T_FLOAT operator()(int a, int b) const { return m_matrix[a][b]; } // 代入 --------------------------------------------------------------------- Matrix& operator=(const Matrix& a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = a(i,j); }} return *this; } Matrix& operator+=(const Matrix& a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] += a(i,j); }} return *this; } Matrix& operator-=(const Matrix& a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] -= a(i,j); }} return *this; } Matrix& operator*=(const Matrix& a) { Matrix tmp; for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ for(int m=0; m < D1; m++){ tmp(i,j) += m_matrix[i][m] * a(m,j); }}} return (*this = tmp); } // 演算 ---------------------------------------------------------------------- Matrix operator+(const Matrix& a) const { Matrix tmp(false); for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ tmp[i][j] = m_matrix[i][j] + a(i,j); }} return tmp; } Matrix operator-(const Matrix& a) const { Matrix tmp(false); for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ tmp(i,j) = m_matrix[i][j] - a(i,j); }} return tmp; } Matrix operator*(const Matrix& a) const { Matrix tmp; for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ for(int m=0; m < D1; m++){ tmp(i,j) += m_matrix[i][m] * a(m,j); }}} return tmp; } // 代入(値) ---------------------------------------------------------------- Matrix& operator=(const T_FLOAT a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = a }} return *this; } // 代入(配列) ------------------------------------------------------------- Matrix& operator=(const T_FLOAT a[D1][D2]) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] = a[i][j]; }} return *this; } Matrix& operator+=(const T_FLOAT a[D1][D2]) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] += a[i][j]; }} return *this; } Matrix& operator-=(const T_FLOAT a[D1][D2]) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ m_matrix[i][j] -= a[i][j]; }} return *this; } Matrix& operator*=(const T_FLOAT a[D1][D2]) { Matrix tmp; for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ for(int m=0; m < D1; m++){ tmp(i,j) += m_matrix[i][m] * a[m][j]; }}} return (*this = tmp); } // 演算(配列) -------------------------------------------------------------- Matrix operator+(const T_FLOAT a[D1][D2]) const { Matrix tmp(false); for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ tmp(i,j) = m_matrix[i][j] + a[i][j]; }} return tmp; } Matrix operator-(const T_FLOAT a[D1][D2]) const { Matrix tmp(false); for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ tmp(i,j) = m_matrix[i][j] - a[i][j]; }} return tmp; } Matrix operator*(const T_FLOAT a[D1][D2]) const { Matrix tmp; for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ for(int m=0; m < D1; m++){ tmp(i,j) += m_matrix[i][m] * a[m][j]; }}} return tmp; } }; template std::ostream& operator<<(std::ostream& out, const Matrix& a) { for(int i=0; i < D1; i++){ for(int j=0; j < D2; j++){ out << a(i, j) << ' '; } out << '\n'; } return out; } } #endif // #ifndef ATS_MATRIXXXX_H