先上原理示意图
1,定义一个记录行列中元素个数的结构体
typedef struct triPle
{
int i;
int j;
int e;
}triPle,*triPlePtr;
用来记录每一列有多好个数据,并且规定转制后每一行的数据应该从那个位置开始排序
2,创建矩阵
typedef struct comPressedmatrix
{
int rows,columns,numelements;
triPle* elements;
}comPressedmatrix,*comPressedmatrixPtr;
3,初始化矩阵和打印矩阵
comPressedmatrixPtr initcompressedmatrix(int pararows,int paracolumns,int paraelements,int**paradata)
{
int i;
comPressedmatrixPtr resultPtr=(comPressedmatrixPtr)malloc(sizeof(struct comPressedmatrix));
resultPtr->rows=pararows;
resultPtr->columns=paracolumns;
resultPtr->numelements=paraelements;
resultPtr->elements=(triPlePtr)malloc(paraelements*sizeof(struct triPle));
for(i=0;i<paraelements;i++)
{
resultPtr->elements[i].i=paradata[i][0];
resultPtr->elements[i].j=paradata[i][1];
resultPtr->elements[i].e=paradata[i][2];
}
return resultPtr;
}
void printcompressedmatrix(comPressedmatrixPtr paraPtr)
{
int i;
for(i=0;i<paraPtr->numelements;i++)
{
printf("(%d %d):%d\r\n",paraPtr->elements[i].i,paraPtr->elements[i].j,paraPtr->elements[i].e);
}
}
4,压缩矩阵转置
comPressedmatrixPtr transposecompressedmatrix(comPressedmatrixPtr paraPtr)
{
int i,tempcolumn,tempposition;
int *tempcolumncounts=(int*)malloc(paraPtr->columns*sizeof(int));
int *tempoffsets=(int*)malloc(paraPtr->columns*sizeof(int));
for(i=0;i<paraPtr->columns;i++)
{
tempcolumncounts[i]=0;
}
comPressedmatrixPtr resultPtr=(comPressedmatrixPtr)malloc(sizeof(struct comPressedmatrix));
resultPtr->rows=paraPtr->columns;
resultPtr->columns=paraPtr->rows;
resultPtr->numelements=paraPtr->numelements;
resultPtr->elements=(triPlePtr)malloc(paraPtr->numelements*sizeof(struct triPle));
for(i=0;i<paraPtr->numelements;i++)
{
tempcolumncounts[paraPtr->elements[i].j]++;
}
tempoffsets[0]=0;
for(i=1;i<paraPtr->columns;i++)
{
tempoffsets[i]=tempoffsets[i-1]+tempcolumncounts[i-1];
printf("tempoffsets[%d] = %d\r\n",i,tempoffsets[i]);
}
for(i=0;i<paraPtr->numelements;i++)
{
tempcolumn=paraPtr->elements[i].j;
tempposition=tempoffsets[tempcolumn];
resultPtr->elements[tempposition].i=paraPtr->elements[i].j;
resultPtr->elements[tempposition].j=paraPtr->elements[i].i;
resultPtr->elements[tempposition].e=paraPtr->elements[i].e;
tempoffsets[tempcolumn]++;
}
return resultPtr;
}
5,全部代码以及运行结果
#include <stdio.h>
#include <stdlib.h>
typedef struct triPle
{
int i;
int j;
int e;
}triPle,*triPlePtr;
typedef struct comPressedmatrix
{
int rows,columns,numelements;
triPle* elements;
}comPressedmatrix,*comPressedmatrixPtr;
comPressedmatrixPtr initcompressedmatrix(int pararows,int paracolumns,int paraelements,int**paradata)
{
int i;
comPressedmatrixPtr resultPtr=(comPressedmatrixPtr)malloc(sizeof(struct comPressedmatrix));
resultPtr->rows=pararows;
resultPtr->columns=paracolumns;
resultPtr->numelements=paraelements;
resultPtr->elements=(triPlePtr)malloc(paraelements*sizeof(struct triPle));
for(i=0;i<paraelements;i++)
{
resultPtr->elements[i].i=paradata[i][0];
resultPtr->elements[i].j=paradata[i][1];
resultPtr->elements[i].e=paradata[i][2];
}
return resultPtr;
}
void printcompressedmatrix(comPressedmatrixPtr paraPtr)
{
int i;
for(i=0;i<paraPtr->numelements;i++)
{
printf("(%d %d):%d\r\n",paraPtr->elements[i].i,paraPtr->elements[i].j,paraPtr->elements[i].e);
}
}
comPressedmatrixPtr transposecompressedmatrix(comPressedmatrixPtr paraPtr)
{
int i,tempcolumn,tempposition;
int *tempcolumncounts=(int*)malloc(paraPtr->columns*sizeof(int));
int *tempoffsets=(int*)malloc(paraPtr->columns*sizeof(int));
for(i=0;i<paraPtr->columns;i++)
{
tempcolumncounts[i]=0;
}
comPressedmatrixPtr resultPtr=(comPressedmatrixPtr)malloc(sizeof(struct comPressedmatrix));
resultPtr->rows=paraPtr->columns;
resultPtr->columns=paraPtr->rows;
resultPtr->numelements=paraPtr->numelements;
resultPtr->elements=(triPlePtr)malloc(paraPtr->numelements*sizeof(struct triPle));
for(i=0;i<paraPtr->numelements;i++)
{
tempcolumncounts[paraPtr->elements[i].j]++;
}
tempoffsets[0]=0;
for(i=1;i<paraPtr->columns;i++)
{
tempoffsets[i]=tempoffsets[i-1]+tempcolumncounts[i-1];
printf("tempoffsets[%d] = %d\r\n",i,tempoffsets[i]);
}
for(i=0;i<paraPtr->numelements;i++)
{
tempcolumn=paraPtr->elements[i].j;
tempposition=tempoffsets[tempcolumn];
resultPtr->elements[tempposition].i=paraPtr->elements[i].j;
resultPtr->elements[tempposition].j=paraPtr->elements[i].i;
resultPtr->elements[tempposition].e=paraPtr->elements[i].e;
tempoffsets[tempcolumn]++;
}
return resultPtr;
}
void compressedmatrixTest()
{
comPressedmatrixPtr tempPtr1,tempPtr2;
int i,j,tempelemetns;
tempelemetns=4;
int** tempmatrix1=(int**)malloc(tempelemetns*sizeof(int*));
for(i=0;i<tempelemetns;i++)
{
tempmatrix1[i]=(int*)malloc(3*sizeof(int));
}
int tempmatrix2[4][3]={{0,0,2},{0,2,3},{2,0,5},{2,1,6}};
for(i=0;i<tempelemetns;i++)
{
for(j=0;j<3;j++)
{
tempmatrix1[i][j]=tempmatrix2[i][j];
}
}
tempPtr1=initcompressedmatrix(2,3,4,tempmatrix1);
printf("初始化后\r\n");
printcompressedmatrix(tempPtr1);
tempPtr2=transposecompressedmatrix(tempPtr1);
printf("矩阵转制后\r\n");
printcompressedmatrix(tempPtr2);
}
int main()
{
compressedmatrixTest();
return 0;
}