数据结构我好爱:07数组--矩阵乘法

矩阵就是一个二维数组!

创建二维矩阵(row*col)的方式有三种:

1.直接Matrix[row][col]

2.先malloc 二级指针(int**)*row个,再每一个二级指针分配col个int即可

3.直接(mall*col);但是再表达方式上就有所变化:
比如:Matrix[i][j]应该表示为Matrix[i*col+j]

以上创建方式里,方式1、2空间分配方式是不连续的,而方式3是连续的;并且不管是多高维度的矩阵都可以用一维数组表示:m,n,k的A[x][y][z]就是A[x*n*k+y*k+z].

 我们要实现矩阵乘法:(以法2方式创建)

结构体:记录矩阵的基本数据,行与列,二级指针M表示矩阵元素;

typedef struct {
	int row;
	int col;
	int** M;
}matrix,*matrixPtr;

 初始化:先malloc 二级指针row个(int**),再每一个二级指针分配col个int即可,为每一个二级指针法分配col个空间;

matrixPtr Init(int row,int col) {
	matrixPtr Matrix = (matrixPtr)malloc(sizeof(matrix));
	Matrix->row = row;
	Matrix->col = col;
	Matrix->M = (int**)malloc(sizeof(int*) * row);
	for (int i = 0; i < row; i++) {
		Matrix->M[i] = (int*)malloc(sizeof(int) * col);
	}
	return Matrix;
}

为矩阵随机赋值:实现随机数,为了避免假随机:应该加上随机数种子:srand(time(0));

void Random_Assignment(matrixPtr Matrix) {
	srand(time(0));
	for (int i = 0; i < Matrix->row; i++) {
		for (int j = 0; j < Matrix->col; j++) {
			Matrix->M[i][j] =rand()%50;
		}
	}
}

输出矩阵元素:pass!!

void output(matrixPtr Matrix) {
	if (Matrix == NULL) {
		printf("不满足矩阵相乘!\n");
		return;
	}
	for (int i = 0; i < Matrix->row; i++) {
		for (int j = 0; j < Matrix->col; j++) {
			printf("%5d ", Matrix->M[i][j]);
		}
		putchar('\n');
	}
}

矩阵相乘主函数:

        计算逻辑:结果矩阵result_Matrix[i][j]是M1的第i行与M2的第j列,分别相乘再求和得到。

matrixPtr Matrix_multiplication(matrixPtr Matrix1, matrixPtr Matrix2) {
	if (Matrix1->col != Matrix2->row) {
		printf("不满足矩阵相乘!\n");
		return NULL;
	}
	int D = Matrix1->col;
	int sum;
	matrixPtr result_Matrix = Init(Matrix1->row, Matrix2->col);
	for (int i = 0; i < Matrix1->row; i++) {
		for (int j = 0; j < Matrix2->col; j++) {
			sum = 0;
			for (int k = 0; k < D; k++) {
				sum += Matrix1->M[i][k] * Matrix2->M[k][j];
			}
			result_Matrix->M[i][j] = sum;
		}
	}
	return result_Matrix;
}

运行截图:

 完整代码:

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct {
	int row;
	int col;
	int** M;
}matrix,*matrixPtr;

matrixPtr Init(int row,int col) {
	matrixPtr Matrix = (matrixPtr)malloc(sizeof(matrix));
	Matrix->row = row;
	Matrix->col = col;
	Matrix->M = (int**)malloc(sizeof(int*) * row);
	for (int i = 0; i < row; i++) {
		Matrix->M[i] = (int*)malloc(sizeof(int) * col);
	}
	return Matrix;
}

void Random_Assignment(matrixPtr Matrix) {
	srand(time(0));
	for (int i = 0; i < Matrix->row; i++) {
		for (int j = 0; j < Matrix->col; j++) {
			Matrix->M[i][j] =rand()%50;
		}
	}
}

void output(matrixPtr Matrix) {
	if (Matrix == NULL) {
		printf("不满足矩阵相乘!\n");
		return;
	}
	for (int i = 0; i < Matrix->row; i++) {
		for (int j = 0; j < Matrix->col; j++) {
			printf("%5d ", Matrix->M[i][j]);
		}
		putchar('\n');
	}
}

matrixPtr Matrix_multiplication(matrixPtr Matrix1, matrixPtr Matrix2) {
	if (Matrix1->col != Matrix2->row) {
		printf("不满足矩阵相乘!\n");
		return NULL;
	}
	int D = Matrix1->col;
	int sum;
	matrixPtr result_Matrix = Init(Matrix1->row, Matrix2->col);
	for (int i = 0; i < Matrix1->row; i++) {
		for (int j = 0; j < Matrix2->col; j++) {
			sum = 0;
			for (int k = 0; k < D; k++) {
				sum += Matrix1->M[i][k] * Matrix2->M[k][j];
			}
			result_Matrix->M[i][j] = sum;
		}
	}
	return result_Matrix;
}

void Test() {
	printf("矩阵1:\n");
	matrixPtr M1 = Init(4, 5);
	Random_Assignment(M1);
	output(M1);
	printf("矩阵2:\n");
	matrixPtr M2 = Init(5, 3);
	Random_Assignment(M2);
	output(M2);
	printf("矩阵1与矩阵2进行矩阵相乘后:\n");
	matrixPtr M3 = Matrix_multiplication(M1, M2);
	output(M3);
}

int main() {
	Test();
	return 0;
}

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值