回 帖 发 新 帖 刷新版面

主题:矩阵乘法问题

我写了一个矩阵类,以下是矩阵类的头文件,在源文件中调试时,重载矩阵乘法那一块儿出了问题,相关的部分代码如下:

Matrix operator*(Matrix &M1,Matrix &M2)
{
    Matrix M3(M1.row, M2.col);
    if (M1.row==M2.col)        
        {
            for(int i=0;i<M1.row;++i)
                for(int j=0;j<M2.col;++j)
                {
                    for(int k=0;k<M1.row;++k)
                    M3.mat[i][j]+=M1.mat[i][k]*M2.mat[k][j];
                }
        }
    return M3;
}
其中构造函数作用是产生一个全0矩阵,两个参数是其行列,不知道是哪儿除了问题,请大家 帮帮忙,谢谢!
整个头文件如下:

//Mymat.h

#include   <iostream.h>   
#include   <fstream>   
#include   <iomanip>


class   Matrix                                                              
{
protected:
    int row;   
    int col;   
    int** mat;
public:
    Matrix():row(0),col(0),mat(NULL){}
    Matrix(const Matrix& rhs);
    Matrix(const Matrix& rhs,int r,int c,int height,int width);
    Matrix(int row,int col);
    ~Matrix();
    void Create(int r,int c);
    void Clear();
    int GetRow() const {return row;}   
    int GetCol() const {return col;}  
    int Get(int i,int j) const {return mat[i][j];}
    void Set(int i,int j,int val) {mat[i][j]=val;}  
    friend istream& operator>>(istream& in,Matrix &M);
    friend ostream& operator<<(ostream& out,Matrix &M);
    friend Matrix operator+(Matrix &M1,Matrix &M2);
    Matrix& operator=(const Matrix& M);
    friend Matrix operator*(Matrix &M1,Matrix &M2);
};


void Matrix::Create(int r,int c)   
  {   
  Clear();   
  row = r;   
  col = c;   
  mat = new int*[row];   
  for(int i=0;i<row;++i)   
  {   
  mat[i] = new int[col];   
  for(int j=0;j<col;++j)   
  mat[i][j]=0;   
  }   
  } 
  
void Matrix::Clear()   
  {   
  if(mat)   
  {   
  for(int i=0;i<row;++i)   
  delete[] mat[i];   
  delete[] mat;   
  row=col=0;   
  }   
  }   

Matrix::Matrix(const Matrix& rhs)   
    {
        mat=NULL;   
        Create(rhs.GetRow(),rhs.GetCol());   
        for(int i=0; i<row;++i)   
        for(int j=0; j<col;++j)   
        mat[i][j]=rhs.Get(i,j);   
    }   

 Matrix::Matrix(const Matrix& rhs,int r,int c,int height,int width)   
  {   
  mat=NULL;   
  Create(height,width);   
  for(int i=0;i<height;++i)   
  for(int j=0;j<width;++j)   
  mat[i][j]=rhs.Get(r+i,c+j);   
  }   

Matrix::Matrix(int row,int col)   
  {   
    mat=NULL;   
    Create(row,   col);   
  }   

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

istream& operator>>(istream& in,Matrix &M)
{
    for(int i=0;i<M.row;++i)
    {
        for(int j=0;j<M.col;++j)
            in>>M.mat[i][j];
        }
    return in;
}

ostream& operator<<(ostream& out,Matrix &M)
{
    for(int i=0;i<M.row;++i)
    {
        for(int j=0;j<M.col;++j)
            out<<"   "<<M.mat[i][j];
        out<<endl;
    }
    return out;
}

Matrix& Matrix::operator=(const Matrix& M)   
  {   
  Clear();   
  row=M.GetRow();   
  col=M.GetCol();   
  Create(row,col);   
  for(int i=0;i<row;++i)   
  for(int j=0;j<col;++j)   
  mat[i][j]=M.Get(i,j);   
  return   *this;   
  }   

Matrix operator+(Matrix &M1,Matrix &M2)
{
    Matrix M3(M1.row,M1.col);
    if ((M1.col==M2.col)&&(M1.row==M2.row))
    {
        M3.col=M1.col;
        M3.row=M1.row;
        {
            for(int i=0;i<M1.row;++i)
                for(int j=0;j<M1.col;++j)
                    M3.mat[i][j]=M1.mat[i][j]+M2.mat[i][j];
        }
    }
    return M3;
}

Matrix operator*(Matrix &M1,Matrix &M2)
{
    Matrix M3(M1.row, M2.col);
    if (M1.row==M2.col)        
        {
            for(int i=0;i<M1.row;++i)
                for(int j=0;j<M2.col;++j)
                {
                    for(int k=0;k<M1.row;++k)
                    M3.mat[i][j]+=M1.mat[i][k]*M2.mat[k][j];
                }
        }
    return M3;
}




回复列表 (共10个回复)

沙发

= =看代码不细致了

板凳

[quote]你的M3里的int**没分配内存[/quote]

构造函数中有行和列的参数,在构造函数中调用的Create 函数,它的作用是分配一个二维数组的内存,并使所有的元素为0,应该是分配了吧

请问怎么样才行呢?

3 楼

看代码不细致*2

4 楼

[quote]Matrix M3(M1.row, M2.col);
在这后面M3.create();一下啊……你自己都说了初始化是通过create方法完成的又不去调用这个方法……[/quote]


我的意思是在构造函数中已经调用了那个函数分配内存了 

5 楼

偶错了- -看代码不细致……道歉ing
M3.mat[i][j]+=M1.mat[i][k]*M2.mat[k][j];
焦点移回这句代码,这句话里是不是有访问越界的情况呢?

6 楼


嗯,我也怀疑是那里出了问题,但是改了好几次都不成功,相当感谢!由于还是初学者吧,对自己的水平有点无语了,还望不吝赐教

7 楼

找用例单步跟进去试试吧,呵呵

8 楼


已经很感谢了,我自己再改改吧

9 楼

深圳华信群英科技有限公司,目前主要从事软件外包开发、高级软件人才定向输送等业务,面对日益严峻的大学生就业难和IT企业招聘难,自2006以来,与知名通信软件公司正式签订定向输送人才的合作协议,针对想进入软件行业的人员提供企业实训,实训课程采用“2+3”分段教学模式,分为2个月理论强化和3个月项目实训两个阶段,共计900学时。
企业订单委培,内训前签订就业安置协议,100%保证就业。实训结束之后,在华信群英科技及其战略合作伙伴从事通信软件研发工作。欢迎有意向者加QQ:649846168咨询。

10 楼

看不懂,好[url=http://www.56fjk.com][color=black]怎么开传世[/color][/url]复杂!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册