bool
InverseMatrix(vector<float>* A, int
n) //高斯求逆矩阵
{
int i, j, k;
float max, temp;
vector<float> t,
B;
//临时矩阵
t.resize(n*n);
B.resize(n*n);
for(i = 0; i
< n;
++i)
//将A矩阵存放在临时矩阵t[n][n]中 {
for(j = 0; j <
n; ++j)
{
t[i*n + j] =
*(A->begin() + i*n + j);
}
}
for(i = 0; i
< n;
++i)
//初始化B矩阵为单位阵 {
for(j = 0; j <
n; ++j)
{
B[i*n + j] =
(i == j) ? 1.0f : 0.0f;
}
}
for(i = 0; i
< n;
++i)
//寻找主元 {
max = t[i*n + i];
k = i;
for(j
= i+1; j < n; ++j)
{
if(fabs(t[j*n
+ i]) > fabs(max))
{
max
= t[j*n + i];
k
= j;
}
}
if(k !=
i)
//如果主元所在行不是第i行,进行行交换 {
for (j = 0; j
< n; ++j)
{
temp
= t[i*n + j];
t[i*n
+ j] = t[k*n + j];
t[k*n
+ j] = temp;
temp
= B[i*n + j];
B[i*n
+ j] = B[k*n + j];
B[k*n
+ j] = temp;
}
}
if(t[i*n + i] ==
0)
//判断主元是否为0, 若是,
则矩阵A不是满秩矩阵,不存在逆矩阵 {
return
false;
}
temp = t[i*n +
i];
//消去A的第i列除去i行以外的各行元素
for(j
= 0; j < n; ++j)
{
t[i*n + j] =
t[i*n + j] /
temp;
//主对角线上的元素变为1 B[i*n
+ j] = B[i*n + j] /
temp;
//伴随计算 }
for(j
= 0; j < n;
++j)
//第0行->第n行 {
if(j !=
i)
//不是第i行 {
temp
= t[j*n + i];
for(k
= 0; k < n;
k++)
//第j行元素 -
i行元素*j列i行元素 {
t[j*n
+ k] = t[j*n + k] - t[i*n + k]*temp;
B[j*n
+ k] = B[j*n + k] - B[i*n + k]*temp;
}
}
}
}
for(i = 0; i
< n; ++i)
{
for(j = 0; j <
n; ++j)
{
*(A->begin()
+ i*n + j) = B[i*n + j];
}
}
t.clear();
B.clear();
return true;
}
|