数据结构9:二维数组和矩阵相乘

二维数组

        二维数组可以分为静态数组和动态数组,其中静态数组是提前分配好空间,而动态数组则是需要时再分配空间,在实际应用中大多利用动态数组,灵活度高,但在个别情况,静态数组会更加方便。

静态数组

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值