+ -
当前位置:首页 → 问答吧 → 帮忙找个错,关于运算符重载矩阵乘法

帮忙找个错,关于运算符重载矩阵乘法

时间:2011-12-01

来源:互联网

[code=C/C++][/code]
#include "stdafx.h"
#include<iostream.h>
class Matrix
{
public:
Matrix(int mm, int nn)//构造函数初始化data
{
m=mm;n=nn;
int i;
data=new double*[mm];
for(i=0;i<mm;i++)
data[i]=new double[nn];
} //构造M行N列的矩阵
Matrix(const Matrix &src) //重载拷贝构造函数
{
m=src.m;n=src.n;
  int i,j;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
}
Matrix& operator=(const Matrix &src) //重载"="运算符
{
  int i,j;
for(i=0;i<m;i++)
delete []data[i];
  delete []data;
m=src.m;n=src.n;
data=new double*[m];//动态建立二维数组
for(i=0;i<m;i++)
data[i]=new double[n];
for(i=0;i<m;i++)
for(j=0;j<n;j++)
data[i][j]=src.data[i][j];
return *this;
}
~Matrix()//
{
for(int i=0;i<m;i++)
delete []data[i];
  delete []data;
}
Matrix operator * (Matrix &m2); //矩阵乘法
void display();
void input();
private:
double **data;
int m,n;//矩阵的行数,列数
};//类定义结束
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
Matrix m3(this->m,this->n); 
int i,j;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
for(int k=0;k<n;k++)
m3.data[i][j]+=data[i][k]*m2.data[k][j];
return m3;
}
void Matrix::input()
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>data[i][j];
}
void Matrix::display()
{
int i,j;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{
cout<<data[i][j]<<" ";
}
cout<<endl;
}
}
int main(int argc, char* argv[])
{
int x,y;
cout<<"行数:";
cin>>x;
cout<<"列数:";
cin>>y;
  Matrix A(x,y);
cout<<"please input "<<x*y<<"numbers"<<endl;
A.input();
A.display();
cout<<"行数:";
cin>>x;
cout<<"列数:";
cin>>y;
  Matrix B(x,y);
cout<<"please input "<<x*y<<"numbers"<<endl;
B.input();
B.display();
  Matrix C(y,x);
C=A*B;
C.display();
return 0;
}
运行后得到的是这个样子:
-6.27744e+066 -6.27744e+066 -6.27744e+066
-6.27744e+066 -6.27744e+066 -6.27744e+066
-6.27744e+066 -6.27744e+066 -6.27744e+066
不知道哪里出问题了,这只是我程序的一部分,其他部分如加法、减法、矩阵转置都可以正常运行得到结果的~

作者: Vampierty   发布时间: 2011-12-01

#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
  public:
  Matrix(int mm, int nn)//构造函数初始化data
  {
  m=mm;n=nn;
  int i,j;
  data=new double*[mm];
  for(i=0;i<mm;i++)
  data[i]=new double[nn];
  for(i=0;i<m;i++)//矩阵所有元素清零
  for(j=0;j<n;j++)
  data[i][j]=0.0;
  } //构造M行N列的矩阵
  Matrix(const Matrix &src) //重载拷贝构造函数
  {
  m=src.m;n=src.n;
  int i,j;
  data=new double*[m];//动态建立二维数组
  for(i=0;i<m;i++)
  data[i]=new double[n];
  for(i=0;i<m;i++)
  for(j=0;j<n;j++)
  data[i][j]=src.data[i][j];
  }
  Matrix& operator=(const Matrix &src) //重载"="运算符
  {
  int i,j;
  for(i=0;i<m;i++)
  delete []data[i];
  delete []data;
  m=src.m;n=src.n;
  data=new double*[m];//动态建立二维数组
  for(i=0;i<m;i++)
  data[i]=new double[n];
  for(i=0;i<m;i++)
  for(j=0;j<n;j++)
  data[i][j]=src.data[i][j];
  return *this;
  }
  ~Matrix()//
  {
  for(int i=0;i<m;i++)
  delete []data[i];
  delete []data;
  }
  Matrix operator * (Matrix &m2); //矩阵乘法
  void display();
  void input();
  private:
  double **data;
  int m,n;//矩阵的行数,列数
};//类定义结束

//矩阵*运算符重载
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
  Matrix m3(this->m,m2.n);
  if(this->n!=m2.m)
  {
  cout<<"两矩阵无法进行乘法运算.\n"<<endl;
  exit(0);
  }
  int i,j,k,l;
  for(i=0;i<this->m;i++)
  for(j=0;j<m2.n;j++)
  {
  for(k=0;k<this->n;k++)
  for(l=0;l<m2.m;l++)
  m3.data[i][j]+=this->data[i][k]*m2.data[l][j];
  }

  return m3;
}

//输入矩阵元素
void Matrix::input()
{
  for(int i=0;i<m;i++)
  for(int j=0;j<n;j++)
  cin>>data[i][j];
}

//显示矩阵元素
void Matrix::display()
{
  int i,j;
  for(i=0;i<m;i++)
  {
  for(j=0;j<n;j++)
  {
  cout<<data[i][j]<<" ";
  }
  cout<<endl;
  }
}

//主函数
int main(int argc, char* argv[])
{
  int x,y;
  cout<<"矩阵1行数:";
  cin>>x;
  cout<<"矩阵1列数:";
  cin>>y;
  Matrix A(x,y);
  cout<<"please input "<<x*y<<" numbers"<<endl;
  A.input();
  A.display();
  cout<<"矩阵2行数:";
  cin>>x;
  cout<<"矩阵2列数:";
  cin>>y;
  Matrix B(x,y);
  cout<<"please input "<<x*y<<" numbers"<<endl;
  B.input();
  B.display();
  Matrix C(y,x);
  C=A*B;
  C.display();
  return 0;
}

作者: nuaazdh   发布时间: 2011-12-01

C/C++ code
#include <iostream>

using namespace std;

//Matrix矩阵类
class Matrix
{
    public:
    Matrix(int mm, int nn)//构造函数初始化data
    {
        m=mm;n=nn;
        int i,j;
        data=new double*[mm];
        for(i=0;i<mm;i++)
            data[i]=new double[nn];
        for(i=0;i<m;i++)//矩阵所有元素清零
            for(j=0;j<n;j++)
                data[i][j]=0.0;
    } //构造M行N列的矩阵
    Matrix(const Matrix &src) //重载拷贝构造函数
    {
        m=src.m;n=src.n;
          int i,j;
        data=new double*[m];//动态建立二维数组
        for(i=0;i<m;i++)
            data[i]=new double[n];
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                data[i][j]=src.data[i][j];
    }
    Matrix& operator=(const Matrix &src) //重载"="运算符
    {
        int i,j;
        for(i=0;i<m;i++)
            delete []data[i];
        delete []data;
        m=src.m;n=src.n;
        data=new double*[m];//动态建立二维数组
        for(i=0;i<m;i++)
            data[i]=new double[n];
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                data[i][j]=src.data[i][j];
        return *this;
    }
    ~Matrix()//
    {
        for(int i=0;i<m;i++)
            delete []data[i];
        delete []data;
    }
    Matrix operator * (Matrix &m2); //矩阵乘法
    void display();
    void input();
    private:
        double **data;
    int m,n;//矩阵的行数,列数
};//类定义结束

//矩阵*运算符重载
Matrix Matrix::operator *(Matrix &m2)//矩阵乘法的实现
{
    Matrix m3(this->m,m2.n);
    if(this->n!=m2.m)
    {
        cout<<"两矩阵无法进行乘法运算.\n"<<endl;
        exit(0);
    }
    int i,j,k,l;
    for(i=0;i<this->m;i++)
        for(j=0;j<m2.n;j++)
        {
            for(k=0;k<this->n;k++)
                for(l=0;l<m2.m;l++)
                    m3.data[i][j]+=this->data[i][k]*m2.data[l][j];
        }

    return m3;
}

//输入矩阵元素
void Matrix::input()
{
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)
            cin>>data[i][j];
}

//显示矩阵元素
void Matrix::display()
{
    int i,j;
    for(i=0;i<m;i++)
    {
        for(j=0;j<n;j++)
        {
            cout<<data[i][j]<<" ";
        }
        cout<<endl;
    }
}

//主函数
int main(int argc, char* argv[])
{
    int x,y;
    cout<<"矩阵1行数:";
    cin>>x;
    cout<<"矩阵1列数:";
    cin>>y;
    Matrix A(x,y);
    cout<<"please input "<<x*y<<" numbers"<<endl;
    A.input();
    A.display();
    cout<<"矩阵2行数:";
    cin>>x;
    cout<<"矩阵2列数:";
    cin>>y;
    Matrix B(x,y);
    cout<<"please input "<<x*y<<" numbers"<<endl;
    B.input();
    B.display();
      Matrix C(y,x);
    C=A*B;
    C.display();
    return 0;
}


楼主矩阵乘法规则没有弄清除吧

作者: nuaazdh   发布时间: 2011-12-01