二维数组与矩阵乘法

这篇博客介绍了如何在C语言中使用动态和静态内存分配方案定义二维数组,并实现了矩阵相乘的功能。动态二维数组通过结构体封装,静态二维数组直接在栈上分配。代码中包含了初始化、随机赋值、打印数组和矩阵相乘的函数,并提供了测试案例。
摘要由CSDN通过智能技术生成

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小白123**

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值