读书人

矩阵求逆,该如何解决

发布时间: 2012-05-09 12:13:59 作者: rapoo

矩阵求逆
double t;
int N=TNNxNN.size();
vector<int> is(N);
vector<int> js(N);
int i,j,k;
for(k=0;k<N;k++){
for(t=0,i=k;i<N;i++)
for(j=k;j<N;j++)
if(fabs(TNNxNN[i][j])>t)
t=fabs(TNNxNN[is[k]=i][js[k]=j]);//选取从第 k 行、第 k 列开始的右下角子阵中选取绝对值最大的元素,并记住次元素所在的行号和列号,在通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。
if(fabs(t)<0.000001) return false;
if(is[k]!=k)
for(j=0;j<N;j++)
t=TNNxNN[k][j],TNNxNN[k][j]=TNNxNN[is[k]][j],TNNxNN[is[k]][j]=t;
if(js[k]!=k)
for(i=0;i<N;i++)
t=TNNxNN[i][k],TNNxNN[i][k]=TNNxNN[i][js[k]],TNNxNN[i][js[k]]=t;

TNNxNN[k][k]=1.0/TNNxNN[k][k];
for(j=0;j<N;j++)
if(j!=k)
TNNxNN[k][j]*=TNNxNN[k][k];
for(i=0;i<N;i++)
if(i!=k)
for(j=0;j<N;j++)
if(j!=k)
TNNxNN[i][j]-=TNNxNN[i][k]*TNNxNN[k][j];
for(i=0;i<N;i++)
if(i!=k)
TNNxNN[i][k]*=-TNNxNN[k][k];
}


for(k=N-1;k>=0;k--){

if(js[k]!=k)
for(j=0;j<N;j++)
t=TNNxNN[k][j],TNNxNN[k][j]=TNNxNN[js[k]][j],TNNxNN[js[k]][j]=t;
if(is[k]!=k)
for(i=0;i<N;i++)
t=TNNxNN[i][k],TNNxNN[i][k]=TNNxNN[i][is[k]],TNNxNN[i][is[k]]=t;
}

return true;



上面是代码。为什么求出来的矩阵和原来的矩阵。相乘。只有对角线的元素为1。其他的地方不是0啊?求高手给予解答。

下面是矩阵相乘的部分。

bool CPatch::MatrixMultiply(vector<vector<double> >& finalTNN,vector<vector<double> >& finalNN,
vector<vector<double> >& TNNxNN)
{
TNNxNN.resize(finalTNN.size());
for (int i=0;i<TNNxNN.size();++i)
{
TNNxNN[i].resize(finalNN[0].size());
}

for (int i=0;i<TNNxNN.size();++i)
{
for (int j=0;j<TNNxNN[i].size();++j)
{
for (int l=0;l<finalTNN[i].size();++l)
{
TNNxNN[i][j]=TNNxNN[i][j]+finalTNN[i][l]*finalNN[l][j];
}
}

}

return true;
}

[解决办法]
opencv的一个cvInvert函数即可实现求矩阵的逆
[解决办法]
opencv

读书人网 >C++

热点推荐