从0开始学算法! -- 矩阵乘法

14天阅读挑战赛

矩阵就是一个二维数组!

创建二维矩阵(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值