最終更新: mikk_ni3_92 2007年12月10日(月) 17:39:52履歴
現在地 >> メニュー >> サンプルコード::OpenCV >> OpenCV::特異値分解
次の連立方程式を「特異値分解」を用いて解け
4x + y + 3z = 8
5x + y - z = 2
2x + 2y = 0
-3x +y + 5z = 5
※特異値分解
http://ja.wikipedia.org/wiki/%E7%89%B9%E7%95%B0%E5...
#include <cv.h>
#include <highgui.h>
#include <cstdio>
using namespace std;
double data_A[] =
{
4,1,3,
5,1,-1,
2,2,0, -3,1,5
};
double data_Y[]=
{
8,
2,
0,
5
};
int main( int argc, char **argv)
{
CvMat Matrix_A = cvMat (4,3, CV_64F, data_A);
CvMat Matrix_Y = cvMat (4,1, CV_64F, data_Y);// 縦4、横1
CvMat *Matrix_X;
Matrix_X = cvCreateMat(3, 1, CV_64F);
cvSolve( &Matrix_A, &Matrix_Y, Matrix_X, CV_SVD );
for(int i = 0;i<3;i++)
{
printf("answer[%d] = %f\n",i+1,Matrix_X->data.db[i]);
}
cvReleaseMat(&Matrix_X);
return 0;
}
答えは
x = 0.928934
y = -0.924220
z = 1.740029
となる。
行列でいうと
Y = AX
のX部分を求めることになる。
cvSolve()関数
http://opencv.jp/opencv/document/opencvref_cxcore_...
※直接関数の参照にいけないっぽい?
次の連立方程式を「特異値分解」を用いて解け
4x + y + 3z = 8
5x + y - z = 2
2x + 2y = 0
-3x +y + 5z = 5
※特異値分解
http://ja.wikipedia.org/wiki/%E7%89%B9%E7%95%B0%E5...
#include <cv.h>
#include <highgui.h>
#include <cstdio>
using namespace std;
double data_A[] =
{
4,1,3,
5,1,-1,
2,2,0, -3,1,5
};
double data_Y[]=
{
8,
2,
0,
5
};
int main( int argc, char **argv)
{
CvMat Matrix_A = cvMat (4,3, CV_64F, data_A);
CvMat Matrix_Y = cvMat (4,1, CV_64F, data_Y);// 縦4、横1
CvMat *Matrix_X;
Matrix_X = cvCreateMat(3, 1, CV_64F);
cvSolve( &Matrix_A, &Matrix_Y, Matrix_X, CV_SVD );
for(int i = 0;i<3;i++)
{
printf("answer[%d] = %f\n",i+1,Matrix_X->data.db[i]);
}
cvReleaseMat(&Matrix_X);
return 0;
}
答えは
x = 0.928934
y = -0.924220
z = 1.740029
となる。
行列でいうと
Y = AX
のX部分を求めることになる。
cvSolve()関数
http://opencv.jp/opencv/document/opencvref_cxcore_...
※直接関数の参照にいけないっぽい?