天天看点

求逆矩阵C++求逆矩阵C++

求逆矩阵C++

运用二维数组对线性代数中的矩阵求逆

  • 算法: Guss_Jordan法
  • vs17
  • 矩阵为满秩矩阵
  • 主函数中修改矩阵,行数,列数
void Guss_Jordan(double a[], int n)       
{
	int *H, *L, i, j, k, m, u, v;
	double d, q;
	double p;
	H = new int[n];
	L = new int[n];
	for (k = 0; k <= n - 1; k++)
	{
		d = 0.0;
		for (i = k; i <= n - 1; i++)      
			for (j = k; j <= n - 1; j++)
			{
				m = i * n + j;
				q = jdz(a[m]); 
				if (q > d) { d = q; H[k] = i; L[k] = j; }
			}
		if (H[k] != k)
			for (j = 0; j <= n - 1; j++)   
			{
				u = k * n + j; v = H[k] * n + j;
				p = a[u]; a[u] = a[v]; a[v] = p;
			}
		if (L[k] != k)
			for (i = 0; i <= n - 1; i++)     
			{
				u = i * n + k; v = i * n + L[k];
				p = a[u]; a[u] = a[v]; a[v] = p;
			}
		m = k * n + k;
		a[m] = f(a[m]);          
		for (j = 0; j <= n - 1; j++)      
			if (j != k)
			{
				u = k * n + j; a[u] = a[u] * a[m];
			}
		for (i = 0; i <= n - 1; i++)     
			if (i != k)
				for (j = 0; j <= n - 1; j++)
					if (j != k)
					{
						u = i * n + j;
						a[u] = a[u] - a[i*n + k] * a[k*n + j];
					}
		for (i = 0; i <= n - 1; i++)
			if (i != k)
			{
				u = i * n + k; a[u] = (a[u] - a[u] - a[u])*a[m];
			}
	}
	for (k = n - 1; k >= 0; k--)      
	{
		if (L[k] != k)
			for (j = 0; j <= n - 1; j++)
			{
				u = k * n + j; v = L[k] * n + j;
				p = a[u]; a[u] = a[v]; a[v] = p;
			}
		if (H[k] != k)
			for (i = 0; i <= n - 1; i++)
			{
				u = i * n + k; v = i * n + H[k];
				p = a[u]; a[u] = a[v]; a[v] = p;
			}
	}
	delete[] H; delete[] L;
}
           

主函数中对Guss_Jordan函数的调用:

#define N n(行数,列数)

for (i=0; i<N; i++)
	  for (j=0; j<N; j++) 
		  b[i][j]=a[i][j];
	  Guss_Jordan(&b[0][0],N);    //调用Guss_Jordan函数
	  {
		  cout <<"逆矩阵:" <<endl;;
		  for (i=0; i<N; i++)
		  {
			  for (j = 0; j <N; j++)
			  {
				  cout << b[i][j] << "    ";  
			  }
		      cout << endl;
		  }
	  }
           

     上述代码在vs17环境下编译运行通过。

     我的GitHub链接https://github.com/TYduoduo

继续阅读