矩阵就是一个二维数组!
创建二维矩阵(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;
}