数据结构之矩阵
一、矩阵乘的计算矩阵其实就是一个二维的表格,那么数据结构中的矩阵其实也是一样的,计算机中可以用矩阵这种形式来存储数据。总代码:#include<stdio.h>#include<stdlib.h>#define TOTAL_SPACE 5typedef struct CircleIntQueue{int data[TOTAL_SPACE];int head;int tail
一、矩阵乘的计算
矩阵其实就是一个二维的表格,那么数据结构中的矩阵其实也是一样的,计算机中可以用矩阵这种形式来存储数据。
总代码:
#include<stdio.h>
#include<stdlib.h>
#define TOTAL_SPACE 5
typedef struct CircleIntQueue
{
int data[TOTAL_SPACE];
int head;
int tail;
}*CircleIntQueuePtr;
CircleIntQueuePtr initQueue()
{
CircleIntQueuePtr resultPtr=(CircleIntQueuePtr)malloc(sizeof(struct CircleIntQueue));
resultPtr->head=0;
resultPtr->tail=0;
return resultPtr;
}
void enqueue(CircleIntQueuePtr paraPtr,int paraValue)
{
if((paraPtr->tail+1)%TOTAL_SPACE==paraPtr->head)
{
printf("Queue full.\r\n");
return ;
}
paraPtr->data[paraPtr->tail%TOTAL_SPACE]=paraValue;
paraPtr->tail++;
}
int dequeue(CircleIntQueuePtr paraPtr)
{
int resultValue;
if(paraPtr->head==paraPtr->tail)
{
printf("No element in the queue.\r\n");
return -1;
}
resultValue=paraPtr->data[paraPtr->head%TOTAL_SPACE];
paraPtr->head++;
return resultValue;
}
int queuelength(CircleIntQueuePtr paraPtr)
{
int length=0;
for(int i=paraPtr->head;i<paraPtr->tail;i++)
{
length++;
}
return length;
}
/**
* Output the queue.
*/
void outputLinkQueue(CircleIntQueuePtr paraPtr)
{
int i;
if(paraPtr->head==paraPtr->tail)
{
printf("Empty queue.");
return ;
}
printf("Element in the queue:");
for(i=paraPtr->head;i<paraPtr->tail;i++)
{
printf("%d ",paraPtr->data[i%TOTAL_SPACE]);
}
printf("\r\n");
}
void testLinkQueue()
{
printf("---Begin!---\r\n");
int i=10;
CircleIntQueuePtr tempPtr =initQueue();
for(i;i<16;i++)
{
enqueue(tempPtr,i);
}
outputLinkQueue(tempPtr);
printf("Length of the queue is %d\r\n",queuelength(tempPtr));
for(i=0;i<6;i++)
{
printf("dequeue gets %d\r\n",dequeue(tempPtr));
}
enqueue(tempPtr,8);
outputLinkQueue(tempPtr);
printf("---End!---\r\n");
}
int main()
{
testLinkQueue();
return 0;
}
实现结果:
二、压缩矩阵的转置
什么是矩阵的压缩存储?其实就是为很多个值相同的元素只分配一个存储空间。对零元素不分配存储空间。
总代码:
#include<stdio.h>
#include<stdlib.h>
typedef int elem;
typedef struct Triple
{
int i;
int j;
elem e;
}Triple,*TriplePtr;
typedef struct CompressedMatrix
{
int row;//行数
int col;//列数
int num;//有效数据个数
Triple* element;//压缩矩阵
}CompressedMatrix,*CompressedMatrixPtr;
CompressedMatrixPtr initCompressedMatrix(int paraRow,int paraCol,int paraElement,int** paraData)
{
int i;
CompressedMatrixPtr resultPtr=(CompressedMatrixPtr)malloc(sizeof(struct CompressedMatrix));
resultPtr->row=paraRow;
resultPtr->col=paraCol;
resultPtr->num=paraElement;
resultPtr->element=(TriplePtr)malloc(paraElement*sizeof(struct Triple));
for(i=0;i<paraElement;i++)
{
resultPtr->element[i].i=paraData[i][0];
resultPtr->element[i].j=paraData[i][1];
resultPtr->element[i].e=paraData[i][2];
}
return resultPtr;
}
void printCompressedMatrix(CompressedMatrixPtr paraPtr)
{
for(int i=0;i<paraPtr->num;i++)
{
printf("(%d,%d):%d\r\n",paraPtr->element[i].i,paraPtr->element[i].j,paraPtr->element[i].e);
}
}
CompressedMatrixPtr transposeCompressedMatrix(CompressedMatrixPtr paraPtr)
{
int i,tempCol,tempPosition;
int* tempColCounts=(int*)malloc(paraPtr->col*sizeof(int));
int* tempOffSet=(int*)malloc(paraPtr->col*sizeof(int));
for(i=0;i<paraPtr->col;i++)
{
tempColCounts[i]=0;
}
CompressedMatrixPtr resultPtr=(CompressedMatrixPtr)malloc(sizeof(struct CompressedMatrix));
resultPtr->row=paraPtr->col;
resultPtr->col=paraPtr->row;
resultPtr->num=paraPtr->num;
resultPtr->element=(TriplePtr)malloc(paraPtr->num*sizeof(struct Triple));
for(i=0;i<paraPtr->num;i++)
{
tempColCounts[paraPtr->element[i].j] ++;
}
tempOffSet[0]=0;
for(i=1;i<paraPtr->col;i++)
{
tempOffSet[i]=tempOffSet[i-1]+tempColCounts[i-1];
printf("tempOffSet[%d]=%d\r\n",i,tempOffSet[i]);
}
for(i=0;i<paraPtr->num;i++)
{
tempCol=paraPtr->element[i].j;
tempPosition=tempOffSet[tempCol];
resultPtr->element[tempPosition].i=paraPtr->element[i].j;
resultPtr->element[tempPosition].j=paraPtr->element[i].i;
resultPtr->element[tempPosition].e=paraPtr->element[i].e;
tempOffSet[tempCol]++;
}
return resultPtr;
}
void compressedMatrixTest()
{
CompressedMatrixPtr tempPtr1,tempPtr2;
int i,j,tempElement;
tempElement=4;
int** tempMatrix1=(int**)malloc(tempElement*sizeof(int*));
for(i=0;i<tempElement;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<tempElement;i++)
{
for(j=0;j<3;j++)
{
tempMatrix1[i][j]=tempMatrix2[i][j];
}
}
tempPtr1=initCompressedMatrix(2,3,4,tempMatrix1);
printf("After initialization.\r\n");
printCompressedMatrix(tempPtr1);
tempPtr2=transposeCompressedMatrix(tempPtr1);
printf("After transpose.\r\n");
printCompressedMatrix(tempPtr2);
}
int main()
{
compressedMatrixTest();
return 0;
}
测试结果:

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)