我们首先来看下矩阵的数据结构:
typedef double num; typedef struct { int m; int n; num *v; } s_Matrix;
代码非常简单,可以清晰的看到,矩阵实际上就是一个M X N的数组,里面存放了所有我面要用到的数字。当然在C程序中数组在内存中也同样是线性存放的,所以我们在使用数组时,对数组的下标通常会使用这样的计算方式(其中i为行号,j为列号):
array[i * n + j]
接下来我们来看一下矩阵的初始化、销毁操作:
//初始化矩阵 int matrix_init(s_Matrix *matrix, int m, int n) { if (matrix == null) { return -1; } if (m <= 0 || n <= 0) { return -1; } //初始化矩阵大小 matrix->m = m; matrix->n = n; //申请存放矩阵数据的内存空间 matrix->v = malloc(sizeof(num) * matrix->m * matrix->n); if (matrix->v == null) { return -1; } //将矩阵中所有的元素置为0 matrix_zero(matrix); return 0; } //销毁矩阵 int matrix_destory(s_Matrix *matrix) { if (matrix == null) { return -1; } //释放矩阵元素占用的内存空间 if (matrix->v != null) { free(matrix->v); } //清除矩阵大小 matrix->m = 0; matrix->n = 0; return 0; } //置空矩阵 int matrix_zero(s_Matrix *matrix) { if (matrix == null) { return -1; } if (matrix->v == null) { return -1; } if (matrix->m <= 0 || matrix->n <= 0) { return -1; } //将所有元素的值置为0 for (int i = 0; i < matrix->m; i++) { for (int j = 0; j < matrix->n; j++) { matrix->v[i * matrix->n + j] = 0; } } return 0; }
最后来写一个显示矩阵内容的函数(此函数只是为了方便调试程序而写的,在实际的矩阵计算过程中可能用不到它):
//显示矩阵内容 int matrix_display(s_Matrix *matrix) { if (matrix == null) { return -1; } if (matrix->v == null) { return -1; } if (matrix->m <= 0 || matrix->n <= 0) { return -1; } //显示所有元素值 for (int i = 0; i < matrix->m; i++) { for (int j = 0; j < matrix->n; j++) { printf("%+e\t\t", matrix->v[i * matrix->n + j]); } printf("\n"); } printf("\n"); return 0; }
注意,在遍历矩阵中所有元素时,我们采用了刚才所说的计算数组下标的方式,在以后的矩阵操作中均采用这种方式计算数组的下标,不在赘述:
array[i * n + j]
本教程所使用的源代码完全开放、免费。你可以自由的使用和修改本教程中的所有源代码:
git@github.com:magicworldos/matrix.git https://github.com/magicworldos/matrix.git
Copyright © 2015-2023 问渠网 辽ICP备15013245号