고유 라이브러리 (http://eigen.tuxfamily.org)를 사용하여 SVD 함수를 사용하여 Null Space 계산을 수행합니다. 나는 matlab에있는 "Null"함수에 대한 출력을 비교했고 다른 결과를 얻었다. 디버거와 그것을 통해 스테핑 및 MATLAB에서 Eigen 대 V 매트릭스에 의해 만들어진 V 매트릭스를 보면, 이상한 차이가 있습니다.Eigen을 사용한 Null Space Calculation이 잘못 되었습니까?
V 행렬의 왼쪽 단일 벡터 (아래 예에서 왼쪽 3 열)는 거의 동일하지만 부호가 전환됩니다. 오른쪽 특이 벡터 (공백 문자, 오른쪽 아래 3 열)는 전혀 비슷하지 않습니다.
어떤 이유일까요? SVD 기능을 잘못 사용하고 있습니까? 코드 및 예제 결과는 다음과 같습니다. 여기
코드이다 : 여기/* Create a matrix with the nessecary size */
MatrixXf A(inRows, inCols);
/* Populate the matrix from the input */
for (int i=0; i < inRows; i++)
{
for(int j=0; j < inCols; j++)
{
A(i,j) = input[i*inCols + j];
}
}
/* Do a singular value decomposition on the matrix */
JacobiSVD<MatrixXf> svd(A, Eigen::ComputeFullV);
/* Get the V matrix */
MatrixXf V((int)svd.matrixV().rows(), (int)svd.matrixV().cols());
V = svd.matrixV();
일부 예의 결과이다 : "입력"정상 C++ 배열
A (입력) =
-0.5059 -0.0075 -0.0121 -0.3526 -0.3528 -0.0128
-0.0067 0.4915 0.0235 -0.3503 0.3559 0.0211
0.0027 0.0010 -0.5015 0.0021 -0.0031 -0.4999
V (matlab에) =
0.3120 0.6304 0.1115 -0.5031 -0.4895 -0.0027
0.3628 -0.2761 0.5333 0.4955 -0.5121 -0.0018
0.5180 -0.1804 -0.4480 -0.0002 0.0000 -0.7060
-0.0353 0.6404 -0.2953 0.7081 0.0074 -0.0023
0.4859 0.2283 0.4623 0.0032 0.7057 0.0048
0.5151 -0.1775 -0.4489 0.0014 -0.0080 0.7082
V (고유) =
-0.3120 -0.6304 -0.1115 -0.5040 -0.4886 -0.0038
-0.3628 0.2761 -0.5333 0.4638 -0.4832 0.2432
-0.5180 0.1804 0.4480 0.1693 -0.1736 -0.6630
0.0353 -0.6404 0.2953 0.6878 0.0257 0.1666
-0.4859 -0.2283 -0.4623 0.0258 0.6851 -0.1677
-0.5151 0.1775 0.4489 -0.1689 0.1665 0.6674
감사합니다.
null 공간은 고유하지 않아야합니다. 주어진 행렬, Ax = 0 인 벡터 x의 집합 이니까요? – npulaski
@ user2221699 : 공백은 고유합니다. 그러나 그것을 묘사하는 여러 가지 방법이 있습니다. –
고마워, 나는 단일 대 이중 정밀도가 결과를 너무 많이 바꿀 것으로 예상하지 못했을 것이다. 이중 정밀도를 사용하도록 코드를 수정하고 결과가 어떻게 변경되는지 살펴 보겠습니다. – npulaski