cvSolve详细使用说明(转)
(2009-09-14 10:41:55)
转载▼
标签:
杂谈
 
求解线性系统或者最小二乘法问题
int cvSolve( const CvArr* src1, const CvArr* src2, CvArr* dst, int method=CV_LU );
src1
输入矩阵
src2
线性系统的右部
dst
输出解答
method
解决方法(矩阵求逆) :
CV_LU - 最佳主元选取的高斯消除法
CV_SVD - 奇异值分解法 (SVD)
CV_SVD_SYM - 对正定对称矩阵的 SVD 方法
函数 cvSolve 解决线性系统或者最小二乘法问题 (后者用 SVD 方法可以解决):
dst = argmin |src1*X -src2|
如果使用 CV_LU 方法。 如果 src1 是非奇异的,该函数则返回 1 ,否则返回 0 ,在后一种情况下 dst 是无效的。
例如解抛物线拟合的问题:
y = a*x*x + b*x +c
假设有三个点: A1(x1,y1),A1(x1,y1),A2(x3,y3)
a*x1*x1 + b*x1 + c = y1
a*x2*x2 + b*x2 + c = y2
a*x3*x3 + b*x3 + c = y3
A = [x1*x1  x1  1
    x2*x2  x2  1
    x3*x3  x3  1]
B = [y1
    y2
    y3]
X = [a
    b
    c]
AX = B
求解X 即可得出a, b, c
int  cvSolve(  const  CvArr*  src1,  const  CvArr*  src2,  CvArr*  dst,  int  method=CV_LU  ); 
   
  临时写了一个,并附上matlab代码和结果. 
   
  #include  <stdio.h> 
   
  #include  "cv.h" 
  #include  "cxcore.h" 
  #pragma  comment(lib,"cv.lib") 
  #pragma  comment(lib,"cxcore.lib") 
   
  //author: qiansen 
  //date: 2006.8.8 
  //descript: colve  linear  equation. 
  //compile:  cl  mySolve.cpp 
   
  void  main(int  argc,  char  *argv[]) 
  { 
   
  float  a[9]={1,2,3,4,5,7,6,8,9}; 
  float  b[3]={2,3,1}; 
  CvMat*  A  =  cvCreateMat(3,3,CV_32FC1); 
  CvMat*  X  =  cvCreateMat(3,1,CV_32FC1); 
  CvMat*  B  =  cvCreateMat(3,1,CV_32FC1); 
   
printf输出格式matlab  cvSetData(A,a,CV_AUTOSTEP); 
  cvSetData(B,b,CV_AUTOSTEP); 
  cvSolve(A,  B,  X,  CV_LU);  //  solve  (Ax=b)  for  x 
   
  printf("A:"); 
  for(int  i=0;i<9;i++){ 
  if(i%3==0) printf("\n"); 
  printf("%f\t",A->data.fl[i]); 
  } 
   
  printf("\n\nX:\n"); 
  for(  i=0;i<3;i++){ 
  printf("%f\t",X->data.fl[i]); 
  } 
   
  printf("\n\nb:\n"); 
  for(  i=0;i<3;i++){ 
  printf("%f\t",B->data.fl[i]); 
  } 
   
  } 
   
   
   
   
  /* 
  matlab  code: 
  >>A=[1,2,3;4,5,7;6,8,9] 
   
  A  = 
   
            1          2          3 
            4          5          7 
            6          8          9 
   
  >>B=[2;3;1] 
   
  B  = 
   
            2 
            3 
            1 
             
  >>A\B 
   
  ans  = 
   
        -0.7143 
        -1.4286 
          1.8571