cvCalcCovarMatrix, cvInvert, cvMahalanobisの合わせ技でマハラノビス距離を求める.
#define MAX_DATA 500 #define DEMIENSION 3 int count; //データの個数 double distance; //マハラノビス距離 CvMat *data[MAX_DATA]; //クラス CvMat *result = cvCreateMat( DIMENSION, DIMENSION, CV_32F); //共分散行列 CvMat *inversecovar = cvCreateMat( DIMENSION, DIMENSION, CV_32F); //逆共分散行列 CvMat *average = cvCreateMat( DIMENSION, 1, CV_32F); //平均ベクトル CvMat *input = cvCreateMat( DIMENSION, 1, CV_32F); //比較するベクトル //クラスの読み込み //この場合dataの各要素は高さDIMENSION,幅1のベクトル count = ReadData( data, MAX_DATA); ReadInput( input); //↓クラスから共分散行列を計算 cvCalcCovarMatrix( data, count, result, average, CV_COVAR_NORMAL | CV_COVAR_SCALE); cvInvert( result, inversecovar, CV_SVD); //逆行列計算 distance = cvMahalanobis( average, input, inversecovar); //計算した逆共分散行列からマハラノビス距離を計算
#define DEMIENSION 3 int count = GetDataLength(); //データの個数 double distance; //マハラノビス距離 CvMat *data = cvCreateMat( DIMENSION, count, CV_32F); //クラス CvMat *result = cvCreateMat( DIMENSION, DIMENSION, CV_32F); //共分散行列 CvMat *inversecovar = cvCreateMat( DIMENSION, DIMENSION, CV_32F); //逆共分散行列 CvMat *average = cvCreateMat( DIMENSION, 1, CV_32F); //平均ベクトル CvMat *input = cvCreateMat( DIMENSION, 1, CV_32F); //比較するベクトル //クラスの読み込み //この場合dataの要素数は1,dataの幅(列数)だけデータが存在する ReadData( data); ReadInput( input); //↓クラスから共分散行列を計算 //CV_COVAR_COLS(ROWS)を指定しているので,countの指定は無効 cvCalcCovarMatrix( &data, 0, result, average, CV_COVAR_NORMAL | CV_COVAR_SCALE | CV_COVAR_COLS); cvInvert( result, inversecovar, CV_SVD); //逆行列計算 distance = cvMahalanobis( average, input, inversecovar); //計算した逆共分散行列からマハラノビス距離を計算