二维数组可以分为静态数组和动态数组,其中静态数组是提前分配好空间,而动态数组则是需要时再分配空间,在实际应用中大多利用动态数组,灵活度高,但在个别情况,静态数组会更加方便。
静态数组 1.定义typedef struct TwoDStaticArrray
{
int rows;
int columns;
int elements[ROWS][COLUMNS];
} TwoDStaticArray, *TwoDStaticArrayPtr;
2.初始化
TwoDStaticArrayPtr initTwoDStaticArray()
{
int i, j;
TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(TwoDStaticArray));
resultPtr->rows = ROWS;
resultPtr->columns = COLUMNS;
for(i = 0; i < ROWS; i ++)
{
for(j = 0; j < COLUMNS; j ++)
{
resultPtr->elements[i][j] = i * 10 + j;
//打印地址
printf("(%d, %d): %d; ", i, j, &(resultPtr->elements[i][j]));
}
}
return resultPtr;
}
3.实现结果
静态矩阵: (0, 0): 10950072; (0, 1): 10950076; (0, 2): 10950080; (0, 3): 10950084; (0, 4): 10950088; (1, 0): 10950092; (1, 1): 10950096; (1, 2): 10950100; (1, 3): 10950104; (1, 4): 10950108; (2, 0): 10950112; (2, 1): 10950116; (2, 2): 10950120; (2, 3): 10950124; (2, 4): 10950128; (3, 0): 10950132; (3, 1): 10950136; (3, 2): 10950140; (3, 3): 10950144; (3, 4): 10950148;动态数组 1.定义
typedef struct TwoDArray
{
int rows;
int columns;
int** elements;
} TwoDArry, *TwoDArrayPtr;
2.初始化
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 < paraRows;i++)
{
resultPtr->elements[i] = (int*)malloc(paraColumns * sizeof(int));
}
return resultPtr;
}
3.打印
void printTwoDArray(TwoDArrayPtr paraPtr)
{
int i,j;
for(i = 0;i < paraPtr->rows;i++)
{
for(j = 0;j < paraPtr->columns;j++)
{
if(j == paraPtr->columns-1)
printf("%d ",paraPtr->elements[i][j]);
else
printf("%d, ",paraPtr->elements[i][j]);
}
printf("n");
}
}
4.随机数赋值
void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound)
{
int i,j;
for(i = 0;i < paraPtr->rows;i++)
{
for(j = 0;j < paraPtr->columns;j++)
{
paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;
}
}
}
矩阵相乘
1.原理及流程
A为m×p矩阵,B为p×n矩阵,C为A,B两矩阵相乘,这里以m=2,p=3,n=2为例,则计算过程为:
2.代码TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2)
{
int i,j,k,sum;
if(paraPtr1->columns != paraPtr2->rows)
{
printf("矩阵不能相乘.n");
return NULL;
}
TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->rows,paraPtr2->columns);
for(i = 0;i < paraPtr1->rows;i++)
{
for(j = 0;j < paraPtr2->columns;j++)
{
sum = 0;
for(k = 0;k < paraPtr1->columns;k++)
{
sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j];
}
resultPtr->elements[i][j] = sum;
if(j == paraPtr2->columns-1)
printf("sum = %d",sum);
else
printf("sum = %d, ",sum);
}
printf("n");
}
return resultPtr;
}
3.测试和结果
void twoDArrayTest()
{
TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
tempPtr1 = initTwoDArray(3, 2);
randomizeTwoDArray(tempPtr1, 1, 6);
printf("第一个矩阵:rn");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(2, 4);
randomizeTwoDArray(tempPtr2, 4, 10);
printf("第二个矩阵:rn");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printf("计算结果:rn");
printTwoDArray(tempPtr3);
}
第一个矩阵: 2, 3 5, 1 5, 5 第二个矩阵: 4, 4, 8, 6 9, 9, 5, 7 sum = 35, sum = 35, sum = 31, sum = 33 sum = 29, sum = 29, sum = 45, sum = 37 sum = 65, sum = 65, sum = 65, sum = 65 计算结果: 35, 35, 31, 33 29, 29, 45, 37 65, 65, 65, 65总代码
#include#include #include #define ROWS 4 #define COLUMNS 5 //动态数组 typedef struct TwoDArray { int rows; int columns; int** elements; } TwoDArry, *TwoDArrayPtr; //静态数组 typedef struct TwoDStaticArrray { int rows; int columns; int elements[ROWS][COLUMNS]; } TwoDStaticArray, *TwoDStaticArrayPtr; //静态数组初始化 TwoDStaticArrayPtr initTwoDStaticArray() { int i, j; TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(TwoDStaticArray)); resultPtr->rows = ROWS; resultPtr->columns = COLUMNS; for(i = 0; i < ROWS; i ++) { for(j = 0; j < COLUMNS; j ++) { resultPtr->elements[i][j] = i * 10 + j; //打印地址 printf("(%d, %d): %d; ", i, j, &(resultPtr->elements[i][j])); } } return resultPtr; } //动态数组 //初始化 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 < paraRows;i++) { resultPtr->elements[i] = (int*)malloc(paraColumns * sizeof(int)); } return resultPtr; } //随机数赋值 void randomizeTwoDArray(TwoDArrayPtr paraPtr,int paraLowerBound,int paraUpperBound) { int i,j; for(i = 0;i < paraPtr->rows;i++) { for(j = 0;j < paraPtr->columns;j++) { paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound; } } } //打印 void printTwoDArray(TwoDArrayPtr paraPtr) { int i,j; for(i = 0;i < paraPtr->rows;i++) { for(j = 0;j < paraPtr->columns;j++) { if(j == paraPtr->columns-1) printf("%d ",paraPtr->elements[i][j]); else printf("%d, ",paraPtr->elements[i][j]); } printf("n"); } } //矩阵相乘 TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1,TwoDArrayPtr paraPtr2) { int i,j,k,sum; if(paraPtr1->columns != paraPtr2->rows) { printf("矩阵不能相乘.n"); return NULL; } TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->rows,paraPtr2->columns); for(i = 0;i < paraPtr1->rows;i++) { for(j = 0;j < paraPtr2->columns;j++) { sum = 0; for(k = 0;k < paraPtr1->columns;k++) { sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j]; } resultPtr->elements[i][j] = sum; if(j == paraPtr2->columns-1) printf("sum = %d",sum); else printf("sum = %d, ",sum); } printf("n"); } return resultPtr; } //测试 void twoDArrayTest() { TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3; tempPtr1 = initTwoDArray(3, 2); randomizeTwoDArray(tempPtr1, 1, 6); printf("第一个矩阵:rn"); printTwoDArray(tempPtr1); tempPtr2 = initTwoDArray(2, 4); randomizeTwoDArray(tempPtr2, 4, 10); printf("第二个矩阵:rn"); printTwoDArray(tempPtr2); tempPtr3 = matrixMultiply(tempPtr1, tempPtr2); printf("计算结果:rn"); printTwoDArray(tempPtr3); } int main() { twoDArrayTest(); printf("静态矩阵:n"); TwoDStaticArrayPtr tempPtr = initTwoDStaticArray(); return 1; }



