一、
1.结构体创立
typedef struct TwoDArray
{
int rows;
int columns;
int * * elements;
} TwoDArray, * TwoDArrayPtr;
typedef struct CompressedMatrix
{
int rows;
int columns;
int numElements;
Triple* elements;
} CompressedMatrix, * CompressedMatrixPtr;
2.初始化
CompressedMatrixPtr initCompressedMatrix ( int paraRows, int paraColumns, int paraElements, int * * paraData)
{
int i;
CompressedMatrixPtr resultPtr = new struct CompressedMatrix ;
resultPtr-> rows = paraRows;
resultPtr-> columns = paraColumns;
resultPtr-> numElements = paraElements;
resultPtr-> elements = new Triple[ paraElements] ;
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;
}
3.打印
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 <malloc.h>
typedef int elem;
typedef struct TwoDArray
{
int rows;
int columns;
int * * elements;
} TwoDArray, * TwoDArrayPtr;
typedef struct CompressedMatrix
{
int rows;
int columns;
int numElements;
Triple* elements;
} CompressedMatrix, * CompressedMatrixPtr;
CompressedMatrixPtr initCompressedMatrix ( int paraRows, int paraColumns, int paraElements, int * * paraData)
{
int i;
CompressedMatrixPtr resultPtr = new struct CompressedMatrix ;
resultPtr-> rows = paraRows;
resultPtr-> columns = paraColumns;
resultPtr-> numElements = paraElements;
resultPtr-> elements = new Triple[ paraElements] ;
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, tempElements;
tempElements = 4 ;
int * * tempMatrix1 = ( int * * ) malloc ( tempElements * sizeof ( int * ) ) ;
for ( i = 0 ; i < tempElements; 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 < tempElements; 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 ( ) ;
system ( "pause" ) ;
return 0 ;
}
6,运行结果