栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构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("第一个矩阵: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;
}
 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/916878.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号