-1

するように頼まれる宿題がありimplement a matrix class with that uses dynamic allocation to store its elementsます。クラスは加算と減算を許可する必要があります。要素を格納する必要がなくなったメモリを解放する必要があります。

私のアイデアは、マトリックス クラスと要素クラスの 2 つのクラスを作成することでした。要素クラスには 2 つのプロパティ (キーと次の要素へのアドレス) があります。問題は、マトリックスクラスのすべての要素を何らかの方法で格納するか、最初の要素へのアドレスのみを格納し、その最初の要素に基づいてすべての操作を行うべきかということです。私のアプローチについてどう思いますか?

4

3 に答える 3

0

「要素クラス」は必要ありません。「次の要素のアドレス」は必要ありません。IMO、あなたはこれを不必要に複雑にしています。

行列は 2D 配列です。
2D 配列をnumRows行とnumColumns列で表現する最も簡単な方法は、 size で 1D 配列を作成することnumRows * numColumnsです。
このような配列では、個々の要素 (rowIndex、columnIndex) のオフセットは次のように計算できますrowIndex * numCOlumns + columnIndex。ここで、両方のインデックスはゼロから始まります。そして、1D 配列を割り当てる方法を知っていますよね?

于 2013-11-12T11:07:22.213 に答える
0
Class Matrix:
{
private:
int**m;
public:
Matrix();//allocate memory
Realocate_memory(int**, int rows, int cols); //in case you want to modify the size of the matrix - this will be the most complicated part as you need to handle memory allocation.
Free(int**m, int rows, int cols);

// other methods....
}

ここでのトリッキーな部分は、使用されていない要素を削除することです-マトリックス構造を維持する必要があるため、いくつかの制約があります:-行/列全体のみを削除できます-データを移動することができます。未使用の要素の完全な行/列を使用します-しかし、個人的にはこのアプローチを気にしません

スペースが足りなくなったときに、より多くのメモリを割り当てることもできます。ここでは、動的配列アプローチを使用できます。 - 新しいマトリックスを 2 倍のサイズで割り当てます。

お役に立てれば!

于 2013-11-12T11:26:07.567 に答える
0

おそらく、あなたが言いたいことを言ったとしても、あなたが書いたものに人々が答えてくれることはないでしょう.

マトリックスは、そのメンバーを格納するために動的に割り当てる必要があります。

これを行う最善の方法は、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 つの (入れ子ではなく) ループで実行することにより、内部構造を利用できます。高さ * 幅のままであるアルゴリズムの複雑さは改善されませんが、ポインター演算により少し速くなる可能性があります。

于 2013-11-12T10:54:01.810 に答える