1

C++ の割り当てに関して、非常に腹立たしい問題があります。

動的メモリ割り当てを使用して、C++ 内で行列乗算を実行する必要があります。ほとんどの場合、プログラムは正常に動作しますが、代入演算子と (おそらく) 行列の乗算は動作しないようです。

基本的に、実行時に私のプログラムは問題なく行列の乗算を実行しますが、返された Matrix オブジェクトはそれほど大きなパフォーマンスを発揮していないようです!

Matrix.h ファイルに関連するコードは次のとおりです。

    class Matrix
{

    //Pointer matrix
    int **matrix;

    //height and width of the matrix
    int height;
    int width;

    //declaring all public functions to be included in the Matrix object
public:
    Matrix();
    Matrix(int, int);
    ~Matrix();
    void constructor(int, int);
    void destruct();
    int getHeight() const;
    int getWidth() const;
    int getElement(int, int) const;
    void setElement(int, int, int);
    int* getColumn(int) const;
    void setColumn(int, int*);
    int* getRow(int) const;
    void setRow(int, int*);
    void fillMatrix(int);
    Matrix& operator=(const Matrix &m);
    const Matrix operator+(const Matrix &m);
    const Matrix operator-(const Matrix &m);
    const Matrix operator*(const Matrix &m);
    bool operator==(const Matrix &m);
    bool operator!=(const Matrix &m);
};

Matrix::Matrix()
{
    matrix = new int*[1];
}

Matrix::Matrix(int x, int y)
{
    constructor(x,y);
}

Matrix::~Matrix()
{
    destruct();
}

/**
This function contructs the matrix using given heights and widths
(for colums and rows) and then allocates the memory for this
object
*/
void Matrix::constructor (int matrixHeight, int matrixWidth)
{
    height = matrixHeight;
    width = matrixWidth;
    matrix = new int *[matrixHeight];
    for ( int i = 0; i < matrixHeight; i++)
    {
        matrix[i] = new int[matrixWidth];
    }

    //initialising all areas in array
    for ( int i = 0; i < matrixHeight; i++)
    {
        for ( int j = 0; j < matrixWidth; j++)
        {
            matrix[i][j] = 1;
        }
    }
}

/**
This function is for freeing any assigned memory to a matrix
for its columns and rows
*/
void Matrix::destruct ()
{
    for ( int i = 0 ; i < getHeight() ; i++ )
    {
        delete [] matrix[i];
    }
    delete [] matrix;
    matrix = NULL;
}

それが最初のセクションです。ここに行列の乗算があります

/**
This function overloads the times operator
*/
const Matrix Matrix::operator*(const Matrix &m)
{
    if(getWidth() == m.getHeight())
    {
        //i cant remember which way to do matrix mult, and im intoxicated
        //so heres a shitty implementation
        Matrix matrixResult(getHeight(), m.getWidth());
        int result = 0;
        int *row;
        int *column;

        cout << "\n\n matrix mult \n\n";

        for ( int i = 0 ; i < getHeight() ; i++ )
        {
            for ( int j = 0 ; j < m.getWidth() ; j++ )
            {
                result = 0;
                row = getRow(i);
                column = m.getColumn(j);
                for( int k = 0; k < m.getHeight() ; k++ )
                {
                    result = result + (row[k] * column[k]);
                }
                matrixResult.setElement(i, j, result);
            }
            cout << "\n";
        }

        for ( int i = 0 ; i < getHeight() ; i++ )
        {
            for ( int j = 0 ; j < m.getWidth() ; j++ )
            {
                cout << std::setw(10) << matrixResult.getElement(i,j);
            }
            cout << "\n";
        }

        return matrixResult;
    }
    cout << "Not correct size to be multiplied";
    return *this;
}

そして、ここに等号があります(これは、私のエラーがあると信じていた場所です):

/**
Overloading the equals operator to be of
type Matrix. This function changes all
values of the currently instantiated matrix
to those of the one passed in via parameter
*/
Matrix& Matrix::operator=(const Matrix &m)
{
    //destroy previous matrix value array
    destruct();

    //Create a new array the same size as the matrix to be copied
    constructor(m.getHeight(), m.getWidth());

    //looping through the current array
    cout << "\n\n beginning equals\n\n";
    for ( int i = 0 ; i < getHeight() ; i++ )
    {
        for ( int j = 0 ; j < getWidth() ; j++ )
        {
            //changing current array's elements to
            //those of the paramter array
            cout << std::setw(10) << m.getElement(i,j);
            setElement(i, j, m.getElement(i, j));
        }
        cout << "\n";
    }
    return *this;
}

誰もが知っているように、私は C++ に完全に慣れていません。残念ながら、私たちの講師は、優れた C++ コーディングに関する実践的なセッションを提供しないことに固執しているようです :/

さらに、これはパートナーのプログラミング演習であるため、コードが標準に 100% 準拠していない場合は申し訳ありませんが、一部は私自身のものではありません!

ありがとうございました!

編集: 要求された getColumn の実装。

/**
This function returns the items in a specified column
within the matrix. The values are returns as a 1 dimensional
array, which has been malloc'ed.
*/
int* Matrix::getColumn(int col) const
{
    //using malloc to assign the memoru for the returned array
    int* result = new int[height];

    //check to ensure column was within matrix range
    if (col < width )
    {
        for( int i = 0 ; i < height ; i++ )
        {
            result[i] = getElement(i, col);
        }
    }

    return result;
}

編集 2: コマンド ライン出力。WINDOWS で CODE::BLOCKS を介して GCC を使用してこれをコンパイルおよび実行していることに注意してください

       913       918      -418
       676       736       -25
      -225       265      -382


       890      -739      -452        87
      -331      -564      -761       280
      -375      -895       101       709


       829      -661       742       442
       679       567       377      -322
      -356      -136      -614      -356




 matrix mult




    665462   -818349  -1153492     40109
    367399   -892293   -868173    247167
   -144715    358705   -138547   -216213


 beginning equals

    197792    20092813134236931095717471
    200928    199968    2003201701603654
   -144715    358705   -138547   -216213

Process returned 0 (0x0)   execution time : 0.009 s
Press any key to continue.
4

1 に答える 1

-2

this void Matrix::operator=(const Matrix &m){ ....} として変更し、「return *this」を削除します

于 2012-12-08T13:18:15.090 に答える