解線性方程式4
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
float Array1[]={1,1,0,2,1,0,3,2,0};
float Array2[]={1,3,4};
int main()
{
CvMat *Matrix1=cvCreateMat(3,3,CV_32FC1);
CvMat *Matrix2=cvCreateMat(3,1,CV_32FC1);
CvMat *SolveSet=cvCreateMat(3,1,CV_32FC1);
cvSetData(Matrix1,Array1,Matrix1->step);
cvSetData(Matrix2,Array2,Matrix2->step);
cvSolve(Matrix1,Matrix2,SolveSet,CV_SVD);
PrintMatrix(SolveSet,SolveSet->rows,SolveSet->cols);
system("pause");
}
void PrintMatrix(CvMat *Matrix,int Rows,int Cols)
{
for(int i=0;i<Rows;i++)
{
for(int j=0;j<Cols;j++)
{
printf("%.2f ",cvGet2D(Matrix,i,j).val[0]);
}
printf("\n");
}
}
執行結果:
線性系統判斷
上面的程式是尾端補0,因為這個線性系統只存在兩個未知數,三個方程式,要給它弄成方陣,則只好假設有第三個未知數存在,但係數為0,而只要是需要補0的線性系統運算,全部都需要用CV_SVD來解,LU是無法解的.再來,下面是整欄補零的範例.
解線性方程式5
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
float Array1[]={1,1,1,1,2,0,0,0,0};
float Array2[]={4,6,0};
int main()
{
CvMat *Matrix1=cvCreateMat(3,3,CV_32FC1);
CvMat *Matrix2=cvCreateMat(3,1,CV_32FC1);
CvMat *SolveSet=cvCreateMat(3,1,CV_32FC1);
cvSetData(Matrix1,Array1,Matrix1->step);
cvSetData(Matrix2,Array2,Matrix2->step);
cvSolve(Matrix1,Matrix2,SolveSet,CV_SVD);
PrintMatrix(SolveSet,SolveSet->rows,SolveSet->cols);
system("pause");
}
void PrintMatrix(CvMat *Matrix,int Rows,int Cols)
{
for(int i=0;i<Rows;i++)
{
for(int j=0;j<Cols;j++)
{
printf("%.2f ",cvGet2D(Matrix,i,j).val[0]);
}
printf("\n");
}
}
執行結果:
線性系統判斷
這個線性系統是四個未知數,三個方程式,很顯然的是無限解,用SVD的方法的話就會任意給一個可行解,而至於cvSolve()的另外一個參數CV_SVD_SYM,則是線性系統對對稱係數矩陣的加速算法,也是跟前面相關的程式碼同樣的用法,這邊不再累述.
cvSolve()
為解線性方程式的函式,可以對唯一解,無解,無限解,而無限解的問題會給予一個答案,無解的問題則是用CV_SVD參數則可得到近似解,而無限解的問題則用cvSolve()參數可以得到可行解.第一個引數為CvMat係數矩陣,第二個引數為線性方程式的線性組合解,第三個引數為代數的解集合,第四個為解線性方程的參數輸入,分別為CV_LU,CV_SVD,CV_SVD_SYM,與求反矩陣的函式相同參數.
cvSolve(CvMat係數矩陣結構,CvMat結構線性組合解,CvMat結構代數解集合,輸入計算參數或代號)
0 意見:
張貼留言