/*
矩阵快速转置
*/
#include<stdio.h>
#include<malloc.h>
#define MaxSize 11
#define Row 11
#define Col 11
typedef struct
{
int row,col;
int e;
}Triple;
typedef struct
{
Triple data[MaxSize+1];
int m,n,len;//m代表行,n代表列,len代表长度
}TSMatrix;
//快速转置
void FastTransposeSMatrix(TSMatrix,TSMatrix *);
void main()
{
int i,j;
int num[Row][Col]={0};
int a[8]={1,1,3,3,4,5,6,6};
int b[8]={2,3,1,6,3,2,1,4};
int c[8]={12,9,-3,14,24,18,15,-7};
TSMatrix A,*B;
A.m=Row-1;
A.n=Col-1;
A.len=8;
for(i=1;i<=A.len;i++)
{
A.data[i].row=a[i-1];
A.data[i].col=b[i-1];
A.data[i].e=c[i-1];
num[a[i-1]][b[i-1]]=c[i-1];
}
printf("\n");
printf("转换之前:\n\n");
for(i=1;i<Row;i++)
{
for(j=1;j<Col;j++)
{
printf("%-3d",num[i][j]);
}
printf("\n");
}
printf("\n三元组表:\n\nrow col v\n");
for(i=1;i<=A.len;i++)
{
printf(" %d %d %d\n",A.data[i].row,A.data[i].col,A.data[i].e);
}
B=(TSMatrix *)malloc(sizeof(TSMatrix));
FastTransposeSMatrix(A,B);
for(i=1;i<Row;i++)
{
for(j=1;j<Col;j++)
{
num[i][j]=0;//清零
}
}
for(i=1;i<=B->len;i++){
num[B->data[i].row][B->data[i].col]=B->data[i].e;
}
printf("转换之后:\n\n");
for(i=1;i<Row;i++)
{
for(j=1;j<Col;j++)
{
printf("%-3d",num[i][j]);
}
printf("\n");
}
printf("\n三元组表:\n\nrow col v\n");
for(i=1;i<=B->len;i++)
{
printf(" %d %d %d\n",B->data[i].row,B->data[i].col,B->data[i].e);
}
}
void FastTransposeSMatrix(TSMatrix A,TSMatrix *B)
{
int num[MaxSize],cpot[MaxSize];
int col,t,p,q;
B->m=A.n;
B->n=A.n;
B->len=A.len;
if(B->len)
{
for(col=1;col<=A.n;col++)
{
num[col]=0;//所有列的非零个数先清零
}
for(t=1;t<=A.len;t++)//依次扫描A矩阵
{
num[A.data[t].col]++;
}
cpot[1]=1;
//求第col列中第一个非零元在B中的序号
for(col=2;col<A.n;col++)
{
cpot[col]=cpot[col-1]+num[col-1];
}
for(p=1;p<=A.len;p++)
{
col=A.data[p].col;
q=cpot[col];
B->data[q].row=A.data[p].col;
B->data[q].col=A.data[p].row;
B->data[q].e=A.data[p].e;
cpot[col]++;
}
}
}
数据结构之矩阵快速转置
最新推荐文章于 2024-08-13 17:15:43 发布