C语言实现矩阵运算

由于需要DSP内进行矩阵运算,完善补充了网上现存的矩阵运算,形成了矩阵运算库。包括方阵/非方阵矩阵的加减乘除、数乘、转置、求逆、求余子式、求行列式等,比网上现存的全面一些。使用方法已在代码中标出。

void matrixisation(double(*s)[4], int m, int n);//数组矩阵化(m*n),只支持一行的数据
void MATRIX_add(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double b);//前两个相加,最后1为+,0为-
void MATRIX_multi(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double x, double y);//前两个乘
void MATRIX_trans(double(*s)[4], double(*t)[4], int m, int n);//第一个转置
void MATRIX_shucheng(double(*s)[4], double(*t)[4], int m, int n, double k);//K乘第一个矩阵s(m*n),得数为第二个矩阵t
void MATRIX_getCOS(int m, int n, double(*s)[4], double(*t)[4], int mn);//得到m*n的余子式t
double MATRIX_value(double(*s)[4], int MatrixSize);//行列式
void MATRIX_inverse(double(*s)[4], double(*t)[4], int MatrixSize);//逆矩阵
void c2dmatrixZOH(double dt, double(*A)[4],  double(*Ad)[4]);


void matrixisation(double(*s)[4], int m, int n) {//数组矩阵化,kl:考虑到当输入的线性数组s很长,占用到第二行时的情况。比如定义[4][4]但是有20+个数据输入
	int tempmatrix[4][4];
	int k = 0, l = 0;
	int i, j;

	for (i = 0; i < m; i++) {
		for (j = 0; j < n; j++) {
			tempmatrix[i][j] = s[k][l++];
			if (l == 4) { k++; l = 0; }
		}
	}
	for (i = 0; i < m; i++) 
		for (j = 0; j < n; j++) 
			s[i][j] = tempmatrix[i][j];

	for (i = n; i < 4; i++)//将不在矩阵中的数据清除
		for (j = 0; j < 4; j++)
			s[j][i] = 0;
	
}

void MATRIX_add(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double b)//相加
{
	int i, j;
	b = 1;

	for (i = 0; i < m; i++)
		for (j = 0; j < n; j++)
			p[i][j] = s[i][j] + t[i][j];

}

void MATRIX_multi(double(*s)[4], double(*t)[4], double(*p)[4], int m, int n, double x, double y) {
	int i, j, k;
	double sum;
	for (i = 0; i < m; i++)
	{
		for (j = 0; j < y; j++)
		{
			sum = 0;
			for (k = 0; k < n; k++)
				sum += s[i][k] * t[k][j];
			p[i][j] = sum;
		}
	}
}

void  MATRIX_trans(double(*s)[4], double(*t)[4], int m, int n)//转置
{
	int i, j;
	for (i = 0; i < m; i++)
		for (j = 0; j < n; j++) 
			t[j][i] = s[i][j];
}

void MATRIX_shucheng(double(*s)[4], double(*t)[4], int m, int n, double k)//数乘
{
	int i, j;
	for (i = 0; i < m; i++)
		for (j = 0; j < n; j++)	
			t[i][j] = k * s[i][j];
}

void MATRIX_getCOS(int m, int n, double(*s)[4], double(*t)[4], int mn) {//余子式
	m -= 1;
	n -= 1;//数学逻辑和电脑逻辑差1
	int i, j, k = 0, l = 0;

	for (i = 0; i < mn; i++) {
		for (j = 0; j < mn; j++) {
			if (i != m && j != n) t[k][l++] = s[i][j];
			if (l == mn - 1) { k++; l = 0; }
		}
	}
}

double MATRIX_value(double(*s)[4], int MatrixSize) {//行列式
	double matrix[4][4], tempmatrix[4][4];

	int i, j;
	//赋值给matrix  交给matrix去计算
	for (i = 0; i < MatrixSize; i++)
		for (j = 0; j < MatrixSize; j++) 
			matrix[i][j] = s[i][j];

	//一阶二阶 行列式求值
	if (MatrixSize == 2)
		return matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0];

	else if (MatrixSize == 1)
		return matrix[0][0];

	else//高阶行列式求值
	{
		double Matrixvalue = 0;//CurrentMatrix的值
		for (i = 0; i < MatrixSize; i++)
		{
			MATRIX_getCOS(1, i + 1, matrix, tempmatrix, MatrixSize);//得到第一行 第i列 的 当前余子式 tempmatrix 

			if (i % 2 == 1)//因为 是 行项为1 所以 列项i为奇数时  逆序数为偶数
				Matrixvalue -= matrix[0][i] * MATRIX_value(tempmatrix, MatrixSize - 1);
			else
				Matrixvalue += matrix[0][i] * MATRIX_value(tempmatrix, MatrixSize - 1);
		}
		return Matrixvalue;
	}
}

void MATRIX_inverse(double(*s)[4], double(*t)[4], int MatrixSize) {
	int i, j;
	double matrix[4][4], tempmatrix[4][4], tempmatrix2[4][4], tempmatrix3[4][4];
	for (i = 0; i < MatrixSize; i++)
		for (j = 0; j < MatrixSize; j++) matrix[i][j] = s[i][j];

	for (i = 0; i < MatrixSize; i++) {
		for (j = 0; j < MatrixSize; j++) {
			MATRIX_getCOS(i + 1, j + 1, matrix, tempmatrix, MatrixSize);//算余子式
			tempmatrix2[i][j] = MATRIX_value(tempmatrix, 2);//算余子式的行列式
		}
	}

	MATRIX_trans(tempmatrix2, tempmatrix3, MatrixSize, MatrixSize);//转置

	for (i = 0; i < MatrixSize; i++)
		for (j = 0; j < MatrixSize; j++)
			if ((i + j) % 2 == 1)
				tempmatrix3[i][j] = -tempmatrix3[i][j];//所需处化为相反数

	MATRIX_shucheng(tempmatrix3, t, MatrixSize, MatrixSize, 1 / MATRIX_value(s, MatrixSize));//除以原矩阵行列式

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值