我们首先来看下矩阵的数据结构:
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号