通过伴随阵来求逆矩阵
2013-09-23 22:14
295 查看
一、计算思路
一个方阵 A 如果满足
,则A可逆, 且
由上面公式可以知道,我们只需求出 A 的伴随阵及A对应的行列式的值即可求出方阵A的
逆矩阵。下面将分别实现这两个部分。
二、具体实现
1、计算矩阵A对应的行列式的值
引入一个定理: 行列式的值等于它的任一行(列)的各元素与其对应的代数余子式乘积之和。
上面定理中提到了代数余子式,其实这个概念很简单。在n阶行列式中位于 (i, j) 的元素
的
代数余子式就是将该元素所在的第i行和第j列划掉后,留下来的n-1阶行列式叫做
的余子式,
记作
。记
则
叫做元
的代数余子式。
根据上面这些我们就可以写出 计算矩阵对应的行列式的值的算法了。
private static double getValueOfDeterminant(double[][] data) { if(data.length == 1) { return data[0][0]; } if(data.length == 2) { return data[0][0] * data[1][1] - data[0][1] * data[1][0]; } double valueOfDeterminant = 0; double[] elementsMultiplyItsCofactor = new double[data[0].length]; for(int j=0; j<data[0].length; j++) { double cofactorValue = getValueOfDeterminant(getCofactor(data, 0, j)); if(j % 2 == 0) { elementsMultiplyItsCofactor[j] = data[0][j] * cofactorValue; } else { elementsMultiplyItsCofactor[j] = -1 * data[0][j] * cofactorValue; } valueOfDeterminant += elementsMultiplyItsCofactor[j]; } return valueOfDeterminant; }
函数 getValueOfDeterminant 中用到了一个函数 getCofactor , 这个函数很简单,就是
用来获取矩阵中矩阵A中(i, j)元
的余子式的。
2、计算获取矩阵A的伴随阵并求逆矩阵
伴随阵的定义: 行列式|A|的各个元素的代数余子式所构成的如下矩阵
分别计算矩阵A中每个元素的代数余子式,并除以|A|,即可获得矩阵A的逆矩阵.
主要代码如下:
public static double[][] getMatrixInversion(double[][] data) { //the matrix has no inverse matrix if(data.length != data[0].length) { return new double[][]{}; } //Get value of determinant for the matrix double valueOfDeterminant = getValueOfDeterminant(data); if(valueOfDeterminant == 0) { //The matrix doesn't have inversion matrix return new double[][]{}; } //Get inversion of the matrix inputed double[][] inversion = new double[data.length][data[0].length]; for(int i=0; i<inversion.length; i++) { for(int j=0; j<inversion[0].length; j++) { double num = getValueOfDeterminant(getCofactor(data, i, j)); if( (i + j) % 2 == 0 ) { inversion[j][i] = num / valueOfDeterminant; } else { inversion[j][i] = -1 * num / valueOfDeterminant; } } } return inversion; }
通过伴随阵来求逆矩阵效率不太高,接下来将会尝试用LU分解法来求解逆矩阵。
3. 后记
后面的文章里讲到了 LU分解求线性方程组 Ax=b。很明显,只要将这里的 矩阵 b 替换成与A同型的单位矩阵E,则该线性方程组的解x就是 矩阵A的逆矩阵了。
相关文章推荐
- Ajax 通过id 获取名字 以及 所属班级 获取数据得jsp
- 通过hough变换检测直线
- 通过ping和tracert命令来判断远程主机类型
- Sharepoint学习笔记---SPList--使用Linq to Sharepoint间接查询External List(1.通过BCS创建External List)
- gdbserver远程调试的具体实现(已测试通过)
- 通过uCOS-II的邮箱方式,实现任务间数据传递的简单实例
- ckplayer通过Mod-H264支持随意拖动功能
- 通过查看连连看的内存地址,连连看的外挂!!!
- python_ftplib实现通过FTP下载文件
- python通过yield实现数组全排列的方法
- 第九章 通过 SMB 共享虚拟机
- 通过Android keyevent 向系统发送命令
- 通过指向结构体变量的指针变量输出结构体变量中成员的信息
- 通过Windows Service启动外部程序
- 通过短信接口,让选举公正公平!
- Spring中通过注解配置bean(1)
- 【Swift】通过类名创建对象
- 异步函数通过Thunk话在generator中自动执行
- 通过Jsp发送动态图像