⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 稀疏矩阵转置.c

📁 实现系数矩阵的转置。程序的母的主要是学习稀疏矩阵的存储和实现
💻 C
字号:
#include<stdio.h> 
#define MAXSIZE 100 /* 非零元个数的最大值 */ 
typedef struct triple 
{ 
int i,j; /* 行下标,列下标 */ 
int e; /* 非零元素值 */ 
}triple; 
typedef struct tsmatrix 
{ 
triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用 */ 
int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */ 
/* 各列第一个非零元的位置表rpos[0]未用 */ 
}rlsmatrix; 

createsmatrix(rlsmatrix *M) 
{ /* 创建稀疏矩阵M */ 
int e,i,m,n; 
M->data[0].i=0; /* 为以下比较顺序做准备 */ 
printf("Please enter the matrix rows, columns, and the number of non-zero elements:\n"); /*输入矩阵的行数,列数,和非零元素的个数*/
scanf("%d",&M->mu);scanf("%d",&M->nu);scanf("%d",&M->tu); 
for(i=1;i<=M->tu;i++) 
{ 
printf("please input the non-zero element's row, column and value in row order\n",i,M->mu,M->nu); 
scanf("%d",&m);scanf("%d",&n);scanf("%d",&e); 
if(m<1||m>M->mu||n<1||n>M->nu) /*行或列超出范围 */ 
{printf("Rows or columns out of range!\n");getch();exit();} 
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j) /*行或列的顺序有错*/ 
{printf("Rows or columns in the order is wrong!\n");getch();exit();} 
M->data[i].i=m; 
M->data[i].j=n; 
M->data[i].e=e; 
} 
} 
/* 求矩阵的快速转置 */ 
void transposesmatrix(rlsmatrix M,rlsmatrix *T) 
{ /* cpos存放每列的第一个非零元素的地址,temp中间变量 */ 
int i,m,*cpos,*temp,k=0; 
T->mu=M.nu; 
T->nu=M.mu; 
T->tu=M.tu; 
cpos=(int *)malloc(M.mu*sizeof(int)); 
if(cpos==NULL)exit(); 
temp=(int *)malloc(M.mu*sizeof(int)); 
if(temp==NULL)exit(); 
/* 对cpos对初始化,初值为0 */ 
*(cpos+1)=0; 
for(i=1;i<=M.nu;i++) 
{ 
for(m=1;m<=M.tu;m++) 
{ 
if(M.data[m].j==i) 
k++; 
} 
temp[i]=k; 
if(i==1&&k!=0) 
*(cpos+i)=1;/* 为cpos赋值 */ 
if(i>1) 
*(cpos+i)=*(temp+i-1)+1; 
} 
free(temp); 
for(i=1;i<=M.tu;i++)/* 进行转置 */ 
{T->data[*(cpos+M.data[i].j)].i=M.data[i].j; 
T->data[*(cpos+M.data[i].j)].j=M.data[i].i; 
T->data[*(cpos+M.data[i].j)].e=M.data[i].e; 
(*(cpos+M.data[i].j))++;} 
free(cpos); 
} 


void printmatrix(rlsmatrix M)/*输出 */
{ 
int i,m=1,n,k; 
printf("Matrix's simplified model is:\n"); 
for(i=1;i<=M.tu;i++) 
printf("%d,%d,%d\n",M.data[i].i,M.data[i].j,M.data[i].e); 
printf("The number of matrix's rows is:%d\n",M.mu); 
printf("The number of matrix's column is:%d\n",M.nu); 
printf("Number of non-zero elements in the matrix is:%d\n",M.tu); 
printf("The matrix is:\n"); 
for(n=1;n<=M.mu;n++) 
{ 
printf("|"); 
for(k=1;k<=M.nu;k++) 
{ 
if(M.data[m].i==n&&M.data[m].j==k) 
{printf("%3d",M.data[m].e); 
m++;} 
else 
printf("  0"); 
} 
printf(" |\n"); 
} 
return; 
} 

void main() 
{ 
rlsmatrix M,N; 
printf("Please input matrix M\n"); 
createsmatrix(&M); 
printmatrix(M); 
getch(); 
printf("M carried out on the matrix transpose!");getch(); 
transposesmatrix(M,&N); 
printf("The matrix after transpose is\n"); 
printmatrix(N); 
getch(); 
} 
/*说明:矩阵元素为整型值*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -