求逆矩阵的c++实现
2015-08-11 20:03
274 查看
转载请注明出处。
这里用的是求伴随矩阵的方法。
用到模板的知识,没有做什么出错检查,只能做3阶及以上矩阵。
这里用的是求伴随矩阵的方法。
用到模板的知识,没有做什么出错检查,只能做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) ) { 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) ) { 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) , double (&dst) ) { 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; }
相关文章推荐
- HDU栈外挂 用c++提交
- 关于C/C++ 结构体字节的算法
- Android之——JNI配置C语言打印Logcat信息
- C++ 对象的sizeof问题
- 黑马程序员———C语言———【一维数组】
- C++ 命名空间
- C++对象模型——Inline Functions(第四章)
- C++ Primer 学习笔记_32_STL实践与分析(6) --再谈string类型(下)
- C++对象模型——指向Member Function的指针 (Pointer-to-Member Functions)(第四章)
- [LeetCode] Flatten Binary Tree to Linked List
- vc++6对windows SEH扩展分析
- C++对象模型——函数的效能(第四章)
- C++之 继承后的访问控制
- C++:C++的两种多态形式
- C/C++产生随机数
- C语言str函数系列总结
- Leetcode -- Longest Common Prefix
- C++11中变量初始化方法汇总
- C++primer【笔记】 顺序容器
- POCO C++库学习和分析——任务