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.