您的位置:首页 > 编程语言 > C语言/C++

求逆矩阵的c++实现

2015-08-11 20:03 274 查看
转载请注明出处。

这里用的是求伴随矩阵的方法。

用到模板的知识,没有做什么出错检查,只能做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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: