当一个矩阵中非零元素远小于矩阵中元素的个数时,如果用简单的二维数组来表示矩阵就会造成大量的空间占用, 所以引进三元组来表示稀疏矩阵。
如下:
typedef struct{
int i , j;//表示非零元素的行列
int v;//矩阵的非零元素
}SPNode;
typedef struct{
int m , n , t;//表示矩阵的行,列及非零元素的个数
SPNode data[SMAX];//三元组表
}SPMatrix;
即三元组。
以下我们就用三元组来实现矩阵的基本运算:转置
一般算法
将原三元组a的行、列、元素值装换为b的列、行、元素值;
按a的行或b的列进行循环处理:对a的每一列进行扫描,找出相应的元素,交换行号和列号。
代码:
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;
}
}
}
}
}
快速算法
主要思想:a中第二列的第一个非零元素等于第一列的第一个元素位置加上第一列的非零元素。
引入两个向量:num[col]和cpot[col]。
前者表示:第col列的非零元素的个数
后者表示:第col列的第一个非零元素的位置
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;
}