首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

矩阵求逆,该如何解决

2012-05-09 
矩阵求逆double tint NTNNxNN.size()vectorint is(N)vectorint js(N)int i,j,kfor(k0kNk++)

矩阵求逆
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

热点排行