C语言版本矩阵代码---(1)

感慨

本文从零开始,采用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) 来表示,增强了可读性

发布了16 篇原创文章 · 获赞 1 · 访问量 3591

猜你喜欢

转载自blog.csdn.net/a215095167/article/details/104895290