簡單行列式運算
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
float Array[]={1,3,1,3,4,2,2,1,4,2,2,3,3,1,4,1};
int main()
{
double Determinant;
CvMat *Matrix1=cvCreateMat(4,4,CV_32FC1);
cvSetData(Matrix1,Array,Matrix1->step);
printf("\nThe Matrix is:\n");
PrintMatrix(Matrix1,Matrix1->rows,Matrix1->cols);
printf("\nThe Determinant is:\n");
Determinant=cvDet(Matrix1);
printf("%.f\n",Determinant);
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");
}
}
執行結果:
這是一個4*4的矩陣,行列式的輸出為一個數據,當行列視為0則為不可逆矩陣(不具反矩陣),行列式也可以解線性系統的解,而用行列式解線性系統的方法叫做Cramer's rule,以下則由此方程式求x,y,z的解
行列式Cramer's rule
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
void PrintMatrix(CvMat *Matrix,int Rows,int Cols);
float Array[]={2,3,-1,3,5,2,1,-2,-3};
float Array1[]={1,3,-1,8,5,2,-1,-2,-3};
float Array2[]={2,1,-1,3,8,2,1,-1,-3};
float Array3[]={2,3,1,3,5,8,1,-2,-1};
int main()
{
double x,y,z;
double Determinant;
double Determinant1;
double Determinant2;
double Determinant3;
CvMat *Matrix=cvCreateMat(3,3,CV_32FC1);
CvMat *Matrix1=cvCreateMat(3,3,CV_32FC1);
CvMat *Matrix2=cvCreateMat(3,3,CV_32FC1);
CvMat *Matrix3=cvCreateMat(3,3,CV_32FC1);
cvSetData(Matrix,Array,Matrix->step);
cvSetData(Matrix1,Array1,Matrix1->step);
cvSetData(Matrix2,Array2,Matrix2->step);
cvSetData(Matrix3,Array3,Matrix3->step);
Determinant=cvDet(Matrix);
Determinant1=cvDet(Matrix1);
Determinant2=cvDet(Matrix2);
Determinant3=cvDet(Matrix3);
x=Determinant1/Determinant;
y=Determinant2/Determinant;
z=Determinant3/Determinant;
printf("The equation solution is :\n");
printf("x = %.f\n",x);
printf("y = %.f\n",y);
printf("z = %.f\n",z);
system("pause");
}
執行結果:
在這裡Matrix為解集合的線性組合,而Matrix1為將線性組合的第一列與解集合做交換,Matrix2為第二列與解集合做交換,Matrix3為第三列與解集合做交換,在將Matrix,Matrix1,Matrix2,Matrix3解行列式,而x,y,z的解就分別是x=det(Matrix1)/det(Matrix),y=det(Matrix2)/det(Matrix),z=det(Matrix3)/det(Matrix).
Cramer's rule在使用上執行效率並不會很好,一般都是以高斯消去法來解聯立的線性系統.
cvDet()
計算CvMat資料結構的行列式值,回傳結果為double型別資料型態,但是在線性代數的定義上行列式的值為純量(Scale)
double cvDet(CvMat資料結構)
0 意見:
張貼留言