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

/*
  Name: 三元組稀疏矩陣類
  始發(fā)于goal00001111的專欄;允許自由轉(zhuǎn)載,但必須注明作者和出處
  Author: goal00001111
  Date: 07-05-10 09:51
  Description: 三元組稀疏矩陣類:實現(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ù)和非零元素個數(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];//存儲每列的非零元素個數(shù)
 int * colStart = new int[cols];//存儲每列第一個非零元素在三元組中的位置(下標(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每一列中非零元素的個數(shù)
   
  colStart[0] = 0;// 確定矩陣M第i列中第一個非零元素在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列中第一個非零元素在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列中第一個非零元素在t.smArray中的位置向前移動一位
  }//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]; //存儲b每行的非零元素個數(shù)
 int * rowStart = new int[b.rows];//存儲b每行的首個非零元素位置
 int * ctemp = new int[b.cols]; //存儲b中與a某個元素做乘法運(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每一行中非零元素的個數(shù)
   
  rowStart[0] = 0;// 確定矩陣b第i行中第一個非零元素在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++)//對A進(jìn)行逐行處理,即對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行中每一個元素的值
   {
    if(ctemp[j] != 0)//壓縮存儲該行非零元
    {
     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 夢想飛揚(yáng) 閱讀(3333) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(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>
            一区二区三区欧美激情| 99精品欧美一区| 欧美性猛交视频| 久久综合色88| 国产精品一二三四| 亚洲伦理在线| 亚洲欧洲三级电影| 久久久欧美精品| 久久精品国产99精品国产亚洲性色| 欧美 日韩 国产在线| 久久免费国产| 国产日韩欧美一区二区三区在线观看| 亚洲裸体在线观看| 91久久国产综合久久91精品网站| 欧美一级免费视频| 亚洲欧美日本国产有色| 欧美日本韩国一区| 亚洲高清不卡av| 亚洲激情偷拍| 久久夜色撩人精品| 欧美成人激情视频| 亚洲第一精品久久忘忧草社区| 欧美一区成人| 久久免费黄色| 精品电影在线观看| 久久噜噜噜精品国产亚洲综合 | 国内精品一区二区三区| 亚洲欧美日韩国产| 久久爱91午夜羞羞| 国产亚洲a∨片在线观看| 午夜国产精品影院在线观看| 羞羞答答国产精品www一本| 国产精品进线69影院| 一区二区三区高清不卡| 香蕉久久夜色精品国产| 国产精品一区亚洲| 欧美一区二区视频在线观看| 久久精品一区四区| 在线观看av不卡| 免费观看一区| 亚洲毛片在线| 午夜精品一区二区三区在线视| 国产精品性做久久久久久| 午夜精品福利视频| 麻豆精品91| 99re热精品| 国产精品国产a级| 欧美一区二区在线观看| 欧美xxx成人| 一级日韩一区在线观看| 国产精品日日做人人爱| 久久精品亚洲乱码伦伦中文 | 在线观看视频一区二区欧美日韩| 久久米奇亚洲| 99国产精品视频免费观看| 欧美一区二区三区四区高清| 欲色影视综合吧| 欧美日韩成人一区二区| 亚洲永久在线观看| 欧美成人国产| 亚洲男人影院| 在线观看欧美视频| 国产精品久久久久久av福利软件 | 一区二区三区久久网| 欧美专区中文字幕| 最新亚洲一区| 国产欧美一区二区精品秋霞影院| 老妇喷水一区二区三区| 一级成人国产| 欧美激情第三页| 久久国产日本精品| 一区二区欧美亚洲| 亚洲第一狼人社区| 国产精品私房写真福利视频| 麻豆精品在线观看| 性欧美暴力猛交另类hd| 亚洲卡通欧美制服中文| 蜜桃av一区二区三区| 亚洲在线观看视频网站| 亚洲国产欧美日韩另类综合| 国产精品ⅴa在线观看h| 男女激情久久| 久久久www成人免费精品| 一区二区三区欧美在线观看| 亚洲国产欧美在线人成| 久久婷婷丁香| 欧美在线3区| 亚洲视频第一页| 亚洲精品日韩综合观看成人91| 国产在线观看一区| 国产精品入口日韩视频大尺度| 欧美激情第一页xxx| 久久躁日日躁aaaaxxxx| 亚洲男人影院| 亚洲视频久久| 中文一区在线| 夜夜躁日日躁狠狠久久88av| 亚洲激情网站免费观看| 免费毛片一区二区三区久久久| 久久九九热re6这里有精品| 亚洲欧美视频在线观看| 亚洲午夜电影在线观看| 亚洲深夜av| 亚洲一区久久久| 亚洲男人第一网站| 亚洲自拍偷拍网址| 中国亚洲黄色| 亚洲一区二区在线免费观看| 中文av字幕一区| 亚洲一级电影| 亚洲女女做受ⅹxx高潮| 性欧美1819性猛交| 久久久999精品免费| 久久精品一区二区| 久久亚洲影院| 欧美国产日本| 亚洲国产一区在线观看| 亚洲国产精品久久久久久女王| 亚洲黄色免费电影| 日韩午夜在线播放| 亚洲亚洲精品在线观看 | 欧美a级片网站| 欧美国产精品一区| 欧美日韩国产综合视频在线观看中文 | 亚洲韩国青草视频| 99re66热这里只有精品3直播| 亚洲国产裸拍裸体视频在线观看乱了中文| 欧美岛国在线观看| 亚洲欧洲日本专区| 一区二区三区四区蜜桃| 午夜精品久久久久久99热软件| 久久精品国产久精国产爱| 久久久久免费视频| 欧美人与禽猛交乱配视频| 国产精品久久久久9999| 国产香蕉久久精品综合网| 亚洲国产日韩综合一区| 亚洲视频专区在线| 久久久一本精品99久久精品66| 女女同性女同一区二区三区91| 亚洲黄色免费| 午夜久久福利| 欧美大片在线观看一区| 国产精品视屏| 亚洲精品在线视频| 午夜在线精品| 亚洲二区免费| 香蕉国产精品偷在线观看不卡| 欧美成人午夜激情视频| 国产伦精品一区二区三区免费迷| 一区福利视频| 午夜精品福利在线观看| 你懂的视频一区二区| 亚洲视频精品在线| 蜜臀91精品一区二区三区| 国产精品日日摸夜夜摸av| 最新日韩欧美| 久久九九热免费视频| 99re66热这里只有精品4| 久久香蕉精品| 国产精品制服诱惑| 亚洲视频一区| 91久久久亚洲精品| 久久不射2019中文字幕| 欧美系列亚洲系列| 亚洲精品视频中文字幕| 久久久久国产一区二区| 亚洲作爱视频| 欧美精品日韩www.p站| 亚洲高清一区二| 久久久久久亚洲精品不卡4k岛国| 亚洲精品一区在线观看| 另类欧美日韩国产在线| 国产婷婷色综合av蜜臀av| 亚洲永久视频| 亚洲毛片视频| 欧美精品在线极品| 91久久夜色精品国产九色| 久久久久久久波多野高潮日日| 亚洲午夜久久久久久久久电影院 | 午夜精品在线观看| 亚洲国产另类久久精品| 麻豆国产精品一区二区三区 | 久久亚洲精品欧美| 亚洲综合不卡| 欧美亚洲不卡| 亚洲永久网站| 亚洲一区二区三区在线观看视频| 欧美日韩国产电影| 中日韩午夜理伦电影免费| 亚洲精品欧洲| 欧美日韩亚洲在线| 亚洲午夜羞羞片| 亚洲午夜激情网页| 国产精品综合视频| 久久国产视频网| 久久久久一区二区| 亚洲电影免费观看高清完整版| 美女黄毛**国产精品啪啪 | 欧美专区日韩视频|