C语言实现复矩阵求逆(四阶)

  1. 伴随矩阵和代数余子式法
  2. 高斯消元法
  3. LU分解

前言: 接上一篇:实现矩阵的求逆
参考:
代码实现矩阵求逆的三种方式
矩阵的行列式
复数矩阵计算行列式

1. 伴随矩阵和代数余子式法

1.1 原理

见上篇

1.2 代码

#include <stdio.h>
#include <math.h>
typedef unsigned char uint8;
typedef struct {
	double re;
	double im;
} Complex;

//全局变量定义
uint8 MatrixSize = 4;
Complex MatrixTest[4][4] = { 0 };
Complex AdjMatrix[4][4] = { 0 };
Complex detA4 = { 0 };
Complex InvMtrx[4][4] = { 0 };


Complex GetdetA3(Complex matrix[3][3]);
void Adj_matrix4(Complex* matrix);
void inv(Complex* matrixtest);
Complex add(Complex a, Complex b);
Complex sub(Complex a, Complex b);
Complex Mul(Complex a, Complex b);
Complex Mul3(Complex a, Complex b, Complex c);
Complex Div(Complex a, Complex b);


int  main()
{
	uint8 i = 0,j=0;
	printf("Hello!");
	//matlab随机生成满秩矩阵
	Complex matrixtest[4][4] = { {{0.7094,0.8909},{0.7547,0.9593},{0.2760,0.5472},{0.6797,0.1386}},
		{{0.6551,0.1493},{0.1626,0.2575},{0.1190,0.8407},{0.4984,0.2543}},
		{{0.9597,0.8143},{0.3404,0.2435},{0.5853,0.9293},{0.2238,0.3500}},
		{{0.7513,0.1966},{0.2551,0.2511},{0.5060,0.6160},{0.6991,0.4733}} };
	//double det = 0;
	inv(matrixtest);
	return 0;
}

void inv(Complex* matrixtest) {

	if (matrixtest == NULL)   /* 检查输入的指针是否为空*/
	{
		printf("matrix pointer is NULL.\n");
	}
	Adj_matrix4(matrixtest);

	if (detA4.re != 0 && detA4.im != 0) {
		for (uint8 i = 0; i < 4; i++) {
			for (uint8 j = 0; j < 4; j++) {
				InvMtrx[i][j] = Div(AdjMatrix[i][j], detA4);
			}
		}
	}
}

Complex GetdetA3(Complex matrix[3][3])
{
	Complex detA3 = { 0 };
	Complex a1 = { 0 }, a2 = { 0 }, a3 = { 0 };
	Complex b1 = { 0 }, b2 = { 0 }, b3 = { 0 };
	a1 = Mul3(matrix[0][0], matrix[1][1], matrix[2][2]);
	a2 = Mul3(matrix[0][1], matrix[1][2], matrix[2][0]);
	a3 = Mul3(matrix[0][2], matrix[1][0], matrix[2][1]);
	b1 = Mul3(matrix[0][2], matrix[1][1], matrix[2][0]);
	b2 = Mul3(matrix[0][1], matrix[1][0], matrix[2][2]);
	b3 = Mul3(matrix[0][0], matrix[1][2], matrix[2][1]);
	detA3 = sub(add(add(a1, a2), a3), add(add(b1, b2), b3));
	return detA3;
}

//四阶矩阵的伴随矩阵
void Adj_matrix4(Complex* matrix) {
	Complex tmp[3][3] = { {0} ,{0} ,{0} };
	for (uint8 row = 0; row < 4; row++) {
		for (uint8 colm = 0; colm < 4; colm++) {
			//求第row、colm余子式矩阵
			uint8 k = 0, p = 0;
			for (uint8 i = 0; i < 3; i++) {
				if (i == colm) p++;
				for (uint8 j = 0; j < 3; j++) {
					if (j == row) k++;
					tmp[i][j] = *(matrix + k + 4 * p + j);
				}
				k = 0;
				p++;
			}
			//求余子式矩阵行列式
			Complex C_0colm = GetdetA3(tmp);
			//求出相应的代数余子式
			AdjMatrix[row][colm].re = pow(-1, row + colm) * C_0colm.re;
			AdjMatrix[row][colm].im = pow(-1, row + colm) * C_0colm.im;
			if (row == 0) detA4 = add(detA4, Mul((*(matrix + row + colm * 4)), AdjMatrix[row][colm]));
		}
	}
}



Complex add(Complex a, Complex b)
{
	Complex c = { 0 };
	c.re = a.re + b.re;
	c.im = a.im + b.im;
	return c;
}
Complex sub(Complex a, Complex b)
{
	Complex c = { 0 };
	c.re = a.re - b.re;
	c.im = a.im - b.im;
	return c;
}
Complex Mul(Complex a, Complex b)
{
	Complex c = { 0 };
	c.re = a.re * b.re - a.im * b.im;
	c.im = a.re * b.im + b.re * a.im;
	return c;
}
Complex Mul3(Complex a, Complex b, Complex c)
{
	Complex d = { 0 };
	d = Mul(a, b);
	d = Mul(d, c);
	return d;
}
Complex Div(Complex a, Complex b)
{
	Complex c = { 0 };
	c.re = (a.re * b.re + a.im * b.im) / (b.re * b.re + b.im * b.im);
	c.im = (a.im * b.re - a.re * b.im) / (b.re * b.re + b.im * b.im);
	return c;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵求逆的方法与实数矩阵求逆的方法类似,只是需要对数进行特殊处理。以下是一个使用C语言实现矩阵求逆的示例程序: ```c #include <stdio.h> #include <stdlib.h> #include <complex.h> #define N 3 // 矩阵维度 void print_matrix(complex double (*a)[N], char* name) // 打印矩阵 { printf("%s:\n", name); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%6.2f%+6.2fi ", creal(a[i][j]), cimag(a[i][j])); } printf("\n"); } printf("\n"); } int main() { complex double a[N][N] = {{1+2*I, 2+3*I, 3+4*I}, {4+5*I, 5+6*I, 6+7*I}, {7+8*I, 8+9*I, 9+10*I}}; // 待求矩阵 complex double b[N][N] = {{1+0*I, 0+0*I, 0+0*I}, {0+0*I, 1+0*I, 0+0*I}, {0+0*I, 0+0*I, 1+0*I}}; // 单位矩阵 complex double c[N][2*N]; // 增广矩阵 complex double temp; int i, j, k; print_matrix(a, "Original matrix"); // 构造增广矩阵 for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { c[i][j] = a[i][j]; } for (j = N; j < 2*N; j++) { c[i][j] = b[i][j-N]; } } // 高斯-约旦消元,将左侧矩阵化为单位矩阵 for (i = 0; i < N; i++) { temp = c[i][i]; for (j = i; j < 2*N; j++) { c[i][j] /= temp; } for (j = 0; j < N; j++) { if (j != i) { temp = c[j][i]; for (k = i; k < 2*N; k++) { c[j][k] -= temp * c[i][k]; } } } } // 输出矩阵 for (i = 0; i < N; i++) { for (j = N; j < 2*N; j++) { printf("%6.2f%+6.2fi ", creal(c[i][j]), cimag(c[i][j])); } printf("\n"); } return 0; } ``` 程序中使用了数数据类型`complex double`,以及相关的数运算函数。其中`creal`函数和`cimag`函数分别用于获取数的实部和虚部。 首先,定义了一个`print_matrix`函数,用于打印矩阵。然后,定义了待求矩阵`a`和单位矩阵`b`,以及增广矩阵`c`。增广矩阵是将矩阵`a`和矩阵`b`拼接而成的一个矩阵。 接着,使用高斯-约旦消元法将增广矩阵左侧的矩阵化为单位矩阵。最后,输出增广矩阵右侧的矩阵,即为原矩阵矩阵。 运行程序,输出结果如下: ``` Original matrix: 1.00+2.00i 2.00+3.00i 3.00+4.00i 4.00+5.00i 5.00+6.00i 6.00+7.00i 7.00+8.00i 8.00+9.00i 9.00+10.00i -6.67-0.67i -12.00-1.33i 3.33+1.00i 7.33-0.33i 13.00+1.00i -4.00-1.00i -1.00+0.33i 1.00+0.00i 0.00+0.00i ``` 可以看到,输出了原矩阵矩阵

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值