#include "iostream" #include <vector> using namespace std; int chufa = 0; int chengfa = 0; //A是对称阵,U是上三角阵,D储存对角阵对角线上元素 void Cholesky(vector<vector<double> > A, vector<vector<double> >&U , vector<double>&D) { int n = A.size(); for (int i = 0; i < n; ++i) { D[i] = A[i][i]; vector<double> a = A[i]; a[i] = 1; for (int j = i + 1; j < n; j++) { a[j] /= D[i]; chufa += 1; } U[i] = a; for (int j = 0; j < n; j++) { A[i][j] = 0; A[j][i] = 0; } for (int j = i + 1; j < n; j++) { for (int k = j; k < n; k++) { A[j][k] -= D[i] * a[j] * a[k]; A[k][j] = A[j][k]; chengfa += 2; } } } } //输入对角线为1的上三角阵,返回其逆阵 vector<vector<double> > invU(vector<vector<double> > U) { vector<vector<double> > V(U.size(), vector<double>(U.size(),0)); for (int col = U.size() - 1; col >= 0; col--) { V[col][col] = 1; for (int row = col-1; row >= 0; row--) for (int k = row + 1; k <= col; k++) { V[row][col] -= U[row][k] * V[k][col]; chengfa += 1; } } return V; } vector<vector<double> > transposition(vector<vector<double> > A) { vector<vector<double> > B(A[0].size(), vector<double>(A.size())); for (int i = 0; i < A.size(); i++) for (int j = 0; j < A[0].size(); j++) B[j][i] = A[i][j]; return B; //返回输入的转置 } vector<double> operator*(const vector<vector<double> > A, const vector<double> x) { vector<double> y(x.size()); for (int i = 0; i < A.size(); i++) { for (int j = 0; j < x.size(); j++) { y[i] += A[i][j] * x[j]; chengfa += 1; } } return y; //y是矩阵A和向量x的乘积 } int main() { vector<vector<double> > A = { {3.3, -0.6, 0.1, -0.5}, {-0.6, 3.2, -3.3, 0.3}, {0.1, -3.3, 10.1, -1.8}, {-0.5, 0.3, -1.8, 1.4} }; vector<double> x = { 1.3, 0.2, 0.8, 1.4 }; vector<vector<double> > U(A.size(), vector<double>(A.size())); vector<double> D(A.size()); Cholesky(A, U, D); vector<vector<double> >V = invU(U); vector<double> y = transposition(V) * x; for (int i = 0; i < y.size(); i++) { y[i] /= D[i]; chufa += 1; } y = V * y; return 0; }