首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

稀薄矩阵的转置相加相乘的c++代码求帮忙

2013-11-14 
稀疏矩阵的转置相加相乘的c++代码求帮忙稀疏矩阵的转置相加相乘的C++实现求帮忙指出错误#include iostrea

稀疏矩阵的转置相加相乘的c++代码求帮忙
稀疏矩阵的转置相加相乘的C++实现求帮忙指出错误
#include <iostream>
#include <iomanip>
using namespace std;  
template<typename T> //三元组 
struct sanyuanzu
{  
int row; 
int col;  
T val;
}; 
template<typename T>
class juzhen
{
private:
sanyuanzu<T>* pt;
int rows;
int cols;
int terms;
int maxsize;
public:
//juzhen()
void write(int ro,int co,int maxnum)
{
terms=0;
rows=ro;
cols=co;
pt=new sanyuanzu<T>[maxnum];
maxsize=maxnum;
}
   void input()//矩阵数据的输入。
   {   
   cout<<"矩阵数据"<<endl;
  for (int i=0;i<rows;i++)
   {
           for (int j=0;j<cols;j++) 
   {    T number;
   cin>>number;    
   if (number!=0)   
   {     
   pt[terms].row=i+1;   
   pt[terms].col=j+1;   
   pt[terms].val=number;   
   terms++;   
   } 
   }
  } 
   }
   void output()//矩阵数据的输出。
   {
   int i,j;
  T** qt=new T*[rows];
  for(i=0;i<rows;i++)
  {
  qt[i]=new T[cols];
  }
  for( i=0;i<rows;i++)
  {
  for(j=0;j<cols;j++)
  qt[i][j]=0;
  }
  for( i=0;i<terms;i++)
  {
  qt[pt[i].row-1][pt[i].col-1]=pt[i].val;
  }
  for(i=0;i<rows;i++)
  {
  for( j=0;j<cols;j++)
  {
  cout<<setw(4)<<qt[i][j];
  }
  cout<<endl;
  }
   for (i=0;i<rows;i++)
  { 
 delete[] qt[i];
   }
   delete qt;
   cout<<endl;
  }
   bool Transposeto(juzhen& B)//矩阵的转置
   {
       if(terms>0)
   {
               B.write(cols,rows,terms);
   for(int i=0;i<terms;i++)
   {
   B.pt[i].row=pt[i].col;
   B.pt[i].col=pt[i].row;
   B.pt[i].val=pt[i].val;
   B.terms++;
   }
      return true;
   }
   else
   return false;
   }
   juzhen operator +(juzhen&t)//两个矩阵相加
   {
   if(rows==t.rows&&cols==t.cols)
   {
   juzhen t1;
   t1.write(rows,cols,terms+t.terms);
   int i,j;
   for(i=0;i<terms;i++)
   {
   int flg=0;
   for(j=0;j<t.terms;j++)
   {
   if(pt[i].row==t.pt[j].row&&pt[i].col==t.pt[j].col)
   {
   t1.pt[terms].val=pt[i].val+t.pt[j].val;
                        t1.pt[terms].row=pt[i].row;
t1.pt[terms].col=pt[i].col;
t1.terms++;
flg=1;
   }
   }
   if(flg==0)
   {
       t1.pt[terms].val=pt[i].val+0;
       t1.pt[terms].row=pt[i].row;
   t1.pt[terms].col=pt[i].col;
   t1.terms++;
   }
   }
   for(i=0;i<t.terms;i++)
   {
   int flg=0;
   for(j=0;j<terms;j++)
   {
   if(t.pt[i].row==pt[j].row&&t.pt[i].col==pt[j].col)
   {
   flg=1;
   }
   }
   if(flg==0)
   {
   t1.pt[terms].val=t.pt[i].val+0;
   t1.pt[terms].row=t.pt[i].row;
   t1.pt[terms].col=t.pt[i].col;
   t1.terms++;
   }
   }
   return t1;
   }
   else
   cout<<"这两个矩阵不能相加."<<endl;
   }
  juzhen operator *(juzhen&jt)


  {
  if(cols==jt.rows)
  {
  int i,j,k;
  T**qt=new T*[rows];
  for(i=0;i<rows;j++)
  qt[i]=new T[jt.cols];
  T**t1=new T*[rows];//t1是用来动态构建二维数组的指针
  for(i=0;i<rows;i++)
  t1[i]=new T[cols];
  T**t2=new T*[jt.rows];//t2(j)
  for(i=0;i<jt.rows;i++)
  t2[i]=new T[jt.cols];
  for(i=0;i<rows;i++)
  {
  for(j=0;j<cols;j++)
  {
  t1[i][j]=0;
  }
  }
  for(i=0;i<terms;i++)
  t1[pt[i].row-1][pt[i].col-1]=pt[i].val;
  for(i=0;i<jt.rows;i++)
  {
  for(j=0;j<jt.cols;j++)
  t2[i][j]=0;
  }
  for(i=0;i<jt.terms;i++)
  t2[jt.pt[i].row-1][jt.pt[i].col-1]=jt.pt[i].val;
         for(i=0;i<rows;i++)//两个矩阵相乘算法
 {
 for(j=0;j<jt.cols;j++)
 {
                 T num=t1[i][0]*t2[0][j];
 for(k=1;k<cols;k++)
 {
 num=num+t1[i][k]*t2[k][j];
 }
 qt[i][j]=num;
 }
 }
 int number=0;
 for(i=0;i<rows;i++)
 {
 for(j=0;j<jt.cols;j++)
 {
 if(qt[i][j]!=0)
 number++;
 }
 }
 juzhen tem;
 tem.write(rows,jt.cols,number);
        for (i=0;i<rows;i++)
   {
           for (j=0;j<jt.cols;j++) 
   {       
   if (qt[i][j]!=0)   
   {     
   tem.pt[terms].row=i+1;   
  tem.pt[terms].col=j+1;   
   tem.pt[terms].val=qt[i][j];   
   tem.terms++;
   }
   }
}
return tem;
  }
  else
  cout<<"这个两个矩阵不能相乘."<<endl;
  }
  };
  int main()
  {
  cout<<"选择功能."<<endl;
  cout<<"1.矩阵转置."<<"            "<<"2.两个矩阵相加."<<"                "<<"3.两个矩阵相乘."<<endl;
  int n;
  while(cin>>n&&n!=0)//输入0程序结束
  {
  if(n==1)
  {
  cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
  int ro,co,nu;
  cin>>ro>>co>>nu;
  juzhen<int> te1;
  te1.write(ro,co,nu);
  te1.input();
  juzhen<int> te2;
  te1.Transposeto(te2);
  te2.output();
  }
  if(n==2)
  {
  cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
  int ro1,co1,nu1;
  cin>>ro1>>co1>>nu1;
  juzhen<int> te1;
  te1.write(ro1,co1,nu1);
  te1.input();
              cout<<"输入稀疏矩阵的行和列,以及稀疏矩阵中除零以外的元素个数."<<endl;
  int ro2,co2,nu2;
  cin>>ro2>>co2>>nu2;
  juzhen<int> te2;
  te2.write(ro2,co2,nu2);
  te2.input();
  juzhen<int> &te3=te1+te2;
  te3.output();
  }
  if(n==3)
  {
  cout<<"输入矩阵的行和列,以及除零以外矩阵的元素个数"<<endl;
  int ro1,co1,nu1;
  cin>>ro1>>co1>>nu1;
  juzhen<int> te1;
  te1.write(ro1,co1,nu1);
  te1.input();
              cout<<"输入矩阵的行和列,以及除零以外矩阵的元素个数"<<endl;
  int ro2,co2,nu2;
  cin>>ro2>>co2>>nu2;
  juzhen<int> te2;
  te2.write(ro2,co2,nu2);
              te2.input ();
  juzhen<int>& te3= te1*te2;
  te3.output();
  }
  }
  return 0;
  }









[解决办法]
若用于工作,建议使用比较成熟的库,比如:eigen
http://eigen.tuxfamily.org/dox/group__TutorialSparse.html

[解决办法]
在加法中,所有t1.pt[terms]改为t1.pt[t1.terms]:

  juzhen operator +(juzhen&t)//两个矩阵相加
  {
    if(rows==t.rows&&cols==t.cols)
    {
      juzhen t1;
      t1.write(rows,cols,terms+t.terms);
      int i,j;
      for(i=0;i<terms;i++)
      {
        int flg=0;
        for(j=0;j<t.terms;j++)
        {
          if(pt[i].row==t.pt[j].row&&pt[i].col==t.pt[j].col)
          {
            t1.pt[t1.terms].val=pt[i].val+t.pt[j].val;//t1.pt[terms].val=pt[i].val+t.pt[j].val;
            t1.pt[t1.terms].row=pt[i].row;//t1.pt[terms].row=pt[i].row;
            t1.pt[t1.terms].col=pt[i].col;//t1.pt[terms].col=pt[i].col;
            t1.terms++;
            flg=1;
          }
        }
        if(flg==0)
        {
          t1.pt[t1.terms].val=pt[i].val+0;//t1.pt[terms].val=pt[i].val+0;
          t1.pt[t1.terms].row=pt[i].row;//t1.pt[terms].row=pt[i].row;
          t1.pt[t1.terms].col=pt[i].col;//t1.pt[terms].col=pt[i].col;
          t1.terms++;
        }
      }
      for(i=0;i<t.terms;i++)
      {
        int flg=0;
        for(j=0;j<terms;j++)
        {
          if(t.pt[i].row==pt[j].row&&t.pt[i].col==pt[j].col)
          {
            flg=1;
          }
        }
        if(flg==0)
        {
          t1.pt[t1.terms].val=t.pt[i].val+0;//t1.pt[terms].val=t.pt[i].val+0;
          t1.pt[t1.terms].row=t.pt[i].row;//t1.pt[terms].row=t.pt[i].row;
          t1.pt[t1.terms].col=t.pt[i].col;//t1.pt[terms].col=t.pt[i].col;
          t1.terms++;
        }
      }
      return t1;
    }
    else
      cout<<"这两个矩阵不能相加."<<endl;
  }


乘法没有检查。

热点排行