C++计算逆矩阵
1這篇文章包含了逆運算在內的常見矩陣計算:
https://blog.csdn.net/sinat_36219858/article/details/78164606
2
/*************************************************************************> File Name: inv.cpp> Author: ims> Created Time: 2018/8/1 22:06:12************************************************************************/ #include <stdio.h> #include <iostream> using namespace std; double det(int n, double *aa) {if (n == 1)return aa[0];double *bb = new double[(n - 1)*(n - 1)];//創建n-1階的代數余子式陣bb int mov = 0;//判斷行是否移動 double sum = 0.0;//sum為行列式的值 for (int arow = 0; arow<n; arow++) // a的行數把矩陣a(nn)賦值到b(n-1) {for (int brow = 0; brow<n - 1; brow++)//把aa陣第一列各元素的代數余子式存到bb { mov = arow > brow ? 0 : 1; //bb中小于arow的行,同行賦值,等于的錯過,大于的加一 for (int j = 0; j<n - 1; j++) //從aa的第二列賦值到第n列 {bb[brow*(n - 1) + j] = aa[(brow + mov)*n + j + 1];}}int flag = (arow % 2 == 0 ? 1: -1);//因為列數為0,所以行數是偶數時候,代數余子式為1. sum += flag* aa[arow*n] * det(n - 1, bb);//aa第一列各元素與其代數余子式積的和即為行列式}delete[]bb;return sum; }void inverse(int n, double *aa) {double det_aa = det(n, aa);cout << "輸入矩陣的行列式:" << det_aa << endl;if (det_aa == 0){printf("行列式為0 ,不能計算逆矩陣。\n");return;}double *adjoint = new double[n*n];double *bb = new double[(n - 1)*(n - 1)];//創建n-1階的代數余子式陣bb int pi, pj, q;for (int ai = 0; ai<n; ai++) // a的行數把矩陣a(nn)賦值到b(n-1) {for (int aj = 0; aj<n; aj++){for (int bi = 0; bi<n - 1; bi++)//把元素aa[ai][0]代數余子式存到bb[][] {for (int bj = 0; bj<n - 1; bj++)//把元素aa[ai][0]代數余子式存到bb[][] {if (ai>bi) //ai行的代數余子式是:小于ai的行,aa與bb陣,同行賦值 pi = 0;elsepi = 1; //大于等于ai的行,取aa陣的ai+1行賦值給陣bb的bi行 if (aj>bj) //ai行的代數余子式是:小于ai的行,aa與bb陣,同行賦值 pj = 0;elsepj = 1; //大于等于ai的行,取aa陣的ai+1行賦值給陣bb的bi行 bb[bi*(n - 1) + bj] = aa[(bi + pi)*n + bj + pj];}}printf("aa[%d][%d]的余子式\n", ai, aj);for (int i = 0; i < n - 1; i++){for (int j = 0; j < n - 1; j++){printf("%lf ", bb[i*(n - 1) + j]);}printf(" \n");}if ((ai + aj) % 2 == 0) q = 1;//因為列數為0,所以行數是偶數時候,代數余子式為-1. else q = (-1);adjoint[ai*n + aj] = q*det(n - 1, bb);}}for(int i = 0; i < n; i++)//adjoint 轉置{for(int j = 0; j < i; j++){double tem = adjoint[i*n + j];adjoint[i*n + j] = adjoint[j*n + i];adjoint[j*n + i] = tem;}}printf("伴隨陣: \n");for (int i = 0; i < n; i++) //打印伴隨陣 {for (int j = 0; j < n; j++){cout << adjoint[i*n + j] << "\t";}cout << endl;}printf("逆矩陣: \n");for (int i = 0; i < n; i++) //打印逆矩陣 {for (int j = 0; j < n; j++){aa[i*n + j] = adjoint[i*n + j] / det_aa;cout << aa[i*n + j] << "\t";}cout << endl;}delete[]adjoint;delete[]bb; } int main() {int n = 0; //階數 printf("輸入階數:");scanf("%d", &n); /*讀入階數*/double *aa = new double[n*n];printf("輸入矩陣:\n");for (int i = 0; i < n*n; i++)cin >> aa[i];inverse(n, aa);delete[]aa; }?
總結
- 上一篇: 2021美赛Latex排版美化 完整代码
- 下一篇: PR2019打开报错:由于找不到MSVC