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

二维数组的应用——矩阵乘法的优化算法

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

二维数组的应用——矩阵乘法的优化算法

写在前面————

本篇文章主要阐述的内容是基于二维数组所实现的矩阵的乘法。利用新的算法,我们可以做到不依靠单纯的循环来实现矩阵间行列的加减乘除。

1.矩阵乘法的数学原理

  【e.g.由于矩阵的乘法的数学原理在离散结构的学习中已有涉及,所以这里不再过多的赘述】

矩阵乘法中第一个矩阵的列要等于第二个矩阵的行 一个m∗n的的A矩阵,和一个n∗p的B矩阵相乘,将得到一个m∗p的矩阵C

基于这个原理,我们用计算机所能识别的语言进行了转化

代码实现如下:

#include 
#include 
#include 
#define Hen 4
#define Shu 5


typedef struct TwoDArray{
	int hen;
	int shu;
	int** elements;
} TwoDArray, *TwoDArrayPtr;


typedef struct TwoDStaticArray{
	int hen;
	int shu;
	int elements[Hen][Shu];
} TwoDStaticArray, *TwoDStaticArrayPtr;

//初始化矩阵 
TwoDArrayPtr initTwoDArray(int parahen, int parashu){
	int i;
	TwoDArrayPtr resultPtr = (TwoDArrayPtr)malloc(sizeof(struct TwoDArray));
	resultPtr->hen = parahen;
	resultPtr->shu = parashu;
	resultPtr->elements = (int**)malloc(parahen * sizeof(int*));
	for (i = 0; i < parahen; i ++){
		resultPtr->elements[i] = (int*)malloc(parashu * sizeof(int));
	}

	return resultPtr;
}

//随机化 
void randomizeTwoDArray(TwoDArrayPtr paraPtr, int paraLowerBound, int paraUpperBound){
	int i, j;	
	for (i = 0; i < paraPtr->hen; i ++){
		for (j = 0; j < paraPtr->shu; j ++) {
			paraPtr->elements[i][j] = rand() % (paraUpperBound - paraLowerBound) + paraLowerBound;
		}
	}
}

//打印函数 
void printTwoDArray(TwoDArrayPtr paraPtr){
	int i, j;	
	for (i = 0; i < paraPtr->hen; i ++){
		for (j = 0; j < paraPtr->shu; j ++) {
			printf("%d, ", paraPtr->elements[i][j]);
		}
		printf("rn");
	}
}

//矩阵的运算 
TwoDArrayPtr matrixMultiply(TwoDArrayPtr paraPtr1, TwoDArrayPtr paraPtr2){
	int i, j, k, sum;
	if (paraPtr1->shu != paraPtr2->hen){
		printf("Matrices cannot be multiplied.rn");
		return NULL;
	}

	TwoDArrayPtr resultPtr = initTwoDArray(paraPtr1->hen, paraPtr2->shu);

	for (i = 0; i < paraPtr1->hen; i ++){
		for (j = 0; j < paraPtr2->shu; j ++) {
			sum = 0;
			for (k = 0; k < paraPtr1->shu; k ++) {
				sum += paraPtr1->elements[i][k] * paraPtr2->elements[k][j];
			}
			resultPtr->elements[i][j] = sum;
			printf("sum = %d, ", sum);
		}
	}

	return resultPtr;
}

//单元测试 
void twoDArrayTest(){
	TwoDArrayPtr tempPtr1, tempPtr2, tempPtr3;
	tempPtr1 = initTwoDArray(3, 2);
	randomizeTwoDArray(tempPtr1, 1, 5);
	printf("The first matrix:rn");
	printTwoDArray(tempPtr1);

	tempPtr2 = initTwoDArray(2, 4);
	randomizeTwoDArray(tempPtr2, 4, 9);
	printf("The second matrix:rn");
	printTwoDArray(tempPtr2);

	tempPtr3 = matrixMultiply(tempPtr1, tempPtr2);
	printf("The result:rn");
	printTwoDArray(tempPtr3);
}//Of twoDArrayTest


//初始化 
TwoDStaticArrayPtr initTwoDStaticArray(){
	int i, j;
	TwoDStaticArrayPtr resultPtr = (TwoDStaticArrayPtr)malloc(sizeof(struct TwoDStaticArray));
	resultPtr->hen = Hen;
	resultPtr->shu = Shu;
	for (i = 0; i < Hen; i ++){
		for (j = 0; j < Shu; j ++) {
			resultPtr->elements[i][j] = i * 10 + j;
		
			printf("(%d, %d): %d; ", i, j, &(resultPtr->elements[i][j]));
		}
	}
	
	return resultPtr;
}

//调用主函数 
int main(){
	twoDArrayTest();
	TwoDStaticArrayPtr tempPtr = initTwoDStaticArray();
	return 0;
}

代码实现效果如下

 

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

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

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