讨论invert函数的效率。

来源:互联网 发布:java访问修饰符等级 编辑:程序博客网 时间:2024/06/07 17:02

由于图像识别针对于视频处理,对于效率十分看重。

我通过计算3*3的矩阵转换成逆矩阵,发现invert函数效率并不高。而且CV_LU的效率比CV_SVD高一倍,因为用的高斯消除法。

但用我自己写的转换程序之后,竟然速度比CV_LU快三倍。

下面是普通的3*3矩阵逆矩阵求法,想换成别的逆矩阵,下面函数的3换成形参(维数)就行。

void cvInvert(const double src[3][3],double dst[3][3])
{
 double y=1.0;
 double a[3][2*3];
 double b[3][2*3];
 double t,x; 
 int k,i,j; 
 
 for(i = 0;i<3;i++) 
  for (j = 0;j<3;j++) 
   b[i][j] = src[i][j];
 /*
 printf("原矩阵为:/n"); 
 for (i=0;i<3;i++) 
 { 
  for (j = 0;j<3;j++)   
   printf("%f,",b[i][j]); 
  printf("/n"); 
 }
 */
 for(i=0;i<3;i++) 
  for(j = 0;j<(2*3);j++) 
  {
   if (j<3)  
    a[i][j]=b[i][j];
   else if (j==3+i)  
    a[i][j]=1.0; 
   else 
    a[i][j]=0.0; 
  }
 for(i = 0;i<3;i++)
 {
  for(k = 0;k<3;k++)
  {
   if(k!=i)
   {
    t = a[k][i]/a[i][i];
    for(j = 0;j<(2*3);j++)
    {
     x = a[i][j]*t;
     a[k][j] = a[k][j]-x;
    }
   }
  }
 }
 for(i=0;i<3;i++)
 {
  t = a[i][i];
  for(j = 0;j<(2*3);j++)
   a[i][j] = a[i][j]/t;
 }

 for(i=0;i<3;i++) 
  y = y*a[i][i];
 if(y==0)
  printf("对不起,您输入的矩阵没有逆矩阵,请重新输入。/n");
 else   
 {
  for(i = 0;i<3;i++) 
   for(j = 0;j<3;j++)
    dst[i][j] = a[i][j+3];
  /*
  printf("逆矩阵为:/n"); 
  for (i=0;i<3;i++) 
  { 
   for (j = 0;j<3;j++)
    printf("%-10lf",dst[i][j]); 
   printf("/n"); 
  } 
  */
 }
}

 

来csdn是学习的,不是扯淡的。

 

原创粉丝点击