感慨
本文从零开始,采用C语言,一步步进行矩阵运算代码是实现。
引用头文件
// NULL printf
#include <stdio.h>
① 构建一个n行m列的矩阵
简易版示例
double *mat(int n, int m)
{
double *p = (double *)malloc(sizeof(double)*n*m);
return p;
}
该写法存在几个问题:参数缺乏检验;malloc可能由于内存问题,导致分配失败。
规范版示例
double *mat(int n, int m)
{
double *p = NULL;
if (n <= 0 || m <= 0) {
return NULL;
}
if (!(p = (double *)malloc(sizeof(double)*n*m))) {
printf("matrix memory allocation error: n=%d,m=%d\n", n, m);
return NULL;
}
return p;
}
②打印矩阵
为了实现矩阵运算代码,一个打印矩阵的函数是有必要的。
实现
void matprint(const double *A, int n, int m)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++)
printf("%lf ",A[i + j*n]);
printf("\r\n");
}
}
测试
int main() {
double *A = mat(2, 3);
for (int i = 0; i < 6; i++) {
A[i] = i;
}
matprint(A, 2, 3);
getchar();
}
优化改进
矩阵实为二维,但采用一维数组表示,定义上按列进行数据排列,从上述测试结果可以看出。
实际上,如何排列并不是关键问题,我们引入一个定义来增加代码可读性,并将打印函数改造如下
#define MAT_INDEX(n,m,i,j) (i + j*n)
void matprint(const double *A, int n, int m)
{
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
printf("%lf ", A[MAT_INDEX(n, m, i, j)]);
}
printf("\r\n");
}
}
这样,一个n行m列的矩阵,其第i行第j列的一维数组下标,即可用 MAT_INDEX(n,m,i,j) 来表示,增强了可读性