使用类运算符进行矩阵乘法

Matrix multiplication with class operator

本文关键字:运算符      更新时间:2023-10-16

我正在研究矩阵的乘法它有点像

m5 = m2 * m3;
cout << "m2 * m3 is : " << endl<< m5 << endl;

这是我的代码

const Matrix Matrix::operator*(const Matrix &a)
{
   Matrix temp(a.row,a.col);
   for (int i = 0; i<row; i++)
   {
      for (int j = 0; j<col; j++)
      {
        for (int k = 0; k<a.row; k++)
        {
            temp.data[i][j] = temp.data[i][j] + data[i][k] * a.data[k][j];
        }
      }
  }
 return temp;
}

但是,我的打印功能始终显示错误

ostream& operator<<(ostream &output, const Matrix &a)
{
   for (int i = 0; i < a.row; i++)
   {
      for (int j = 0; j < a.col; j++)
      {
        output << a.data[i][j] << "t";
      }
    output << "" << endl;
   }
   return output;
} 

似乎 a.data[i][j] 有问题,我不知道是什么问题它在加法时工作正常。它显示错误 {data0x005fba90{0xfeeefeee{???}}任何人都可以对这种情况提供任何建议或建议或帮助吗这是我的复制构造函数

 Matrix::Matrix(const Matrix&m2)
{
  row = m2.row;
  col = m2.col;
  setUp(row, col);
  for (int i = 0; i<row; i++)
  {
      for (int j = 0; j<col; j++)
      {
          data[i][j] = 0;
      }
  }  
  for (int i = 0; i < row; i++)
  {
      for (int j = 0; j < col; j++)
      {
        data[i][j] = m2.data[i][j];
      }
  }
}

这是设置和默认值

Matrix::Matrix()
{
 row =0;
 col = 0;
 for (int i = 0; i<row; i++)
 {
    for (int j = 0; j<col; j++)
    {
        data[i][j] = 0;
    }
 }
}
Matrix::Matrix(int a, int b, double d[], int c)
{
 row = a;
 col = b;
 setUp(row, col);
 int counter = 0;
 for (int i = 0; i < row; i++)
 {
    for (int j = 0; j < col; j++)
    {
        data[i][j] = d[counter];
        counter++;
    }
 }
 }

和设置

 void Matrix::setUp(int a, int b)
{
 row = a;
 col = b;
 data = new double*[row];
 for (int i = 0; i < row; i++) data[i] = new double[col];
 }

如果没有看到你的Matrix构造函数或类定义,很难确定,但如果你看看这个表达式

temp.data[i][j] + data[i][k] * a.data[k][j]

根据data是什么,如果在创建temp时未显式初始化构造函数中的data成员,则其内容将不会自动初始化,并且内容将是不确定的,使用它将导致未定义的行为

问题的另一个可能来源可能是缺少复制构造函数或错误的复制构造函数。这是一个问题,因为您按调用复制构造函数的值返回temp