c++使用vector求矩阵的A的逆
#include <vector>
#include <iostream>
using namespace std;
vector<vector<double>> make_zero_martix(int m, int n) {
vector<vector<double>> array;
vector<double> temparay;
for (int i = 0; i < m; ++i)
{
for (int j = 0; j < n; ++j)
temparay.push_back(i * j);
array.push_back(temparay);
temparay.erase(temparay.begin(), temparay.end());
}
return array;
}
double getA(vector<vector<double>> arcs, int n)
{
if (n == 1)
{
return arcs[0][0];
}
double ans = 0;
vector<vector<double>> temp = make_zero_martix(arcs.size(), arcs.size());
int i, j, k;
for (i = 0; i < n; i++)
{
for (j = 0; j < n - 1; j++)
{
for (k = 0; k < n - 1; k++)
{
temp[j][k] = arcs[j + 1][(k >= i) ? k + 1 : k];
}
}
double t = getA(temp, n - 1);
if (i % 2 == 0)
{
ans += arcs[0][i] * t;
}
else
{
ans -= arcs[0][i] * t;
}
}
return ans;
}
void getAStart(vector<vector<double>> arcs, int n, vector<vector<double>>& ans)
{
if (n == 1)
{
ans[0][0] = 1;
return;
}
int i, j, k, t;
vector<vector<double>> temp = make_zero_martix(n, n);
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
for (k = 0; k < n - 1; k++)
{
for (t = 0; t < n - 1; t++)
{
temp[k][t] = arcs[k >= i ? k + 1 : k][t >= j ? t + 1 : t];
}
}
ans[j][i] = getA(temp, n - 1);
if ((i + j) % 2 == 1)
{
ans[j][i] = -ans[j][i];
}
}
}
}
bool GetMatrixInverse(vector<vector<double>> src, int n, vector<vector<double>>& des)
{
double flag = getA(src, n);
vector<vector<double>> t = make_zero_martix(n, n);
if (0 == flag)
{
cout << "原矩阵行列式为0,无法求逆。请重新运行" << endl;
return false;
}
else
{
getAStart(src, n, t);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
des[i][j] = t[i][j] / flag;
}
}
}
return true;
}
vector<vector<double>> inverse(vector<vector<double>> matrix_before) {
bool flag;
vector<vector<double>> matrix_after = make_zero_martix(matrix_before.size(), matrix_before.size());
flag = GetMatrixInverse(matrix_before, matrix_before.size(), matrix_after);
return matrix_after;
}
int main() {
vector<vector<double>> nums1 = {
{1, 2, 3},
{4, 15, 6},
{7, 8, 8}
};
vector<vector<double>> w = inverse(nums1);
for (int i = 0; i < w.size(); i++)
{
for (int j = 0; j < w[0].size(); j++)
{
cout << w[i][j] << " ";
}
cout << endl;
}
}