Advertisement

【计算任意维度矩阵逆矩阵】

阅读量:

矩阵求逆

该文介绍了一种用于计算矩阵逆的方法,并将其定义为基于(伴随矩阵+代数余子式)的具体实现过程。该方法的主要步骤包括:①计算目标矩阵的行列式的值;②求解目标矩阵对应的伴随矩阵的内容。整个过程涉及三个核心组件:

该文介绍了一种用于计算矩阵逆的方法,并将其定义为基于(伴随矩阵+代数余子式)的具体实现过程。该方法的主要步骤包括:①计算目标矩阵的行列式的值;②求解目标矩阵对应的伴随矩阵的内容。整个过程涉及三个核心组件:

  1. detValue(double **arr, int n) // 计算给定矩阵的行列式值
  2. cofactorMatrix(double** arr, double** cofactorArr, int n) // 删除第r行及第w列后得到子矩阵
  3. inverseMatrix(double** srcMatrix, double** invMatrix, int n) // 用于求取给定原始矩阵对应的逆阵

计算矩阵行列式

复制代码
    //======================================================
    //计算矩阵arr的行列式,d为矩阵的维度
    //======================================================
    double Det(double **arr, int d)
    {
    	int i;
    	double sum = 0;
    	if (d == 1)
    	{
    		sum = arr[0][0];
    	}
    	else if (d == 2)
    	{
    		sum = arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];
    	}
    	else if (d == 3)
    	{
    		sum = arr[0][0] * arr[1][1] * arr[2][2]
    			+ arr[0][1] * arr[1][2] * arr[2][0]
    			+ arr[1][0] * arr[2][1] * arr[0][2]
    			- arr[0][2] * arr[1][1] * arr[2][0]
    			- arr[0][1] * arr[1][0] * arr[2][2]
    			- arr[1][2] * arr[2][1] * arr[0][0];
    	}
    	else
    	{
    		double** arr2 = (double**)malloc(sizeof(double*) * (d - 1));
    		if (arr2 != NULL)
    		{
    			for (i = 0; i < d - 1; i++)
    			{
    				arr2[i] = (double*)malloc(sizeof(double) * (d - 1));
    			}
    		}
    
    		for (i = 0; i < d; i++)
    		{
    			if (arr[0][i] != 0)
    			{
    				Cof(arr, arr2, d, 0, i);
    				sum += pow(-1, i + 2) * arr[0][i] * Det(arr2, d - 1);
    			}
    		}
    
    		for (i = 0; i < d - 1; i++)     // 释放所申请的内存
    		{
    			free(arr2[i]);
    		}
    		free(arr2);
    	}
    	return sum;
    }
    
    //================================================================
    //计算矩阵arr去除r行w列的后的余子矩阵,并将结果存储于arr2矩阵中
    //================================================================
    void Cof(double** arr, double** arr2, int d, int r, int w)
    {
    	int i, j, m, n;
    	m = 0;
    	for (i = 0; i < d; i++)
    	{
    		if (i == r) continue;
    		n = 0;
    		for (j = 0; j < d; j++)
    		{
    			if (j == w) continue;
    			arr2[m][n] = arr[i][j];
    			n++;
    		}
    		m++;
    	}
    }
    
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/esIEcqpvzbmBRxUWk5JKNHSF7Cwi.png)

计算矩阵逆矩阵

复制代码
    //======================================================
    //计算矩阵src的逆矩阵,将结果保存于dst,d为矩阵的维度
    //======================================================
    void  InverseMat(double** src, double **dst, int d)
    {
    	double t = Det(src, d);          //计算矩阵src的行列式
    	double a = 1.0 / Det(src, d);
    
    	int i, j;
    
    	double** arr2 = (double**)malloc(sizeof(double*) * (d - 1));
    	if (arr2 != NULL)
    	{
    		for (i = 0; i < d - 1; i++)
    		{
    			arr2[i] = (double*)malloc(sizeof(double) * (d - 1));
    		}
    	}
    
    	for (i = 0; i < d; i++)
    	{
    		for (j = 0; j < d; j++)
    		{
    			Cof(src, arr2, d, i, j);
    			double b = pow(-1, i + j) * Det(arr2, d - 1);
    			dst[j][i] = a * b;
    		}
    	}
    
    	for (i = 0; i < d - 1; i++)     // 释放所申请的内存
    	{
    		free(arr2[i]);
    	}
    	free(arr2);
    }
    
    
    cpp
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-07-13/eAZFSVal1vpPw4znBYH85Xh3ITo9.png)

全部评论 (0)

还没有任何评论哟~