二维数组与矩阵乘法的完整代码
#include#include #include #define ROWS 4 #define COLUMNS 5 typedef struct TwoDArray{ int rows; int columns; int** elements; }TwoDArray,*TwoDArrayPtr; typedef struct TwoDStaticArray{ int rows; int columns; int elements[ROWS][COLUMNS]; }TwoDStaticArray,*TwoDStaticArrayPtr; TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns){ int i; TwoDArrayPtr resultPtr=(TwoDArrayPtr)malloc(sizeof(struct TwoDArray)); resultPtr->rows=paraRows; resultPtr->columns=paraColumns; resultPtr->elements=(int**)malloc(paraRows * sizeof(int*)); for(i=0;i elements[i]=(int*)malloc(paraColumns * sizeof(int)); }//of for i return resultPtr; }//of initTwoDArray void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound){ int i,j; for(i=0;i rows;i++){ for(j=0;j columns;j++){ paraPtr->elements[i][j]=rand()%(paraUpperBound-paraLowerBound)+paraLowerBound; }//of for j }//of for i }//of randomizeTwoDArray void printTwoDArray(TwoDArrayPtr paraPtr){ int i,j; for(i=0;i rows;i++){ for(j=0;j columns;j++){ printf("%d, ",paraPtr->elements[i][j]); }//of for j printf("rn"); }//of for i }//of printTwoDArray TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2){ int i,j,k,sum; if(paraPtr1->columns!=paraPtr2->rows){ printf("Matrices cannot be multiplied.rn"); return NULL; }//of if TwoDArrayPtr resultPtr=initTwoDArray(paraPtr1->rows,paraPtr2->columns); for(i=0;i rows;i++){ for(j=0;j columns;j++){ sum=0; for(k=0;k columns;k++){ sum+=paraPtr1->elements[i][k] * paraPtr2->elements[k][j]; }//of for k resultPtr->elements[i][j]=sum; printf("sum = %d, ",sum); }//of for j }//of for j return resultPtr; }//of matrixMultiply void TwoDArrayTest(){ TwoDArrayPtr tempPtr1,tempPtr2,tempPtr3; tempPtr1=initTwoDArray(3,2); randomizeTwoDArray(tempPtr1,1,5); printf("The first matrix:rn"); printTwoDArray(tempPtr1); tempPtr2=initTwoDArray(2,4); randomizeTwoDArray(tempPtr2,4,9); printf("The second matrix:rn"); printTwoDArray(tempPtr2); tempPtr3=matrixMultiply(tempPtr1,tempPtr2); printf("The result:rn"); printTwoDArray(tempPtr3); }//of TwoDArrayTest TwoDStaticArray initTwoDStaticArray(){ int i,j; TwoDStaticArrayPtr resultPtr=(TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray)); resultPtr->rows=ROWS; resultPtr->columns=COLUMNS; for(i=0;i elements[i][j]=i*10+j; //print their addresses. printf("(%d, %d): %d ",i,j,&(resultPtr->elements[i][j])); }//of for j }//of for i return resultPtr; }//of initTwoDStaticArray int main(){ TwoDArrayTest(); TwoDStaticArrayPtr tempPtr=initTwoDStaticArray(); return 1; }//of main
运行结果
转置矩阵的完整代码
#include#include typedef int elem; typedef struct Triple{ int i; int j; elem 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]; }//Of for i return resultPtr; }// Of initCompressedMatrix void printCompressedMatrix(CompressedMatrixPtr paraPtr){ int i; for(i = 0; i < paraPtr->numElements; i ++){ printf("(%d, %d): %drn", paraPtr->elements[i].i, paraPtr->elements[i].j, paraPtr->elements[i].e); }//Of for i }// Of printCompressedMatrix CompressedMatrixPtr transposeCompressedMatrix(CompressedMatrixPtr paraPtr){ //Step 1. Allocate space. 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; }//Of for i 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)); //Step 2. One scan to calculate offsets. for(i = 0; i < paraPtr->numElements; i ++) { tempColumnCounts[paraPtr->elements[i].j] ++; }//Of for i tempOffsets[0] = 0; for(i = 1; i < paraPtr->columns; i ++){ tempOffsets[i] = tempOffsets[i - 1] + tempColumnCounts[i - 1]; printf("tempOffsets[%d] = %d rn", i, tempOffsets[i]); }//Of for i //Step 3. Another scan to fill data. 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]++; }//Of for i return resultPtr; }//Of transposeCompressedMatrix void compressedMatrixTest(){ CompressedMatrixPtr tempPtr1, tempPtr2; int i, j, tempElements; //Construct the first sample matrix. tempElements = 4; int** tempMatrix1 = (int**)malloc(tempElements * sizeof(int*)); for(i = 0; i < tempElements; i ++){ tempMatrix1[i] = (int*)malloc(3 * sizeof(int)); }//Of for i int tempMatrix2[4][3] = {{0, 0, 2}, {0, 2, 3}, {2, 0, 5}, {2, 1, 6}}; for(i = 0; i < tempElements; i ++){ for(j = 0; j < 3; j ++) { tempMatrix1[i][j] = tempMatrix2[i][j]; }//Of for j }//Of for i tempPtr1 = initCompressedMatrix(2, 3, 4, tempMatrix1); printf("After initialization.rn"); printCompressedMatrix(tempPtr1); tempPtr2 = transposeCompressedMatrix(tempPtr1); printf("After transpose.rn"); printCompressedMatrix(tempPtr2); }// Of main int main(){ compressedMatrixTest(); return 1; }// Of main
图示
运行结果



