●連立方程式を解く
・行列操作のライブラリだけでも、十分利用価値の高い Open CV。
 小手調べに、逆行列を求めて連立方程式を解いてみる
#include <stdio.h>
#include <cv.h>

#pragma comment(lib, "cvhaartraining.lib")

//----------------------------------------------------------------------------
// 連立方程式 Y = A X を解いて、 X = A^{-1} Y を求める
//----------------------------------------------------------------------------
int main( void )
{
  int n, i, j;
  CvMat * mA, * mA_inv;
  CvMat * vX, * vY;
  float f;

  // 行列のサイズを取得
  scanf("%d", &n);
  
  // 行列のメモリ確保
  mA     = cvCreateMat(n, n, CV_32F);
  mA_inv = cvCreateMat(n, n, CV_32F);
  // 縦ベクトルのメモリ確保
  vX = cvCreateMat(n, 1, CV_32F);
  vY = cvCreateMat(n, 1, CV_32F);
  
  // 行列A の 各項を取得
  for(i=0; i < n; i++)
    for(j=0; j < n; j++)
    {
      scanf("%f", &f );
      cvmSet( mA, i, j, f );
    }

  // ベクトルY の 各項を取得
  for(i=0; i < n; i++)
  {
    scanf("%f", &f );
    cvmSet( vY, i, 0, f );
  }

  // 逆行列を求める。
  cvmInvert( mA, mA_inv );
  
  // ベクトルXを求める。
  cvmMul( mA_inv, vY, vX );

  // 出力する
  for(i=0; i < n; i++)
  {
    printf("%f", cvmGet( vX, i, 0 ) );
  }

  // おかたづけ
  cvReleaseMat( &mA     );
  cvReleaseMat( &mA_inv );
  cvReleaseMat( &vX );
  cvReleaseMat( &vY );

  return 0;
}

実は、もっと簡単に解ける。便利な関数がある。
  // 逆行列を求める。
  // cvmInvert( mA, mA_inv );
  
  // ベクトルXを求める。
  // cvmMul( mA_inv, vY, vX );

  // 一次方程式を解く
  cvSolve( mA, vY, vX, CV_LU );

行列Aが, rank 落ちしてたら、どうしよう? 最小二乗解を出してくれると嬉しいなー
  // 逆行列を求める。
  // cvmInvert( mA, mA_inv );
  
  // ベクトルXを求める。
  // cvmMul( mA_inv, vY, vX );

  // 一次方程式を解く
  // cvSolve( mA, vY, vX, CV_LU );

  // SVDを用いて最小二乗解を求める
  cvSolve( mA, vY, vX, CV_SVD );

余談
cvSolve を SV_SVD オプションで使った場合、
内部では cvSVD と cvSVBkSb を呼んでるだけ。
cvSVD には、CV_SVD_MODIFY_A オプションがあり、
これを使うと、行列Aの内容が破壊される代わりに速くなるらしい。
cvSolve 内では、このオプションは使ってない…