• Open Source Computer Vision Library

施密特正交化

Wikipedia,自由的百科全书

  1. // ***************************************************************
  2. // GramSchmit version: 1.0 date: 05/24/2007
  3. // -------------------------------------------------------------
  4. // 作者:luckdst
  5. // -------------------------------------------------------------
  6. // Copyright (C) 2007
  7. // ***************************************************************
  8. //
  9. // ***************************************************************
  10. #include "cv.h"
  11. #include "cxcore.h"
  12. #include "cvaux.h"
  13. #include <iostream.h>
  14. //按行操作,要被正交化的向量以行的形式放在src里面,输出正交向量以行
  15. //的形式放dst里面,输出向量没有单位化.
  16. void GramSchmidt(const CvMat* src, CvMat* dst)
  17. {
  18. int i,j;
  19. double param,param1,param2;
  20. assert(src!=NULL&&dst!=NULL);
  21. assert(src->cols==dst->cols&&src->rows==dst->rows);
  22. CvMat *VecSrc = cvCreateMat(1, src->cols, CV_64FC1);
  23. CvMat *VecDst = cvCreateMat(1, dst->cols, CV_64FC1);
  24. CvMat *VecTmp = cvCreateMat(1, dst->cols, CV_64FC1);
  25. cvZero(VecSrc);
  26. cvZero(VecDst);
  27. for(i=0;i<dst->rows;i++)
  28. {
  29. cvGetRow(src, VecDst, i);
  30. cvGetRow(src, VecSrc, i);
  31. for(j=0;j<i;j++)
  32. {
  33. cvGetRow(dst, VecTmp, j);
  34. param1=cvDotProduct(VecSrc,VecTmp);
  35. param2=cvDotProduct(VecTmp,VecTmp);
  36. param=param1/param2;
  37. cvAddWeighted(VecTmp,-param,VecDst,1.0,0,VecDst);
  38. }
  39. memcpy(dst->data.db+i*dst->cols,VecDst->data.db,dst->cols*sizeof(double));
  40. }
  41. cvReleaseMat(&VecSrc);
  42. cvReleaseMat(&VecDst);
  43. cvReleaseMat(&VecTmp);
  44. }
  45.  
  46. int main(int argc, char *argv[])
  47. {
  48. int i,j;
  49. CvMat *Ma,*Mb;
  50. Ma= cvCreateMatHeader( 3, 4, CV_64FC1 );
  51. Mb=NULL;
  52.  
  53. const double a[] = { 1, 0,1, 1,
  54. 0,1, 1, 0,
  55.    0, 0,1,1,};
  56. cvInitMatHeader( Ma, 3, 4, CV_64FC1, (void *)a);
  57. Mb=cvCreateMat(Ma->rows,Ma->cols,CV_64FC1);
  58. GramSchmidt(Ma,Mb);
  59. //printf out
  60. for(i=0;i<Mb->rows;i++)
  61. {
  62. for(j=0;j<Mb->cols;j++)
  63. {
  64. cout<<CV_MAT_ELEM(*Mb,double,i,j)<<" ";
  65. }
  66. cout<<endl;
  67. }
  68. cout<<endl;
  69. ///////////////////////////////////
  70. //test
  71. CvMat *M1=cvCreateMat(1,Ma->cols,CV_64FC1);
  72. CvMat *M2=cvCreateMat(1,Ma->cols,CV_64FC1);
  73. double s;
  74. for(i=0;i<Mb->rows;i++)
  75. {
  76. cvGetRow(Mb, M1, i);
  77. for(j=0;j<Mb->rows;j++)
  78. {
  79. cvGetRow(Mb, M2, j);
  80. s=cvDotProduct(M2,M1);
  81. cout<<s<<" ";
  82. }
  83. cout<<endl;
  84. }
  85. cvReleaseMat(&Ma);
  86. cvReleaseMat(&Mb);
  87. return 0;
  88. }
  89.  
Views
Personal tools