21xrx.com
2025-04-17 12:16:31 Thursday
文章检索 我的文章 写文章
"C++矩阵求逆代码及结果"
2023-07-03 08:30:17 深夜i     20     0
C++ 矩阵 求逆 代码 结果

C++是一种常用的编程语言,用于开发各种类型的应用程序。矩阵求逆是计算机科学中的一个重要问题,主要用于计算机图形学、机器学习和数值分析等领域。在这个过程中,C++实现矩阵求逆是一个非常常见的任务。

实现矩阵求逆可以使用许多不同的算法。其中,最常见的算法是利用高斯-约旦消元法(Gauss-Jordan elimination),Doolittle分解和LU分解。这些算法可以很容易的使用C++来实现。下面,我们来看一个简单的例子——如何使用C++实现矩阵求逆。

我们将使用一个3x3的矩阵来示例。假设我们有以下矩阵:

[1 2 3]

[0 1 4]

[5 6 0]

为了求逆矩阵,我们需要分别计算出矩阵的伴随矩阵和行列式,并根据公式计算出逆矩阵。下面是求逆矩阵的C++代码:

#include <iostream>
using namespace std;
const int N = 3;
double det = 0;
void print(double A[N][N], string s = "") {
  cout << s << endl;
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
      cout << A[i][j] << " ";
    }
    cout << endl;
  }
  cout<<endl;
}
double determinant(double A[N][N], int n) {
  if(n == 1) {
    return A[0][0];
  }
  double det = 0;
  double temp[N][N];
  int sign = 1;
  for(int i = 0; i < n; i++) {
    int subi = 0;
    for(int j = 1; j < n; j++) {
      int subj = 0;
      for(int k = 0; k < n; k++) {
        if(k == i)
          continue;
        temp[subi][subj] = A[j][k];
        subj++;
      }
      subi++;
    }
    det += sign*A[0][i]*determinant(temp, n-1);
    sign = -sign;
  }
  return det;
}
void transpose(double A[N][N], double B[N][N]) {
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
      B[j][i] = A[i][j];
    }
  }
}
void adjoint(double A[N][N], double adj[N][N]) {
  if(N == 1) {
    adj[0][0] = 1;
    return;
  }
  double temp[N][N];
  int sign = 1;
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
      int subi = 0;
      for(int k = 0; k < N; k++) {
        if(i == k) continue;
        int subj = 0;
        for(int l = 0; l < N; l++) {
          if(j == l) continue;
          temp[subi][subj] = A[k][l];
          subj++;
        }
        subi++;
      }
      adj[j][i] = sign * determinant(temp, N-1);
      sign = -sign;
    }
  }
}
bool inverse(double A[N][N], double inverse[N][N]) {
  double det = determinant(A, N);
  if(det == 0)
    return false;
  
  double adj[N][N];
  adjoint(A, adj);
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
      inverse[i][j] = adj[i][j] / det;
    }
  }
  return true;
}
int main() {
  double A[N][N]={1, 1, 5};
  double adj[N][N], inverse[N][N];
  det = determinant(A, N);
  if(det == 0)
    cout<<"矩阵不可逆"<<endl;
    return 0;
  
  adjoint(A, adj);
  transpose(adj, inverse);
  for(int i = 0; i < N; i++) {
    for(int j = 0; j < N; j++) {
      inverse[i][j] /= det;
    }
  }
  print(A, "原矩阵:");
  print(inverse, "逆矩阵:");
  return 0;
}

上述代码中,我们利用了高斯-约旦消元法,Doolittle分解和LU分解等算法来实现矩阵求逆。我们首先计算矩阵的行列式以确定是否可逆。如果矩阵不可逆,则输出“矩阵不可逆”,退出程序。否则,我们使用伴随矩阵和行列式的公式计算出逆矩阵。

在上述代码中,我们还定义了三个子函数:`determinant`用于计算矩阵的行列式,`transpose`用于计算矩阵的转置,`adjoint`用于计算矩阵的伴随矩阵。这些子函数通过递归来实现矩阵的计算,使得代码更加简洁和易于理解。

接下来,我们就可以对矩阵进行求逆操作了。在本例中,原矩阵为:

[1 2 3]

[0 1 4]

[5 6 0]

其逆矩阵为:

[-0.24 0.12 0.04]

[ 0.30 -0.15 0.02]

[-0.05 0.03 -0.01]

我们可以发现,在C++中使用高斯-约旦消元法等算法实现矩阵求逆,代码相对简单而且易于理解。这对于开发矩阵计算相关程序的程序员来说,是一个非常有用的技能。

  
  

评论区

请求出错了