算法学习笔记1.1.3 矩阵的逆
任务
给一个矩阵,求它的逆。
说明
将原矩阵A和一个单位矩阵R做成大矩阵(A,E),用初等行变换将大矩阵中的A变为E,则得到(E,A^-1)的形式。
接口
void inverse(vector<double> A[], vector<double> C[], int N)
复杂度:O(n^3)
输入:
- A 原矩阵
- C 逆矩阵
- N 矩阵的逆
代码
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
inline vector<double> operator * (vector<double> a, double b) {
int N = a.size();
vector<double> res(N, 0);
for (int i = 0; i < N; i ++)
res[i] = a[i] * b;
return res;
}
inline vector<double> operator - (vector<double> a, vector<double> b) {
int N = a.size();
vector<double> res(N, 0);
for (int i = 0; i < N; i ++)
res[i] = a[i] - b[i];
return res;
}
inline void inverse(vector<double> A[], vector<double> C[], int N) {
for (int i = 0; i < N; i ++)
C[i] = vector<double>(N, 0);
for (int i = 0; i < N; i ++)
C[i][i] = 1;
for (int i = 0; i < N; i ++) {
for (int j = 0; j < N; j ++)
if (fabs(A[j][i]) > 0) {
swap(A[i], A[j]);
swap(C[i], C[j]);
break;
}
C[i] = C[i] * (1 / A[i][i]);
A[i] = A[i] * (1 / A[i][i]);
for (int j = 0; j < N; j ++)
if (j != i && fabs(A[j][i]) > 0) {
C[j] = C[j] - C[i] * A[j][i];
A[j] = A[j] - A[i] * A[j][i];
}
}
}
// main for test
int main() {
vector<double> A[3];
vector<double> C[3];
for (int i = 0; i < 3; i ++) {
A[i] = vector<double>(3, 0);
A[i][i] = 3;
C[i] = vector<double>(3, 0);
C[i][i] = 1;
}
inverse(A, C, 3);
cout << "result:" << endl;
for (int i = 0; i < 3; i ++) {
for (int j = 0; j < 3; j ++) {
cout << "\t" << C[i][j];
}
cout << endl;
}
return 0;
}
/*
output:
result:
0.333333 0 0
0 0.333333 0
0 0 0.333333
*/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步