これはあなたが使用すべき答えです...したがって、これを解決する良い方法は、struct
またはを作成しclass
て配列をラップすることです(まあ、データのバッファ-私はを使用しますstd::vector
)。のような署名の代わりに、次のようなtimes(A, b, c, m, n)
構文を使用します。
Matrix<4,4> M;
ColumnMatrix<4> V;
ColumnMatrix<4> C = M*V;
ここで、M の幅/高さは<4,4>
数値です。
Matrix クラスの簡単なスケッチは次のようになります (やや不完全 -- たとえば、const アクセスがないなど)。
template<size_t rows, size_t columns>
class Matrix
{
private:
std::vector<double> values;
public:
struct ColumnSlice
{
Matrix<rows,columns>* matrix;
size_t row_number;
double& operator[](size_t column) const
{
size_t index = row_number * columns + column;
Assert(matrix && index < matrix->values.size());
return matrix->values[index];
}
ColumnSlice( Matrix<rows,columns>* matrix_, size_t row_number_ ):
matrix(matrix_), row_number(row_number_)
{}
};
ColumnSlice operator[](size_t row)
{
Assert(row < rows); // note: zero based indexes
return ColumnSlice(this, row);
}
Matrix() {values.resize(rows*columns);}
template<size_t other_columns>
Matrix<rows, other_columns> operator*( Matrix<columns, other_columns> const& other ) const
{
Matrix<rows, other_columns> retval;
// TODO: matrix multiplication code goes here
return std::move(retval);
}
};
template<size_t rows>
using ColumnMatrix = Matrix< rows, 1 >;
template<size_t columns>
using RowMatrix = Matrix< 1, columns >;
上記は、コンパイラにない可能性のある C++0x 機能を使用しており、これらの機能がなくても実行できます。
このすべてのポイントは?数学のように見え、C++ で正しいことを行う数学を持つことができますが、それは非常に効率的であり、それが「適切な」C++ の方法です。
std::vector
慣れている場合は、C++ のいくつかの機能 (配列メモリ管理の処理など) を使用して、C に似た方法でプログラミングすることもできます。しかし、それはこの質問に対する別の答えです。:)
(注: 上記のコードはコンパイルされておらず、完全な Matrix 実装でもありません。ただし、テンプレート ベースの Matrix 実装が世の中に出回っています。)