#include <iostream>
#include <Eigen/Core>
#include <Eigen/Eigen>
#include <Eigen/Geometry>
#include<opencv2/opencv.hpp>
int test_opencv()
{
printf("\nSolve equation:AX=b\n\n");
cv::Mat A = (cv::Mat_<float>(4, 3) <<
2926.36, 2607.79, 1,
587.093, 2616.89, 1,
537.031, 250.311, 1,
1160.53, 1265.21, 1);// 4x3
cv::Mat B = (cv::Mat_<float>(4, 3) <<
320.389, 208.197, 1,
247.77, 209.726, 1,
242.809, 283.182, 1,
263.152, 253.715, 1);
cv::Mat X;
std::cout << "A=" << std::endl << A << std::endl;
std::cout << "B=" << std::endl << B << std::endl;
cv::solve(A, B, X, cv::DECOMP_SVD);
std::cout << "X=" << std::endl << X << std::endl;
cv::Mat a1 = (cv::Mat_<float>(1, 3) << 1864, 1273, 1);
cv::Mat b1 = a1*X;
std::cout << "b1=" << std::endl << b1 << std::endl;
std::cout << "真实值为:" << "283.265, 253.049, 1" << std::endl;
return 0;
}
void SVD()
{
double _a[12] = {2926.36, 2607.79, 1,
587.093, 2616.89, 1,
537.031, 250.311, 1,
1160.53, 1265.21, 1};
double _b[12] = {320.389, 208.197, 1,
247.77, 209.726, 1,
242.809, 283.182, 1,
263.152, 253.715, 1};
auto A = Eigen::Map<Eigen::MatrixXd>(_a, 3, 4).transpose();
auto B = Eigen::Map<Eigen::MatrixXd>(_b, 3, 4).transpose();
std::cout<< "A=\n"<<A<<std::endl<<std::endl;
std::cout<< "B=\n"<<B<<std::endl<<std::endl;
const Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
auto x = svd.solve(B);
std::cout<< "x=\n"<<x<<std::endl;
}
int main()
{
test_opencv();
std::cout<<"==================================="<<std::endl;
SVD();
return 1;
}
输出:
Solve equation:AX=b
A=
[2926.3601, 2607.79, 1;
587.09302, 2616.8899, 1;
537.03101, 250.311, 1;
1160.53, 1265.21, 1]
B=
[320.38901, 208.19701, 1;
247.77, 209.726, 1;
242.80901, 283.18201, 1;
263.15201, 253.715, 1]
X=
[0.031037141, -0.00071162981, 4.425834e-11;
0.0014961162, -0.031319518, -2.7852835e-11;
225.57526, 292.40707, 1.0000001]
b1=
[285.33304, 251.21085, 1.0000001]
真实值为:83.265, 253.049, 1
===================================
A=
2926.36 2607.79 1
587.093 2616.89 1
537.031 250.311 1
1160.53 1265.21 1
B=
320.389 208.197 1
247.77 209.726 1
242.809 283.182 1
263.152 253.715 1
x=
0.0310371 -0.000711644 2.71051e-20
0.00149613 -0.0313195 5.42101e-20
225.575 292.407 1