类运算符的矩阵乘法

Posted

技术标签:

【中文标题】类运算符的矩阵乘法【英文标题】:Matrix multiplication with class operator 【发布时间】:2016-06-08 15:08:33 【问题描述】:

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

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] 有问题,我不知道是什么问题 添加时效果很好。 它显示错误 data0x005fba900xfeeefeee??? 任何人都可以就这种情况提供任何建议或建议或帮助 这是我的复制构造函数

 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];
 

【问题讨论】:

但是,我的打印功能总是显示一个错误你能详细说明一下吗? 临时矩阵不应该有this-&gt;rowa.col 维度吗? 但是如果我没有使用任何运算符并且它确实有效,那么使用运算符和不使用运算符有什么区别 在您的复制构造函数中,第一组循环是无用的,因为之后您将直接覆盖数据。此外,我们仍然需要查看类定义以及采用行和列参数的构造函数,可能还有setUp 函数。请尝试创建Minimal, Complete, and Verifiable Example 并展示给我们。 【参考方案1】:

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

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

取决于data是什么,如果你在创建temp时没有在构造函数中显式初始化data成员,那么它的内容不会自动初始化,内容会是不确定的 并且使用它会导致未定义的行为

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

【讨论】:

我有一个复制构造函数,但它看起来没有帮助

以上是关于类运算符的矩阵乘法的主要内容,如果未能解决你的问题,请参考以下文章

用 operator* 重载包装矩阵乘法

矩阵的乘法运算怎么算?

矩阵的乘法运算法则

矩阵的乘法运算

三维矩阵的运算规则是怎么样的? 包括加法,减法,乘法

DSP矩阵运算-放缩,乘法和转置矩阵