谈无欲为什么杀素柔云:矩阵转置

来源:百度文库 编辑:九乡新闻网 时间:2024/05/01 12:19:36
*************************************************SparseMatrix.h***********************************************#include using namespace std;const int maxNum=100;template
class Trituple
{
public:
int row;
int col;
T data;
};template
class SparseMatrix
{
friend istream& operator >>(istream& in,SparseMatrix &m)                       //重载输入运算符
{
   cout<<"请输入行数,列数以及非零元素个数:";                               //初始化稀疏矩阵的行、列以及非零元素的个数
   in>>m.row>>m.col>>m.terms;
   if(m.terms>m.maxTerms)
   {
    cout<<"错误!非零元素溢出!";
   }
   else
   {
    for(int i=0;i    {
     cout<<"请输入第"<     in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
     while((m.t[i].row>=m.row)||(m.t[i].col>=m.col))                              //矩阵元素下标检查
     {
      cout<<"错误!输入的矩阵元素下标越界!请从新输入:";
      in>>m.t[i].row>>m.t[i].col>>m.t[i].data;
     }
    }
   }
   return in;
}
friend ostream& operator <<(ostream& out,SparseMatrix &m)                              //重载输出运算符
{
   int i,j,k=0;
   out<<"行:"<   /*for(int i=0;i   {
    out<<"M["<   }*/
   for(i=0;i   {
    for(j=0;j    {
     if((m.t[k].row==i)&&(m.t[k].col==j))
     {
        out<       }
       else
       {
        cout<<'0'<<" ";
       }
    }
            out<   }   return out;
}private:
int row;
int col;
int terms;
    Trituple *t;           //三元组数组
int maxTerms;             //最大元素数目
public:
SparseMatrix(int maxSize=maxNum)                   //构造函数
{
   maxTerms=maxSize;
   row=col=terms=0;
   t=new Trituple[maxSize];
}
~SparseMatrix()                                    //析构函数
{
   delete []t;
}
/*SparseMatrix transposedMatrix()                    //课本上的矩阵转置函数,逻辑正确,但是运行时内存报错
{
   int *rowSize=new int[col];                        //存放转置矩阵各行中的非零元素个数
   int *rowStart=new int[col];                       //存放转置矩阵各行中非零元素开始的存放位置
   SparseMatrix tp(maxTerms);                     //存放转置后的矩阵
   tp.row=col;
   tp.col=row;
   tp.terms=terms;
   if(terms>0)
   {
      int i=0;
      int j=0;
      for(i=0;i     rowSize=0;
      for(i=0;i     rowSize[t[i].col]++;
      rowStart[0]=0;
      for(i=1;i       rowStart[i]=rowSize[i]+rowStart[i-1];
      //*****************************************
      for(i=0;i       cout<      cout<      for(i=0;i       cout<      cout<      //******************************************
      for(i=0;i      {
       j=rowStart[t[i].col];                          //j转置矩阵的三元组的行
       //rowStart[t[i].col]++;
       tp.t[j].row=t[i].col;
       tp.t[j].col=t[i].row;
       tp.t[j].data=t[i].data;
     rowStart[t[i].col]++;
      }
   }
   delete []rowSize;
        delete []rowStart;
     return tp;
}*/
    void transposedMatrix(SparseMatrix &tp)                 //自己编写的转置矩阵函数
{
   int i,j;
   if(terms>0)
   {
    int Row=0;
    tp.col=row;                                     //初始化转置矩阵的行、列以及非零元素个数
    tp.row=col;
    tp.terms=terms;  
    for(j=0;j    {
          for(i=0;i     {
        if(t[i].col==j)                         //检查原三元组的列,如果相同,则交换行、列赋值给转置矩阵
        {
               tp.t[Row].row=t[i].col;
               tp.t[Row].col=t[i].row;
               tp.t[Row].data=t[i].data;
       Row++;
              }
     }
    }
   }
}
/*void displayTrituple()                                  //输出三元组
{
   for(int i=0;i   {
    cout<   }
   cout<}*/
};*******************************************SparseMatrixMain.cpp*************************************************#include "stdafx.h"
#include
//#include "Trituple.h"
#include "SparseMatrix.h"using namespace std;int _tmain(int argc, _TCHAR* argv[])
{
SparseMatrix obj;
SparseMatrix obj1;
cin>>obj;
//obj.displayTrituple();                     //测试时使用的输出三元组的函数
cout<<"*********************初始矩阵**********************"<cout<obj.transposedMatrix(obj1);                  //调用自己编写的转置函数
//obj.transposedMatrix();                    //调用课本的转置函数
cout<<"*********************转置矩阵**********************"<cout<//cout<return 0;
} 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/Reyes11235813/archive/2008/10/23/3132453.aspx