cvmatop.c
上传用户:banwdc
上传日期:2016-06-25
资源大小:2871k
文件大小:2k
源码类别:

OpenCV

开发平台:

Visual C++

  1. #include "cv.h"
  2. #include "highgui.h"
  3. #include <stdio.h>
  4. // 显示矩阵
  5. void PrintMat(CvMat* A)
  6. {
  7.     int i,j;
  8.     //printf("nMatrix = :");
  9.     for(i=0;i<A->rows;i++)
  10.     {
  11.         printf("n");
  12.         
  13.         switch( CV_MAT_DEPTH(A->type) )
  14.         {
  15.         case CV_32F:
  16.         case CV_64F:
  17.             for(j=0;j<A->cols;j++)
  18.                 printf("%9.3f ", (float) cvGetReal2D( A, i, j ));
  19.             break;
  20.         case CV_8U:
  21.         case CV_16U:
  22.             for(j=0;j<A->cols;j++)
  23.                 printf("%6d",(int)cvGetReal2D( A, i, j ));
  24.             break;
  25.         default:
  26.             break;
  27.         }
  28.     }
  29.     printf("n");
  30. }
  31. int main()
  32. {
  33. //
  34. // 测试矩阵操作
  35. // 所有数据是按照MATLAB中的矩阵操作例子来进行的
  36. //
  37.     double a[] = {   1,  2,  0,
  38.             2,  5, -1,
  39.                     4, 10, -1 };
  40.     double b[9],c[9];
  41.     CvMat Ma, Mb, Mc;
  42.     
  43.     // 从缓存给矩阵赋值
  44.     cvInitMatHeader( &Ma, 3, 3, CV_64FC1, a, CV_AUTOSTEP );
  45.     cvInitMatHeader( &Mb, 3, 3, CV_64FC1, b, CV_AUTOSTEP );
  46.     cvInitMatHeader( &Mc, 3, 3, CV_64FC1, c, CV_AUTOSTEP );
  47.     // 显示矩阵Ma
  48.     printf("A = "); PrintMat(&Ma);
  49.     // 转置 Mb = Ma'
  50.     cvTranspose(&Ma, &Mb);
  51.     printf("A’ = "); PrintMat(&Mb);
  52.     // Mc = Ma * Mb
  53.     cvMatMul(&Ma, &Mb, &Mc);
  54.     printf("A*A’ = "); PrintMat(&Mc);
  55.     // Mc = Ma .* Mb
  56.     cvMul(&Ma, &Mb, &Mc, 1);
  57.     printf("A.*A = "); PrintMat(&Mc);
  58.     // Mb = inv( Ma ), 用高斯消去法求逆
  59.     cvInvert(&Ma, &Mb, CV_LU);
  60.     printf("inv(A) = "); PrintMat(&Mb);
  61.     // Ma * inv(Ma) 
  62.     cvMatMul(&Ma, &Mb, &Mc);
  63.     printf("A*inv(A) = "); PrintMat(&Mc);
  64.     // Mc = svd(Ma),  表示 Ma = U * Mc * V'
  65.     cvSVD(&Ma, &Mc, NULL, NULL, 0);  // 不返回 U 和 V
  66.     printf("svd(A) = "); PrintMat(&Mc);
  67.     // Mc = Ma + 2
  68.     cvAddS(&Ma, cvRealScalar(2), &Mc, NULL);
  69.     printf("A+2 = "); PrintMat(&Mc);
  70. return 0;
  71. }