1. 程式人生 > 其它 >c++解算3*3矩陣的逆矩陣

c++解算3*3矩陣的逆矩陣

技術標籤:c++

用伴隨矩陣計算3行3列矩陣的逆矩陣(要求矩陣行列式不能為0)
原理參考:https://blog.csdn.net/feixia_24/article/details/41644335
矩陣子函式部分

double** MatrixInversion3_3(double A[3][3])
{
	double **Result = (double**)malloc(sizeof(double*) * 3);
	Result[0] = (double*)malloc(sizeof(double*) * 3);
	Result[1] = (double*)malloc(sizeof(double*) * 3);
	Result[2] = (double*)malloc(sizeof(double*) * 3);
	double a1 = *A[0]; double b1 = *(A[0]+1); double c1 = *(A[0]+2);
	double a2 = *A[1]; double b2 = *(A[1] + 1); double c2 = *(A[1] + 2);
	double a3 = *A[2]; double b3 = *(A[2] + 1); double c3 = *(A[2] + 2);
	double k = 1 / (a1*(b2*c3 - c2 * b3) - a2 * (b1*c3 - c1 * b3) + a3 * (b1*c2 - b2 * c1));
	*Result[0] = k * (b2*c3 - c2 * b3);
	*(Result[0]+1) = k * (c1*b3 - b1 * c3);
	*(Result[0] + 2) = k * (b1*c2 - c1 * b2);

	*Result[1] = k * (c2*a3 - a2 * c3);
	*(Result[1]+1) = k * (a1*c3 - c1 * a3);
	*(Result[1]+2) = k * (a2*c1 - a1 * c2);

	*Result[2] = k * (a2*b3 - b2 * a3);
	*(Result[2]+1) = k * (b1*a3 - a1 * b3);
	*(Result[2]+2) = k * (a1*b2 - a2 * b1);
	return Result;
}

主函式部分

#include <iostream>
using namespace std;
double** MatrixInversion3_3(double A[3][3])
{
	double **Result = (double**)malloc(sizeof(double*) * 3);
	Result[0] = (double*)malloc(sizeof(double*) * 3);
	Result[1] = (double*)malloc(sizeof(double*) * 3);
	Result[2] = (double*)malloc(sizeof(double*) * 3);
	double a1 = *A[0]; double b1 = *(A[0]+1); double c1 = *(A[0]+2);
	double a2 = *A[1]; double b2 = *(A[1] + 1); double c2 = *(A[1] + 2);
	double a3 = *A[2]; double b3 = *(A[2] + 1); double c3 = *(A[2] + 2);
	double k = 1 / (a1*(b2*c3 - c2 * b3) - a2 * (b1*c3 - c1 * b3) + a3 * (b1*c2 - b2 * c1));
	*Result[0] = k * (b2*c3 - c2 * b3);
	*(Result[0]+1) = k * (c1*b3 - b1 * c3);
	*(Result[0] + 2) = k * (b1*c2 - c1 * b2);

	*Result[1] = k * (c2*a3 - a2 * c3);
	*(Result[1]+1) = k * (a1*c3 - c1 * a3);
	*(Result[1]+2) = k * (a2*c1 - a1 * c2);

	*Result[2] = k * (a2*b3 - b2 * a3);
	*(Result[2]+1) = k * (b1*a3 - a1 * b3);
	*(Result[2]+2) = k * (a1*b2 - a2 * b1);
	return Result;
}

int main()
{
	//以下為測試三階矩陣求逆結果
	double A[3][3] = {
		{1,2,3},
		{2,5,4},
		{3,7,9}
	};
	double **B;
	B =MatrixInversion3_3(A);
	cout << *B[0] << " " << *(B[0]+1) << " " << *(B[0]+2) << endl;
	cout << *B[1] << " " << *(B[1] + 1) << " " << *(B[1] + 2) << endl;
	cout << *B[2] << " " << *(B[2] + 1) << " " << *(B[2] + 2) << endl;
	system("pause");
	return (0);
}

執行結果在這裡插入圖片描述

將結果與MATLAB矩陣計算結果對比,結果一致。
以上程式碼在記憶體銷燬方面未考慮,存在不足。