矩阵求逆常见算法

前言

    不知道从哪天开始,看到矩阵就头疼,特别是矩阵的运算更是蛋疼,都不好意思说自己是数学专业的,哈哈。这两天在搞opencv图像处理,又涉及到这一块,无语之,干脆收集整理下,以飨同痛苦者。


一、逆矩阵的概念

利用矩阵的乘法和矩阵相等的含义,可以把线性方程组写成矩阵形式。对于线性方程组

A   X   B

则方程组可写成AX=B.

方程AX=B是线性方程组的矩阵表达形式,称为矩阵方程。其中A称为方程组的系数矩阵X称为未知矩阵B称为常数项矩阵

这样,解线性方程组的问题就变成求矩阵方程中未知矩阵X的问题。类似于一元一次方程ax=ba≠0)的解可以写成x=a-1b,矩阵方程AX=B的解是否也可以表示为X=A-1B的形式?如果可以,则X可求出,但A-1的含义和存在的条件是什么呢?下面来讨论这些问题。

定义11  对于n阶方阵A,如果存在n阶方阵C,使得AC=CA=EEn阶单位矩阵),则把方阵C称为A逆矩阵(简称逆阵)记作A-1,即C=A-1

例如     

因为  AC==

CA==

所以C是的A逆矩阵,即C=A-1

由定义可知,AC=CA=ECA的逆矩阵,也可以称AC的逆矩阵,即A=C-1。因此,AC称为互逆矩阵。

可以证明,逆矩阵有如下性质:

(1)若A是可逆的,则逆矩阵唯一。

(2)若A可逆,则(A-1)-1=A.

(3)若AB为同阶方阵且均可逆,则AB可逆,且(AB)-1=B-1A-1

(4)若A可逆,则detA≠0。反之,若detA≠0,则A是可逆的。

  (1)如果BC都是A的逆矩阵,则

C=CE=C(AB)=(CA)=EB=B

即逆矩阵唯一。

其它证明略。

二、逆矩阵的求法

1、用伴随矩阵求逆矩阵

定义12  设矩阵

A=

所对应的行列式detA中元素aij的代数余子式矩阵

称为A伴随矩阵,记为A*

显然,AA=

仍是一个n阶方阵,其中第i行第j列的元素为

由行列式按一行(列)展开式可知

=

所以       AA==detAE    (1)

同理  AA=detAE=AA

定理3  n阶方阵A可逆的充分必要条件是A为非奇异矩阵,而且

A-1=A=

  必要性:

如果A可逆,则A-1存在使AA-1=E,两边取行列式det(AA-1)= detE,即detAdetA-1=1,因而detA≠0,即A为非奇异矩阵。

充分性:

A为非奇异矩阵,所以detA≠0,由(1)式可知A(A)= (A)A=E

所以A是可逆矩阵。

A-1=A

例1  求矩阵A=的逆矩阵。

  因为detA=,所以A是可逆的。又因为

    

    

    

所以A-1=A=

=

2、用初等变换求逆矩阵

用初等变换求一个可逆矩阵A的逆矩阵,其具体方法为:把方阵A和同阶的单位矩阵E,写成一个长方矩阵,对该矩阵的行实施初等变换,当虚线左边的A变成单位矩阵E时,虚线右边的E变成了A-1

从而可求A-1

例2  用初等变换求

的逆矩阵。

  因为 =

所以 A-1=

例3 解线性方程组

  方程组可写成

=

A=  X=  B=  则AX=B

由例2知A可逆,且A-1=

所以X=A-1B,即=A-1B==

于是,方程组的解是

习题 12--6

1、用伴随矩阵求下列矩阵的逆矩阵:

(1)   (2)   (3)

2、用初等变换求逆矩阵:

(1)   (2)   (3)

(4)

3、解矩阵方程

(1)X

(2)

(3)

(4)

4、解线性方程组

(1)

(2)



  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 数值计算矩阵求逆是一种重要的数学计算过程,可以使用C语言编程实现。下面是一个基本的矩阵求逆算法的程序示例: ```c #include <stdio.h> // 定义矩阵大小 #define N 3 // 打印矩阵 void printMatrix(float matrix[N][N]) { for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { printf("%.2f ", matrix[i][j]); } printf("\n"); } printf("\n"); } // 矩阵求逆 void matrixInverse(float matrix[N][N]) { float identity[N][N]; float ratio, temp; int i, j, k; // 构造单位矩阵 for(i = 0; i < N; i++) { for(j = 0; j < N; j++) { if(i == j) { identity[i][j] = 1; } else { identity[i][j] = 0; } } } // 高斯-约当消元法求逆 for(i = 0; i < N; i++) { ratio = matrix[i][i]; for(j = 0; j < N; j++) { matrix[i][j] /= ratio; identity[i][j] /= ratio; } for(k = 0; k < N; k++) { if(k != i) { ratio = matrix[k][i]; for(j = 0; j < N; j++) { matrix[k][j] -= ratio * matrix[i][j]; identity[k][j] -= ratio * identity[i][j]; } } } } printf("逆矩阵:\n"); printMatrix(identity); } int main() { float matrix[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; printf("原始矩阵:\n"); printMatrix(matrix); matrixInverse(matrix); return 0; } ``` 该程序在C语言实现了一个基本的矩阵求逆算法。它使用高斯-约当消元法来求解逆矩阵,首先构造一个单位矩阵,然后通过一系列的消元操作将原始矩阵转化为单位矩阵,此时单位矩阵所对应的就是原始矩阵的逆矩阵。最后,通过调用`matrixInverse`函数,传入一个3x3大小的矩阵,即可计算并输出逆矩阵。 ### 回答2: 数值计算矩阵求逆是一种常见的数值算法,可以使用C语言编写。以下是一个大致的程序示例: #include <stdio.h> #define N 3 // 矩阵的维度 // 函数声明 int inverseMatrix(double A[][N], double invA[][N]); void printMatrix(double matrix[][N]); int main() { // 定义原始矩阵A和逆矩阵invA double A[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; double invA[N][N]; // 调用求逆函数 int success = inverseMatrix(A, invA); if (success) { printf("矩阵A的逆矩阵为:\n"); printMatrix(invA); } else { printf("矩阵A不可逆!\n"); } return 0; } // 求矩阵的逆矩阵 int inverseMatrix(double A[][N], double invA[][N]) { // 请在这里实现计算矩阵的逆矩阵的算法 // 返回是否成功求逆,成功返回1,失败返回0 return 1; } // 打印矩阵 void printMatrix(double matrix[][N]) { for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { printf("%f ", matrix[i][j]); } printf("\n"); } } 该程序主要包含了两个函数:inverseMatrix和printMatrix。 invertMatrix函数负责计算给定矩阵的逆矩阵。在该函数,你需要实现求逆矩阵的具体算法。根据不同的数值计算算法,计算逆矩阵有多种方法,比如高斯-约当消元法、LU分解等。根据你的具体需求选择合适的方法来计算逆矩阵。该函数需要返回1表示成功求逆,返回0表示矩阵不可逆。 printMatrix函数用于打印矩阵。你可以根据需要对打印的格式进行修改。 在main函数,我们定义了一个3x3的矩阵A,并预留了一个与A维度相同的矩阵invA用于存储逆矩阵。调用inverseMatrix函数计算矩阵A的逆矩阵,并根据计算是否成功进行相应的输出。 ### 回答3: 数值计算矩阵求逆是一种常见的计算矩阵逆的算法,其最常用的算法就是高斯-约当消元法。下面是用C语言实现的一个简单的矩阵求逆算法: ```c #include <stdio.h> #define SIZE 3 void printMatrix(double matrix[SIZE][SIZE]); void swap(double* a, double* b); void inverseMatrix(double matrix[SIZE][SIZE], double inverse[SIZE][SIZE]); int main() { double matrix[SIZE][SIZE] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; double inverse[SIZE][SIZE]; inverseMatrix(matrix, inverse); printf("原始矩阵:\n"); printMatrix(matrix); printf("逆矩阵:\n"); printMatrix(inverse); return 0; } void printMatrix(double matrix[SIZE][SIZE]) { for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { printf("%f ", matrix[i][j]); } printf("\n"); } printf("\n"); } void swap(double* a, double* b) { double temp = *a; *a = *b; *b = temp; } void inverseMatrix(double matrix[SIZE][SIZE], double inverse[SIZE][SIZE]) { // 初始化单位矩阵 for (int i = 0; i < SIZE; i++) { for (int j = 0; j < SIZE; j++) { inverse[i][j] = (i == j) ? 1 : 0; } } for (int i = 0; i < SIZE; i++) { // 如果矩阵[i][i]为0,交换该行和下一行 if (matrix[i][i] == 0) { for (int j = i + 1; j < SIZE; j++) { if (matrix[j][i] != 0) { for (int k = 0; k < SIZE; k++) { swap(&matrix[i][k], &matrix[j][k]); swap(&inverse[i][k], &inverse[j][k]); } break; } } } // 将主对角线上的元素变为1 double factor = matrix[i][i]; for (int j = 0; j < SIZE; j++) { matrix[i][j] /= factor; inverse[i][j] /= factor; } // 消元得到上三角矩阵 for (int j = i + 1; j < SIZE; j++) { double factor = matrix[j][i]; for (int k = 0; k < SIZE; k++) { matrix[j][k] -= factor * matrix[i][k]; inverse[j][k] -= factor * inverse[i][k]; } } } for (int i = SIZE - 1; i >= 0; i--) { // 消元得到对角线为1的矩阵 for (int j = i - 1; j >= 0; j--) { double factor = matrix[j][i]; for (int k = 0; k < SIZE; k++) { matrix[j][k] -= factor * matrix[i][k]; inverse[j][k] -= factor * inverse[i][k]; } } } } ``` 上述程序,我们定义了一个`printMatrix`函数来打印矩阵,一个`swap`函数用于交换两个数的值。`inverseMatrix`函数用于计算矩阵的逆。首先,我们初始化一个单位矩阵作为逆矩阵的初始值。然后,通过高斯-约当消元法来将原始矩阵转化为上三角矩阵,并且将对应的操作应用到逆矩阵上。最后,我们再次应用高斯-约当消元法将上三角矩阵变为对角线为1的矩阵,并将对应的操作应用到逆矩阵上。输出结果即为原始矩阵和逆矩阵的值。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值