矩陣三元組表
這裡講的矩陣三元組表有建立矩陣三元組表,求三元組表的轉置矩陣,三元組表矩陣相乘,輸出三元組表矩陣。
#include <stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int Status;
typedef float ElemType;
typedef struct{//三元組結構
int i,j;//非零元素行下標和列下標
ElemType e;//非零元素值
}Triple;
Triple data[MAXSIZE+1];//非零元三元組表,data[0]不用
int mu,nu,tu;//矩陣的行數、列數和非零元素個數
}TSMatrix;
TSMatrix NewMatrix(int m,int n);
//新建一個三元組表示的稀疏矩陣
Status InsertElem(TSMatrix *M,int row,int col,ElemType e);
//在三元組表示的稀疏矩陣M,第 row 行,第 col 列位置插入元素e
//插入成功,返回OK,否則返回ERROR
Status FindElem(const TSMatrix *M,int row,int col,ElemType *e);
//查詢三元組表示的稀疏矩陣M中,第 row 行,第 col列元素,若不為0,
//則用e返回其值,並返回TRUE,否則返回FALSE
Status TransposeSMatrix(const TSMatrix *M,TSMatrix *T);
//採用三元組表儲存表示,求稀疏矩陣M的
Status MultSMatrix(const TSMatrix *M,const TSMatrix *T,TSMatrix *Q);
//稀疏矩陣的乘法,如果符合乘法規則,Q返回M*T結果,並返回OK,否則返回ERROR
void PrintSMatrix(const TSMatrix *M);
//列印稀疏矩陣所有元素
int main()
{
TSMatrix M=NewMatrix(3,4);
TSMatrix T;
TSMatrix Q;
InsertElem(&M,3,2,3.65);
InsertElem(&M,2,2,2.31);
printf("\nM:");
PrintSMatrix(&M);
TransposeSMatrix(&M,&T);
printf("\nT(Transpose of M):");
PrintSMatrix(&T);
MultSMatrix(&M,&T,&Q);
printf("\nM*T=");
PrintSMatrix(&Q);
return 0;
}
TSMatrix NewMatrix(int m,int n){
//
TSMatrix M;
M.mu=m;
M.nu=n;
M.tu=0;
return M;
}
Status InsertElem(TSMatrix *M,int row,int col,ElemType e){
//在三元組表示的稀疏矩陣M,第 row 行,第 col 列位置插入元素e
//插入成功,返回OK,否則返回ERROR
int i,t,p;
if(M->tu>=MAXSIZE){//當前三元組表已滿
printf("\nError:There is no space in the matrix;\n");
return ERROR;
}
if(row>M->mu||col>M->nu||row<1||col<1){//插入位置越界,不在1~mu或1~nu之間
printf("\nError:Insert position is beyond the arrange.\n");
return ERROR;
}
p=1;//標誌新元素應該插入的位置
if(M->tu==0){//插入前矩陣M沒有非零元素
M->data[p].i=row;
M->data[p].j=col;
M->data[p].e=e;
M->tu++;
return OK;
}
for(t=1;t<=M->tu;t++)//尋找合適的插入位置
if((row>=M->data[t].i)&&(col>=M->data[t].j))
p++;
if(row==M->data[t-1].i && col==M->data[t-1].j){//插入前,該元素已經存在
M->data[t-1].e=e;
return OK;
}
for(i=M->tu;i>=p;i--){//移動p之後的元素
M->data[i+1].i=M->data[i].i;
M->data[i+1].j=M->data[i].j;
M->data[i+1].e=M->data[i].e;
}
//插入新元素
M->data[p].i=row;
M->data[p].j=col;
M->data[p].e=e;
M->tu++;
return OK;
}
Status FindElem(const TSMatrix *M,int row,int col,ElemType *e){
//查詢三元組表示的稀疏矩陣M中,第 row 行,第 col列元素,若不為0,
//則用e返回其值,並返回TRUE,否則返回FALSE
int p;
for(p=1;p<=M->tu;p++)
if(M->data[p].i==row&&M->data[p].j==col){
*e=M->data[p].e;
return TRUE;
}
return FALSE;
}
Status TransposeSMatrix(const TSMatrix *M,TSMatrix *T){
//採用三元組表儲存表示,求稀疏矩陣M的轉置矩陣T
int col,p,q;
T->mu=M->nu; T->nu=M->mu; T->tu=M->tu;
if(T->tu){
q=1;
for(col=1;col<=M->mu;col++)
for(p=1;p<=M->tu;p++)
if(M->data[p].j==col){
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
q++;
}
}
return OK;
}
Status MultSMatrix(const TSMatrix *M,const TSMatrix *T,TSMatrix *Q){
//稀疏矩陣的乘法,如果符合乘法規則,Q返回M*T結果,並返回OK,否則返回ERROR
int i,j,k,p;
ElemType m,t,s;
if(M->nu!=T->mu){
printf("Sorry,these two matrice can't multiply.\n");
return ERROR;
}
Q->mu=M->mu; Q->nu=T->nu; Q->tu=0;
p=1;
for(i=1;i<=Q->mu;i++){
for(j=1;j<=Q->nu;j++){
s=0;
for(k=1;k<=M->nu;k++){
if(FALSE==FindElem(M,i,k,&m))
continue;
if(FALSE==FindElem(T,k,j,&t))
continue;
s+=m*t;
}
if(s!=0){//Q[i][j]非零
Q->data[p].i=i;
Q->data[p].j=j;
Q->data[p].e=s;
p++;
Q->tu++;
}
}
}
return OK;
}
void PrintSMatrix(const TSMatrix *M){
//列印稀疏矩陣所有元素
int i,j,p=1;
printf("\nsize:%d × %d\n",M->mu,M->nu);
if(!M->tu){//0矩陣
printf("%g\n",0.0);
return;
}
for(i=1;i<=M->mu;i++){
for(j=1;j<=M->nu;j++){
if(i==M->data[p].i && j==M->data[p].j){
printf("%g\t",M->data[p].e);
p++;
}else{
printf("%g\t",0.0);
}
}
printf("\n");
}
printf("\n");
}