1. 程式人生 > >三元組轉置稀疏矩陣

三元組轉置稀疏矩陣



當一個矩陣中非零元素遠小於矩陣中元素的個數時,如果用簡單的二維陣列來表示矩陣就會造成大量的空間佔用, 所以引進三元組來表示稀疏矩陣。

如下:

typedef struct{

int i , j;//表示非零元素的行列

int v;//矩陣的非零元素

}SPNode;

 

typedef struct{

int m , n , t;//表示矩陣的行,列及非零元素的個數

SPNode data[SMAX];//三元組表

}SPMatrix;

 

即三元組。

以下我們就用三元組來實現矩陣的基本運算:轉置

  1. 一般演算法

  1. 將原三元組a的行、列、元素值裝換為

    b的列、行、元素值;

  2. a的行或b的列進行迴圈處理:對a的每一列進行掃描,找出相應的元素,交換行號和列號。

  3. 程式碼:

    void TransposeSMatrix(SPMatrix *a , SPMatrix *b)//轉置

    {

    int q , col , p;//將原三元組a的行、列、元素值裝換為b的列、行、元素值;

    b -> m = a -> n;

    b -> n = a -> m;

    b -> t = a -> t;

    if(b -> t)//a的行或b的列進行迴圈處理:對a的每一列進行掃描,找出相應的元素,交換行號和列號。

     

    {

    q = 0;

    for(col = 1 ; col <= a -> n ; ++col)

    {

    for(p = 0 ; p < a -> t ; ++p)

    {

    if(a-> data[p].j == col)

    {

    b-> data[q].i = a-> data[p].j;

    b-> data[q].j = a-> data[p].i;

    b-> data[q].v = a-> data[p].v;

    ++q;

    }

    }

    }

    }

    }

  1. 快速演算法

  1. 主要思想:a中第二列的第一個非零元素等於第一列的第一個元素位置加上第一列的非零元素。

  2. 引入兩個向量:num[col]

    cpot[col]

    前者表示:第col列的非零元素的個數

    後者表示:第col列的第一個非零元素的位置

  3. Cpot[1] =1

          Cpot[col] = cpot[col - 1] +num[col-1]     2<=col<=n

    4 將原三元組a的行、列、元素值裝換為b的列、行、元素值;

    5 程式碼:

    SPMatrix *Trans(SPMatrix *a)//轉置

    {

    SPMatrix *b;

    int i , j ,k;

    int num[SMAX], cpot[SMAX];

    b = (SPMatrix  *)malloc(sizeof(SPMatrix));

    b->m = a -> n;

    b->n = a -> m;

    b->t = a -> t;

    if(b -> t>0)

    {

    for(i = 1 ; i <= a-> n;i++)

    num[i] = 0;

    for(i =1 ; i <= a->t;i++)

    {

    j = a-> data[i].j;

    num[j]++;

    }

    cpot[1]=1;

    for(i=2; i<=a->t;i++)

    {

    cpot[i]= cpot[i-1] + num[i-1];

    }

    for(i=1;i<=a->t;i++)

    {

    j=a->data[i].j;

    k=cpot[j];

    b->data[k].i=b->data[i].j;

    b->data[k].j=b->data[i].i;

    b->data[k].v=b->data[i].v;

    cpot[j]++;

    }

    }

    return b;

    }