一,压缩矩阵的转置

先上原理示意图

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值