おそらく、あなたが言いたいことを言ったとしても、あなたが書いたものに人々が答えてくれることはないでしょう.
マトリックスは、そのメンバーを格納するために動的に割り当てる必要があります。
これを行う最善の方法は、2 次元ではなく、その割り当てを 1 次元にすることです。M * N 個の要素が必要なので、一度に M*N を割り当てます。
element( i, j ) を見つけるには、実際には element ( i * M ) + j です。
したがって、要素が double の場合、次のようなものがあります
class Matrix
{
private:
double * m_mem;
size_t m_width;
size_t m_height;
public:
Matrix( size_t width, size_t height );
~Matrix();
double operator()( size_t i, size_t j ) const
{
return m_mem[ i * m_width + j ];
}
double& operator()( size_t i, size_t j )
{
return m_mem[ i * m_width + j ];
}
size_t width() const
{
return m_width;
}
size_t height() const
{
return m_height;
}
Matrix(Matrix const& other ); // you implement
Matrix& operator=( Matrix const& other ); // you implement
};
- これらのメンバーを設定するための非 const である、operator() の 2 つのオーバーロードが必要になります。
- 境界チェックが必要な場合があります。
次のように割り当てます。
Matrix::Matrix( size_t width, size_t height ) :
m_mem( new double[width * height] ),
m_width( width ),
m_height( height )
{
}
したがって、無料:
Matrix::~Matrix()
{
delete [] m_mem;
}
3のルールを考えると、コピーと割り当てを管理する必要があります。
マトリックスの一部を解放することはできません。
Matrix をジェネリックにしたい場合は、テンプレートを作成する必要があります。しかし、テンプレートの書き方をまだ学んでいるかどうかはわかりません。
足し算と引き算には、クラス メンバーまたは以下を使用できます。
Matrix operator+( Matrix const& left, Matrix const& right )
{
assert( left.width == right.width );
assert( left.height == right.height );
Matrix sum( left.width, left.height );
for( size_t i = 0; i < left.width; ++i )
{
for( size_t j = 0; j < left.height; ++j )
{
sum( i, j ) = left( i, j ) + right( i, j );
}
}
return sum; // in C++11 return std::move(sum) and return-type Matrix&&
}
クラス メンバーを使用した (または演算子をフレンドにした) 場合は、1 次元配列のすべての要素を 1 つの (入れ子ではなく) ループで実行することにより、内部構造を利用できます。高さ * 幅のままであるアルゴリズムの複雑さは改善されませんが、ポインター演算により少し速くなる可能性があります。