矩阵基本运算

    返回首页    发表留言
本文作者:李德强
          第一章 矩阵的数据结构
 
 

        我们首先来看下矩阵的数据结构:

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号