1、二维数组:二维数组本质上是以数组作为数组元素的数组,即“数组的数组”,类型说明符 数组名[常量表达式][常量表达式]。一维数组的每一空间里存储的又是另外一个一维数组的首地址,这样构成的一个类似于矩形的存储空间便是二维数组。
2、在这里用动态和静态两种空间分配方案来定义和初始化二维数组。
3、矩阵相乘图示:
4、代码:
#include <stdio.h>
#include <stdlib.h>
#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 < paraRows; i ++){
resultPtr->elements[i] = (int*)malloc(paraColumns * sizeof(int));
}
return resultPtr;
}
//初始化二维数组(静态)并打印地址
TwoDStaticArrayPtr initTwoDStaticArray(){
int i, j;
TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(struct 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 \n", i, j, &(resultPtr->elements[i][j]));
}
}
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("\r\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;
printf("sum = %d; ", sum);
}
}
printf("\nthe result is:\n");
return resultPtr;
}
//数组随机赋值和矩阵相乘的测试
void twoDArrayTest(){
TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
tempPtr1 = initTwoDArray(3, 2);
randomizeTwoDArray(tempPtr1, 1, 5);
printf("The first matrix:\r\n");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(2, 4);
randomizeTwoDArray(tempPtr2, 4, 9);
printf("The second matrix:\r\n");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printTwoDArray(tempPtr3);
tempPtr1 = initTwoDArray(4, 3);
randomizeTwoDArray(tempPtr1, -5, 5);
printf("The first matrix:\r\n");
printTwoDArray(tempPtr1);
tempPtr2 = initTwoDArray(3, 2);
randomizeTwoDArray(tempPtr2,0, 9);
printf("The second matrix:\r\n");
printTwoDArray(tempPtr2);
tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
printTwoDArray(tempPtr3);
}
//main函数
int main(){
twoDArrayTest();
TwoDStaticArrayPtr tempPtr = initTwoDStaticArray();
return 1;
}
5、运行结果:
The first matrix:
2 , 4
3 , 1
2 , 1
The second matrix:
7 , 7 , 6 , 8
4 , 4 , 5 , 6
sum = 30; sum = 30; sum = 32; sum = 40; sum = 25; sum = 25; sum = 23; sum = 30; sum = 18; sum = 18; sum = 17; sum = 22;
the result is:
30 , 30 , 32 , 40
25 , 25 , 23 , 30
18 , 18 , 17 , 22
The first matrix:
-4 , -4 , 0
-3 , 2 , 1
-4 , -1 , -3
-2 , -3 , -3
The second matrix:
6 , 5
8 , 5
2 , 0
sum = -56; sum = -40; sum = 0; sum = -5; sum = -38; sum = -25; sum = -42; sum = -25;
the result is:
-56 , -40
0 , -5
-38 , -25
-42 , -25
(0 , 0): 10557272
(0 , 1): 10557276
(0 , 2): 10557280
(0 , 3): 10557284
(0 , 4): 10557288
(1 , 0): 10557292
(1 , 1): 10557296
(1 , 2): 10557300
(1 , 3): 10557304
(1 , 4): 10557308
(2 , 0): 10557312
(2 , 1): 10557316
(2 , 2): 10557320
(2 , 3): 10557324
(2 , 4): 10557328
(3 , 0): 10557332
(3 , 1): 10557336
(3 , 2): 10557340
(3 , 3): 10557344
(3 , 4): 10557348