2013-03-29 5 views
2

고유 라이브러리 (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 

감사합니다.

답변

4

첫째, 공간에 대한 정규직 기준을 형성하는 방법은 여러 가지가 있습니다. 예를 들어 [1 0; 0 1]1/sqrt(2) * [ 1 -1; 1 1 ]은 모두 동일한 2D 유클리드 공간을 나타냅니다. 따라서 우리는 반드시 동일한 기본 집합을 선택하는 두 개의 대체 구현을 기대하지는 않습니다.

> Vmat = Vmat(:,4:end); 
> Veig = Veig(:,4:end); 
> Vmat' * V_mat 

ans = 

1.0000e+00 8.8800e-06 -1.4120e-05 
8.8800e-06 9.9999e-01 -5.1830e-05 
-1.4120e-05 -5.1830e-05 1.0000e+00 

> Veig' * Veig 

ans = 

1.0001e+00 -1.4050e-05 2.4200e-06 
-1.4050e-05 1.0001e+00 -4.8310e-05 
2.4200e-06 -4.8310e-05 1.0000e+00 

> A * Vmat 

ans = 

7.7612e-17 7.8916e-17 0.0000e+00 
-4.1193e-17 4.8139e-17 0.0000e+00 
6.6136e-18 -6.0715e-18 1.1102e-16 

> A * Veig 

ans = 

-1.2030e-05 1.1000e-05 -6.0000e-07 
-4.8600e-06 3.8750e-05 1.5490e-05 
-3.4400e-06 -4.5210e-05 -3.6090e-05 

그래서 이들은 모두 정규직 교 기저 세트이며, 그들은 모두 기본적으로 널 공간을 위치 : 우리가 오른쪽을 각각의 경우에 세 개의 열을 가지고가는 경우에

, 우리는 다음 배운다. 그러나 Eigen 경우의 오류 수준은 단 정밀도로 수행되었다는 사실과 일치하는 것으로 보입니다. 배정도로 다시 시도해보십시오. 결과가 이번에 어떻게 비교되는지보십시오. (이것이 분명히 도움이 될 것이라고 주장하지는 않습니다. 단지 이것이 Matlab과 확실한 차이가 있다는 것입니다.)

+0

null 공간은 고유하지 않아야합니다. 주어진 행렬, Ax = 0 인 벡터 x의 집합 이니까요? – npulaski

+2

@ user2221699 : 공백은 고유합니다. 그러나 그것을 묘사하는 여러 가지 방법이 있습니다. –

+0

고마워, 나는 단일 대 이중 정밀도가 결과를 너무 많이 바꿀 것으로 예상하지 못했을 것이다. 이중 정밀도를 사용하도록 코드를 수정하고 결과가 어떻게 변경되는지 살펴 보겠습니다. – npulaski