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

/*
  Name: 三元組稀疏矩陣類
  始發于goal00001111的專欄;允許自由轉載,但必須注明作者和出處
  Author: goal00001111
  Date: 07-05-10 09:51
  Description: 三元組稀疏矩陣類:實現了矩陣的轉置,加法和乘法運算
*/
#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> //重載賦值運算符
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); //構造函數1
    SparseMatrix(const T a[], int maxRow, int maxCol);      //構造函數2
    SparseMatrix(const SparseMatrix<T> & b);      //拷貝構造函數
    SparseMatrix<T> & operator = (const SparseMatrix<T> & b);//重載賦值運算符
   
    void Display(); //輸出三元組
    void DisArray();//輸出矩陣
    SparseMatrix<T> Transpose();//三元組順序表:轉置矩陣
    SparseMatrix<T> FastTranspose();//三元組順序表:快速轉置矩陣
 SparseMatrix<T> Add(SparseMatrix<T> b);//矩陣相加
    SparseMatrix<T> Multiply(SparseMatrix<T> b);//矩陣相乘
private:
    int rows, cols, terms;//矩陣的行數,列數和非零元素個數
    Trituple<T> smArray[MAXTERMS];//三元組順序表
};


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

template <typename T> //構造函數2:將二維數組轉換為三元組
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> //拷貝構造函數
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>//重載賦值運算符
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()//三元組順序表:轉置矩陣
{
 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()//三元組順序表:快速轉置矩陣
{
    SparseMatrix<T> t(cols, rows, terms);
 int * colSize = new int[cols];//存儲每列的非零元素個數
 int * colStart = new int[cols];//存儲每列第一個非零元素在三元組中的位置(下標)
 
 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每一列中非零元素的個數
   
  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)//矩陣相加:采用合并算法,行序優先
{
    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結束,若B還有元素,則將B的元素直接放入C中
    {
        while (j < b.terms)
            c.smArray[k++] = b.smArray[j++];
    }
    else //B結束,若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每行的非零元素個數
 int * rowStart = new int[b.rows];//存儲b每行的首個非零元素位置
 int * ctemp = new int[b.cols]; //存儲b中與a某個元素做乘法運算的第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每一行中非零元素的個數
   
  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進行逐行處理,即對C進行逐行處理
  {
   for(int j=0; j<b.cols; j++)//當前各元素累加器清零
    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行數據:進行累積
             {
      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的行數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 夢想飛揚 閱讀(3331) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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精品| 亚洲欧洲一级| 性欧美长视频| 欧美成人黑人xx视频免费观看| 亚洲国产美女久久久久| 亚洲久久成人| 欧美主播一区二区三区美女 久久精品人| 久久成人在线| 欧美久久久久久久久| 国产欧美视频在线观看| 亚洲国产精品va在线看黑人动漫 | 国产精品青草综合久久久久99 | 欧美成人日韩| 一区二区三区四区五区精品| 欧美专区在线播放| 欧美日韩精品免费观看视频| 国产一级久久| 亚洲欧美日韩一区在线| 欧美成人国产va精品日本一级| 一区二区三区黄色| 欧美大片在线观看一区| 国产在线乱码一区二区三区| 亚洲一区二区免费视频| 欧美激情亚洲国产| 久久精品女人| 国产一区二区三区高清在线观看 | 欧美视频在线一区二区三区| 亚洲国产精品久久久久秋霞不卡| 欧美一级视频精品观看| 亚洲精品一品区二品区三品区| 久久久精品国产一区二区三区| 欧美午夜精品久久久| 最新精品在线| 欧美gay视频激情| 久久精品国产久精国产思思| 国产精品日本欧美一区二区三区| 日韩亚洲综合在线| 亚洲大片免费看| 免费观看在线综合| 在线观看亚洲一区| 免费亚洲电影在线观看| 久久九九免费视频| 在线看国产日韩| 欧美成人资源网| 久久一区亚洲| 亚洲第一在线综合在线| 欧美va亚洲va香蕉在线| 久久青草福利网站| 亚洲国产乱码最新视频| 牛牛影视久久网| 亚洲精品久久久久久久久| 美女久久网站| 久久精品99久久香蕉国产色戒| 国产亚洲人成网站在线观看| 欧美中在线观看| 欧美在线一级va免费观看| 国产曰批免费观看久久久| 久久亚洲精品视频| 欧美aa国产视频| 一区二区三区国产盗摄| 在线亚洲激情| 国产一区二区电影在线观看| 老鸭窝毛片一区二区三区| 美女被久久久| 亚洲一区尤物| 久久精品视频在线观看| 亚洲黄色大片| 99亚洲视频| 国产一区二区三区四区| 欧美国产一区二区| 欧美日韩中文字幕精品| 久久九九99| 欧美精品videossex性护士| 亚洲欧美激情视频| 久久国产精品久久久久久久久久 | 亚洲性夜色噜噜噜7777| 亚洲免费中文| 亚洲高清av在线| 在线亚洲成人| 精品不卡一区| 一区二区三区精品视频在线观看| 国产欧美日韩综合精品二区| 欧美激情五月| 国产日韩三区| 日韩西西人体444www| 黑人巨大精品欧美黑白配亚洲| 亚洲国产精品久久久| 国产偷国产偷精品高清尤物| 亚洲第一黄网| 国产欧美视频一区二区三区| 亚洲第一中文字幕| 国产一区三区三区| 中文精品视频一区二区在线观看| 在线日本高清免费不卡| 亚洲免费小视频| 一区二区三区免费观看| 老司机免费视频一区二区| 欧美一区三区二区在线观看| 欧美人与禽猛交乱配视频| 久久综合五月天婷婷伊人| 国产精品久久| 99国内精品久久久久久久软件| 亚洲国产精品一区二区第一页| 亚洲自拍电影| 亚洲中字黄色| 欧美人成在线视频| 亚洲国产专区校园欧美| 在线观看国产精品淫| 欧美一区二区三区在线观看视频 | 欧美好骚综合网| 欧美成人在线影院| 亚洲欧美一级二级三级| 99re热这里只有精品视频| 久久久久久久久一区二区| 欧美一区二区三区日韩| 国产精品日韩欧美大师| 9i看片成人免费高清| 夜夜爽www精品| 欧美女同视频| 亚洲人成在线观看一区二区| 亚洲人体大胆视频| 你懂的亚洲视频| 欧美韩日一区二区三区| 亚洲国内自拍| 欧美精品三级日韩久久| 亚洲另类一区二区| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美区二区三区| 99re热精品| 午夜在线观看免费一区| 国产一区二区三区高清播放| 久久久久一本一区二区青青蜜月| 噜噜噜91成人网| 亚洲福利视频一区| 欧美久色视频| 亚洲一区国产精品| 久久久久九九九九| 亚洲电影激情视频网站| 欧美国产一区二区| 一本久久a久久精品亚洲| 性欧美办公室18xxxxhd| 国产有码一区二区| 蜜桃视频一区| 一区二区免费在线播放| 久久不射网站| 亚洲国产美国国产综合一区二区 | 国产精品久久久久aaaa| 午夜精品一区二区三区四区 | 欧美777四色影视在线| 日韩亚洲欧美综合| 国产精品视频福利| 久久久xxx| 99精品视频免费在线观看| 欧美一区午夜精品| 亚洲经典在线看| 国产精品人成在线观看免费| 久久久亚洲国产美女国产盗摄| 最新69国产成人精品视频免费| 亚洲男人第一网站| 亚洲电影免费在线观看| 欧美视频中文字幕在线| 久久精品日产第一区二区三区 | 久久国产日韩| 亚洲肉体裸体xxxx137| 久久精品一区二区| 夜久久久久久| 伊人男人综合视频网| 欧美午夜寂寞影院| 欧美不卡视频| 欧美在线视频全部完| 99精品99| 亚洲国产婷婷香蕉久久久久久| 欧美一区二区精品在线| 亚洲精品免费一二三区| 国产亚洲电影| 欧美午夜电影完整版| 欧美xx69| 久久国产欧美| 亚洲日本成人在线观看| 国内一区二区三区| 欧美午夜在线一二页| 欧美成人精品福利| 久久久久久高潮国产精品视| 亚洲少妇自拍| 亚洲美女少妇无套啪啪呻吟| 欧美a级一区| 免费在线欧美黄色| 久久人人爽人人| 久久经典综合|