青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

/*
  Name: 三元組稀疏矩陣類
  始發(fā)于goal00001111的專欄;允許自由轉(zhuǎn)載,但必須注明作者和出處
  Author: goal00001111
  Date: 07-05-10 09:51
  Description: 三元組稀疏矩陣類:實(shí)現(xiàn)了矩陣的轉(zhuǎn)置,加法和乘法運(yùn)算
*/
#include <cstdlib>
#include <iostream>

using namespace std;

const int MAXTERMS = 10000;

template <typename T> class SparseMatrix;//前置聲明

template <typename T>
class Trituple //三元組類
{
    friend class SparseMatrix<T>;
private:
    Trituple<T> & operator = (const Trituple<T> & b);
    int row, col;
    T value;
};

template <typename T> //重載賦值運(yùn)算符
Trituple<T> & Trituple<T>::operator = (const Trituple<T> & b)
{
    if (this != &b)
    {
        row = b.row;
     col = b.col;
     value = b.value;
    }
   
    return *this;
}

template <typename T>
class SparseMatrix //三元組稀疏矩陣類
{
public:
    SparseMatrix(int maxRow, int maxCol, int maxTerms = 0); //構(gòu)造函數(shù)1
    SparseMatrix(const T a[], int maxRow, int maxCol);      //構(gòu)造函數(shù)2
    SparseMatrix(const SparseMatrix<T> & b);      //拷貝構(gòu)造函數(shù)
    SparseMatrix<T> & operator = (const SparseMatrix<T> & b);//重載賦值運(yùn)算符
   
    void Display(); //輸出三元組
    void DisArray();//輸出矩陣
    SparseMatrix<T> Transpose();//三元組順序表:轉(zhuǎn)置矩陣
    SparseMatrix<T> FastTranspose();//三元組順序表:快速轉(zhuǎn)置矩陣
 SparseMatrix<T> Add(SparseMatrix<T> b);//矩陣相加
    SparseMatrix<T> Multiply(SparseMatrix<T> b);//矩陣相乘
private:
    int rows, cols, terms;//矩陣的行數(shù),列數(shù)和非零元素個(gè)數(shù)
    Trituple<T> smArray[MAXTERMS];//三元組順序表
};


template <typename T> //構(gòu)造函數(shù)1
SparseMatrix<T>::SparseMatrix(int maxRow, int maxCol, int maxTerms):rows(maxRow), cols(maxCol), terms(maxTerms)
{
}

template <typename T> //構(gòu)造函數(shù)2:將二維數(shù)組轉(zhuǎn)換為三元組
SparseMatrix<T>::SparseMatrix(const T a[], int maxRow, int maxCol):rows(maxRow), cols(maxCol), terms(0)
{
    for (int i=0; i<rows; i++)
    {
     for (int j=0; j<cols; j++)
     {
    if (a[i*cols+j] != 0)
    {
       smArray[terms].row = i;
    smArray[terms].col = j;      
        smArray[terms++].value = a[i*cols+j]; 
            }
   if (terms > MAXTERMS)
       return; 
  }
    }
}

template <typename T> //拷貝構(gòu)造函數(shù)
SparseMatrix<T>::SparseMatrix(const SparseMatrix<T> & b)
{
    rows = b.rows;
    cols = b.cols;
    terms = b.terms;
   
    for (int i=0; i<terms; i++)
     smArray[i] = b.smArray[i];
}

template <typename T>//重載賦值運(yùn)算符
SparseMatrix<T> & SparseMatrix<T>::operator = (const SparseMatrix<T> & b)
{
    if (this != &b)
    {
        rows = b.rows;
     cols = b.cols;
     terms = b.terms;
     for (int i=0; i<terms; i++)
      smArray[i] = b.smArray[i];
    }
   
    return *this;
}

template <typename T>//輸出三元組
void SparseMatrix<T>::Display()
{
    cout << "rows = " << rows << ", cols = " << cols << ", terms = " << terms << endl;
    for (int i=0; i<terms; i++)
        cout << i+1 << "(" << smArray[i].row << ", " << smArray[i].col << ", "  << smArray[i].value << ")\t";
    cout << endl;
}

template <typename T>//輸出矩陣:包括非零元素
void SparseMatrix<T>::DisArray()
{
    int top = 0;
    for (int i=0; i<rows; i++)
    {
     for (int j=0; j<cols; j++)
     {
    if (i == smArray[top].row && j == smArray[top].col)   
        cout << smArray[top++].value << " "; 
            else
                cout << "0 ";
  }
  cout << endl;
    }
    cout << endl;
}

template <typename T>
SparseMatrix<T> SparseMatrix<T>::Transpose()//三元組順序表:轉(zhuǎn)置矩陣
{
 SparseMatrix<T> t(cols, rows, terms);
 
 if(terms > 0)
 {
        int top = 0;
  for(int j=0; j<cols; j++) //按照T的行序(M的列序)為主序依次排列
   for(int i=0; i<terms; i++)//掃描M的所有元素
    if(smArray[i].col == j)
    {
     t.smArray[top].row = smArray[i].col;
     t.smArray[top].col = smArray[i].row;
     t.smArray[top++].value = smArray[i].value;
    }//if
 } //else
 return t;
}

template <typename T>
SparseMatrix<T> SparseMatrix<T>::FastTranspose()//三元組順序表:快速轉(zhuǎn)置矩陣
{
    SparseMatrix<T> t(cols, rows, terms);
 int * colSize = new int[cols];//存儲(chǔ)每列的非零元素個(gè)數(shù)
 int * colStart = new int[cols];//存儲(chǔ)每列第一個(gè)非零元素在三元組中的位置(下標(biāo))
 
 if(terms > 0)
 {
        for(int i=0; i<cols; i++)
   colSize[i] = 0;
  for(int i=0; i<terms; i++)//掃描M的所有元素
   colSize[smArray[i].col]++; //確定矩陣M每一列中非零元素的個(gè)數(shù)
   
  colStart[0] = 0;// 確定矩陣M第i列中第一個(gè)非零元素在t.smArray中的位置
  for(int i=1; i<cols; i++)
   colStart[i] = colStart[i-1] + colSize[i-1];
   
  for(int i=0; i<terms; i++)//掃描M的所有元素
  {
   int k = colStart[smArray[i].col]; //k即矩陣M第col列中第一個(gè)非零元素在t.smArray中的位置
   t.smArray[k].row = smArray[i].col;
   t.smArray[k].col = smArray[i].row;
   t.smArray[k].value = smArray[i].value;
   colStart[smArray[i].col]++; //矩陣M第col列中第一個(gè)非零元素在t.smArray中的位置向前移動(dòng)一位
  }//for    
 }//if
 
 delete []colSize;
 delete []colStart;
 
 return t;
}

template <typename T>
SparseMatrix<T> SparseMatrix<T>::Add(SparseMatrix<T> b)//矩陣相加:采用合并算法,行序優(yōu)先
{
    SparseMatrix<int> c(cols, rows); 
 int i = 0, j = 0, k = 0;
 
 while (i < terms && j < b.terms)
 {
        if (smArray[i].row == b.smArray[j].row && smArray[i].col == b.smArray[j].col)
        {
            c.smArray[k].row = smArray[i].col;
   c.smArray[k].col = smArray[i].row;
   c.smArray[k].value = smArray[i++].value + b.smArray[j++].value; 
   if (c.smArray[k].value != 0)
       k++; 
        }
        else if ((smArray[i].row < b.smArray[j].row) ||(smArray[i].row == b.smArray[j].row && smArray[i].col < b.smArray[j].col))
      c.smArray[k++] = smArray[i++];
        else
            c.smArray[k++] = b.smArray[j++];
    }//while 
   
    if (i > terms) //A結(jié)束,若B還有元素,則將B的元素直接放入C中
    {
        while (j < b.terms)
            c.smArray[k++] = b.smArray[j++];
    }
    else //B結(jié)束,若A還有元素,則將A的元素直接放入C中
    {
        while (i < terms)
            c.smArray[k++] = smArray[i++];
    }
   
    c.terms = k;
   
    return c;
}

template <typename T> //矩陣相乘:快速乘法
SparseMatrix<T> SparseMatrix<T>::Multiply(SparseMatrix<T> b)
{  
 SparseMatrix<T> t(0, 0 , 0);
 if(b.rows != cols)
     return t;
    
 SparseMatrix<T> c(rows, b.cols);
 int * rowSize = new int[b.rows]; //存儲(chǔ)b每行的非零元素個(gè)數(shù)
 int * rowStart = new int[b.rows];//存儲(chǔ)b每行的首個(gè)非零元素位置
 int * ctemp = new int[b.cols]; //存儲(chǔ)b中與a某個(gè)元素做乘法運(yùn)算的第col列元素的累積值
 
 if(terms * b.terms != 0)//若C是非零矩陣
 {
  for(int i=0; i<b.rows; i++)
   rowSize[i] = 0;
  for(int i=0; i<b.terms; i++)//掃描b的所有元素
   rowSize[b.smArray[i].row]++; //確定矩陣b每一行中非零元素的個(gè)數(shù)
   
  rowStart[0] = 0;// 確定矩陣b第i行中第一個(gè)非零元素在b.smArray中的位置
  for(int i=1; i<b.rows; i++)
   rowStart[i] = rowStart[i-1] + rowSize[i-1];
  
  int k = 0, top = 0; 
  for(int i=0; i<rows; i++)//對(duì)A進(jìn)行逐行處理,即對(duì)C進(jìn)行逐行處理
  {
   for(int j=0; j<b.cols; j++)//當(dāng)前各元素累加器清零
    ctemp[j] = 0;
   
   while (k < terms && smArray[k].row == i)//處理A的第i行元素
   {
             int tc = smArray[k].col;
             for (int j=rowStart[tc]; b.smArray[j].row == tc; j++)//處理B的第tc行數(shù)據(jù):進(jìn)行累積
             {
      ctemp[b.smArray[j].col] += smArray[k].value * b.smArray[j].value;
    }
    k++;
         }
        
   for(int j=0; j<b.cols; j++)//得到C的第i行中每一個(gè)元素的值
   {
    if(ctemp[j] != 0)//壓縮存儲(chǔ)該行非零元
    {
     if(top == MAXTERMS)
      return t;
     c.smArray[top].row = i;
     c.smArray[top].col = j;
     c.smArray[top++].value = ctemp[j];//C的元素值等于A的行數(shù)ctemp[j]的累積值
    } //if(ctemp[j] != 0)
   }
  }//for arow
  c.terms = top;
 }
 
 delete []rowSize;
 delete []rowStart;
 delete []ctemp;
 
 return c;
} //  MultSMatrix

int main(int argc, char *argv[])
{
  SparseMatrix<int> obja(2, 3);
  obja.Display();
  
  int arr[100] = {0};
  int r = 3, c = 3;
  for (int i=0; i<r; i++)
      for (int j=0; j<c; j++)
          cin >> arr[i*c+j];
   //
//   for (int i=0; i<r; i++)
//   {
//      for (int j=0; j<c; j++)
//          cout << arr[i*c+j] << " ";
//        cout << endl;
//   }
//   cout << endl;
  
   SparseMatrix<int> objb(arr, r, c);
   objb.DisArray();
  
   SparseMatrix<int> objc = objb.Transpose();
   objc.DisArray();
  
   //obja = objc;
//   objc.Display();
//   objc.DisArray();
//  
//   SparseMatrix<int> objd = obja.Transpose();
//   objd.Display();
//   objd.DisArray();
//  
   SparseMatrix<int> obje = objb.Multiply(objc);
   obje.Display();
   obje.DisArray();

  
    system("PAUSE");
    return EXIT_SUCCESS;
}

Posted on 2010-05-07 09:58 夢(mèng)想飛揚(yáng) 閱讀(3331) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品高潮在线| 国产农村妇女精品一区二区| 亚洲激情第一区| 久久精品久久综合| 亚洲国产综合91精品麻豆| 欧美高清日韩| 中文一区二区在线观看| 嫩草成人www欧美| 日韩视频一区二区三区| 久久精品三级| 伊人色综合久久天天| 欧美国产专区| 欧美精品三区| 欧美成人免费全部| 久久精品国产精品| 亚洲欧美日韩综合国产aⅴ | 亚洲国产一区二区视频| 亚洲日本无吗高清不卡| 黄色成人av在线| 国产精品区免费视频| 欧美高潮视频| 国产精品久久久久国产精品日日| 国产亚洲福利一区| 国产精品一区二区三区久久| 欧美精品一区三区| 欧美成人午夜激情| 国产精品久久久久久久一区探花| 欧美激情一区二区三区| 国产精品毛片a∨一区二区三区|国| 国产欧美一区二区精品仙草咪 | 一区二区三区精品视频| 91久久线看在观草草青青| 一区在线观看视频| 一区二区在线不卡| 中文欧美在线视频| 99精品视频免费全部在线| 亚洲精品一区二区在线观看| 亚洲欧美www| 久久福利毛片| 久久久久国产精品一区三寸| 久久精品二区亚洲w码| 亚洲欧美久久久| 亚洲大胆av| 亚洲黄色免费网站| 亚洲国产精品激情在线观看| 亚洲欧美日韩第一区| 欧美日韩精品中文字幕| 国产精品久久久久久亚洲毛片| 一区国产精品| 久久九九精品99国产精品| 亚洲视频在线观看免费| 香蕉久久精品日日躁夜夜躁| 久久gogo国模啪啪人体图| 久久国产毛片| 国产精品久久久久久久久免费| 亚洲伦伦在线| 亚洲国产精品电影在线观看| 亚洲欧美国内爽妇网| 久久久国产一区二区| 国产欧美综合一区二区三区| 亚洲欧美另类在线观看| 日韩写真在线| 国产精品欧美日韩| 欧美伦理在线观看| 亚洲欧美日韩直播| 亚洲一区黄色| 欧美午夜精品久久久| 欧美视频中文一区二区三区在线观看 | 亚洲一区999| 亚洲视频视频在线| 男女av一区三区二区色多| 欧美精品二区| 亚洲国产欧洲综合997久久| 久久亚洲国产成人| 亚洲国产综合视频在线观看| 麻豆精品91| 国产精品午夜电影| 午夜宅男久久久| 欧美黑人在线观看| 亚洲永久精品大片| 国产精品一区在线观看| 亚洲特色特黄| 亚洲一二三区在线| 国产欧美激情| 免费欧美高清视频| 欧美在线视频一区二区三区| 国产午夜精品理论片a级探花 | 国产精品中文字幕欧美| 久久国产精品一区二区| 久久精品中文字幕一区| 亚洲国产三级网| 亚洲另类自拍| 欧美1区视频| 亚洲性图久久| 亚洲国产三级网| 欧美图区在线视频| 久久免费视频网站| 羞羞视频在线观看欧美| 欧美精品九九99久久| 亚洲午夜精品网| 欧美一区二区三区播放老司机| 久久久成人精品| 日韩一级二级三级| 亚洲欧美乱综合| 亚洲日本欧美| 欧美一区三区二区在线观看| 亚洲日本激情| 欧美一区激情| 亚洲午夜羞羞片| 麻豆精品精华液| 欧美一乱一性一交一视频| 日韩视频在线你懂得| 韩日精品在线| 亚洲图片欧美日产| 91久久国产综合久久91精品网站| 久久综合国产精品| 一区二区三区在线免费视频| 亚洲欧美日韩国产成人精品影院| 欧美一区二区三区四区在线观看| 欧美午夜a级限制福利片| 亚洲美女在线观看| 欧美一区激情视频在线观看| 国产亚洲精品久| 欧美日韩三级| 亚洲精品资源| 国产香蕉97碰碰久久人人| 亚洲精品日韩久久| 欧美一区二区三区四区在线观看地址 | 国产日韩欧美电影在线观看| 亚洲人久久久| 裸体歌舞表演一区二区| 先锋影音久久久| 欧美另类69精品久久久久9999| 久久人人超碰| 国产一区二区日韩精品欧美精品| 中文在线资源观看网站视频免费不卡| 亚洲国内精品| 在线视频免费在线观看一区二区| 亚洲品质自拍| 免费成人av| 欧美黑人国产人伦爽爽爽| 欧美三级视频在线播放| 99re6热只有精品免费观看| 亚洲另类春色国产| 欧美电影免费观看高清| 亚洲国产美女精品久久久久∴| 亚洲精品1区2区| 欧美a级一区| 亚洲国产精品第一区二区三区| 亚洲日韩欧美视频一区| 欧美国产免费| 亚洲精品一区二区在线| 亚洲免费人成在线视频观看| 欧美亚一区二区| 欧美一级视频精品观看| 久久精品亚洲精品| 亚洲高清在线观看一区| 日韩一级成人av| 亚洲欧美日韩中文视频| 国产精品自拍在线| 久久久91精品国产一区二区三区| 免费观看30秒视频久久| 亚洲精品影院| 欧美色欧美亚洲另类二区| 亚洲永久免费av| 美女精品国产| 亚洲视频在线一区观看| 国产欧美大片| 免费毛片一区二区三区久久久| 亚洲精品久久久久久久久久久| 欧美亚洲一区三区| 亚洲国产日韩欧美综合久久| 欧美日本精品| 欧美剧在线观看| 欧美在线二区| 在线成人av网站| 欧美日韩高清在线| 亚洲综合欧美| 亚洲欧洲一级| 欧美一级淫片播放口| 在线日韩成人| 先锋影音国产一区| 欧美大片免费观看在线观看网站推荐| 国产精品看片你懂得| 久久成人精品一区二区三区| 最新成人av网站| 久久久精品动漫| 亚洲视频在线观看| 在线电影院国产精品| 国产精品久久久久久模特 | 亚洲一区三区电影在线观看| 美脚丝袜一区二区三区在线观看| 一本综合久久| 亚洲欧美日韩国产综合| 极品少妇一区二区| 欧美午夜寂寞影院| 欧美美女操人视频| 久久亚洲综合| 亚洲激情婷婷| 久久综合色婷婷|