求逆矩阵的c++实现
来源:互联网 发布:视频配音软件 编辑:程序博客网 时间:2024/06/05 16:12
转载请注明出处。
这里用的是求伴随矩阵的方法。
用到模板的知识,没有做什么出错检查,只能做3阶及以上矩阵。
int inc(int i, int N){ if(i >= N) return i % N; else if(i < 0) return i + N; return i;}template <typename T, int N>T CalcDet(T (&m)[N][N]){ if(2 == N) return m[0][0] * m[1][1] - m[0][1] * m[1][0]; T det = 0; T pos, neg; for(int i = 0; i < N; ++i) { pos = 1; for(int j = 0; j < N; ++j) { pos *= m[j][inc(i+j, N)]; } det += pos; } for(int i = N-1; i >= 0; --i) { neg = 1; for(int j = 0; j < N; ++j) { neg *= m[j][inc(i-j, N)]; } det -= neg; } return det;}template <typename T, int N>void Transpose(T (&m)[N][N]){ T temp; for(int i = 0; i < N; ++i) { for(int j = i + i; j < N; ++j) { temp = m[i][j]; m[i][j] = m[j][i]; m[j][i] = temp; } }}template <typename T, int N>bool Inverse(const T (&src)[N][N], double (&dst)[N][N]){ if(N <= 2) return false; T det = CalcDet(src); T submat[N-1][N-1]; for(int i = 0; i < N; ++i) { for(int j = 0; j < N; ++j) { int k, l, s, t; for(k = 0, s = 0; s < N-1; ++s, ++k) { if(s == i) ++k; for(l = 0, t = 0; t < N-1; ++t, ++l) { if(t == j) ++l; submat[s][t] = src[k][l]; } } double sign = (i + j & 1) == 0 ? 1.0 : -1.0; dst[i][j] = sign * CalcDet(submat) / det; } } Transpose(dst); return true;}
0 0
- 矩阵求逆的C语言实现
- 矩阵的乘法和求逆(C语言实现)
- c语言实现求逆矩阵
- C语言求矩阵的行列式、伴随矩阵、逆矩阵
- 矩阵求逆计算的实现
- 求逆矩阵的c++实现
- 求逆矩阵以及两矩阵相乘的算法实现
- 矩阵求逆算法及程序实现(C++)
- n阶多项式拟合与n阶矩阵求逆的C语言实现
- 矩阵求逆(c++)
- 求矩阵的逆
- 矩阵的求逆
- 求矩阵的逆
- 矩阵的求逆
- 求矩阵的逆
- 矩阵求逆c++实现
- Java实现的矩阵类及矩阵的转置,加减乘和矩阵求逆
- Matlab实现——求矩阵的逆(LU分解)
- 黑马程序员——类与对象
- 话务预测(2) 数据
- 创业:中国农批市场的那些事儿
- 51NOD1024 矩阵中不重复的元素
- HDU 1242 Rescue
- 求逆矩阵的c++实现
- hdu-1878 欧拉回路
- java 冒泡,手动输入会输出排序结果
- 异步等待的 Python 协程
- 29-HTML-01-HTML(概述&演示)
- linux中断子系统:中断号的映射与维护初始化mmap过程
- 面试-机试-编程题--剑指offer
- ubuntu下环境变量设置(java, eclipse)
- hdu5371(O(n)求回文子串的相关问题)