c++解算3*3矩陣的逆矩陣
阿新 • • 發佈:2020-12-19
技術標籤: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矩陣計算結果對比,結果一致。
以上程式碼在記憶體銷燬方面未考慮,存在不足。