二维数组
二维数组可以分为静态数组和动态数组,其中静态数组是提前分配好空间,而动态数组则是需要时再分配空间,在实际应用中大多利用动态数组,灵活度高,但在个别情况,静态数组会更加方便。
静态数组
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("第一个矩阵:\r\n");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(2, 4);
randomizeTwoDArray(tempPtr2, 4, 10);
printf("第二个矩阵:\r\n");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printf("计算结果:\r\n");
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 <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#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("第一个矩阵:\r\n");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(2, 4);
randomizeTwoDArray(tempPtr2, 4, 10);
printf("第二个矩阵:\r\n");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printf("计算结果:\r\n");
printTwoDArray(tempPtr3);
}
int main()
{
twoDArrayTest();
printf("静态矩阵:\n");
TwoDStaticArrayPtr tempPtr = initTwoDStaticArray();
return 1;
}