同次線形方程式の解

\(AX=0\)かつ\(X\neq0\)の時の解は行列\(A\)を特異値分解し、最小特異値に対応する右特異ベクトルとして得ることが出来る。
OpenCVにはこれを行ってくれる関数SVD::solveZが用意されている。 使い方は簡単で、以下のように入力の行列と結果を格納するための行列を引数として渡すことで計算結果を得ることが出来る。
このプログラムでは、以下の同次線形方程式を解いている。
\[\left\{ \begin{array}{@{}1} 2x-y+4z=0\\ -6x+3y-12z=0\\ 4x-2y+8z=0 \end{array} \right. \]

#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, char** argv)
{
 cv::Mat A = (cv::Mat_<double>(3, 3) << 2, -1, 4, -6, 3, -12, 4, -2, 8);
 cv::Mat X;

 cv::SVD::solveZ(A, X);

 std::cout << X << std::endl;

 return 0;
}
結果
[-0.2445084883048524;  -0.9623980449408547;  -0.1183452670827875]

コメント

このブログの人気の投稿

COLMAPでキャリブレーション済みのデータを使う

5点アルゴリズムによるカメラ位置・姿勢の推定

2D-3D対応からのカメラ位置・姿勢の推定