1.代码如下
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define ROWS 4
#define COLUMNS 5
/**
* two dimensional array
*/
typedef struct TwoDArray* TwoDArrayPtr;
struct TwoDArray
{
int rows;
int columns;
int ** elements;
};
/**
* two dimensional array
*/
typedef struct TwoDStaticArray* TwoDStaticArrayPtr;
struct TwoDStaticArray
{
int rows;
int columns;
int elements[ROWS][COLUMNS];
};
/**
* initialize the two dimensional array
*/
TwoDArrayPtr initTwoDArray(int paraRows,int paraColumns)
{
int i;
TwoDArrayPtr resultPtr=(TwoDArrayPtr)malloc(sizeof(struct TwoDArray));
resultPtr->columns=paraColumns;
resultPtr->rows=paraRows;
resultPtr->elements=(int**)malloc(sizeof(int*)*paraRows);
for(i=0;i<paraRows;i++)
{
resultPtr->elements[i]=(int*)malloc(sizeof(int)*paraColumns);
}
return resultPtr;
}
/**
* initialize the two-dimensional array
*/
TwoDStaticArrayPtr initTwoDStaticArray()
{
int i,j;
TwoDStaticArrayPtr resultPtr=(TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));
resultPtr->columns=COLUMNS;
resultPtr->rows=ROWS;
for(i=0;i<ROWS;i++)
{
for(j=0;j<COLUMNS;j++)
{
resultPtr->elements[i][j]=i*10+j;
//print the address
printf("(%d, %d): %d ",i,j,&(resultPtr->elements[i][j]));
}
}
return resultPtr;
}
/**
* randomize the data of the array
*/
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;
}
}
}
/**
* print the two dimensional array
*/
void printTwoDArray(TwoDArrayPtr paraPtr)
{
int i,j;
for(i=0;i<paraPtr->rows;i++)
{
for(j=0;j<paraPtr->columns;j++)
{
printf("%d, ",paraPtr->elements[i][j]);
}
printf("\r\n");
}
}
/**
* matrix multiply
*/
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2)
{
int i,j,k,sum;
if(paraPtr1->columns!=paraPtr2->rows)
{
printf("Matrices cannot be multiplied.\r\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);
}
}
return resultPtr;
}
/**
* unit test
*/
void twoDArrayTest()
{
TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
tempPtr1 = initTwoDArray(3,2);
randomizeTwoDArray(tempPtr1, 1, 5);
printf("The firse 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);
printf("The result:\r\n");
printTwoDArray(tempPtr3);
}
int main()
{
twoDArrayTest();
TwoDStaticArrayPtr tempPtr=initTwoDStaticArray();
return 0;
}
2.图示
3.代码说明
1)代码提供了两种二维数组的初始化方法,由二维数组动态分配空间,进而可以想到多维空间的分配方法
2)矩阵乘法由三个for循环构成,由图示可以发现(x,y)和(y,z)中的y是不断递增的,故k在最里层,j代表第二个矩阵的列,i代表第一个矩阵的行
4.运行结果
The firse 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:
30, 30, 32, 40,
25, 25, 23, 30,
18, 18, 17, 22,
(0, 0): 10382888 (0, 1): 10382892 (0, 2): 10382896 (0, 3): 10382900 (0, 4): 10382904 (1, 0): 10382908 (1, 1): 10382912 (1, 2): 10382916 (1, 3): 10382920 (1, 4): 10382924 (2, 0): 10382928 (2, 1): 10382932 (2, 2): 10382936 (2, 3): 10382940 (2, 4): 10382944 (3, 0): 10382948 (3, 1): 10382952 (3, 2): 10382956 (3, 3): 10382960 (3, 4): 10382964
--------------------------------
Process exited after 0.07196 seconds with return value 0
请按任意键继续. . .