2012-05-16 1 views
0

난이 배열자바 SVD의 JAMA 잘못된 결과

double a[][] = {{1,1,1}, {0,1,1} , { 1,0,0} 
     ,{0,1,0},{1,0,0},{1,0,1},{1,1,1},{1,1,1},{1,0,1},{0,2,0},{0,1,1}}; 

을하고 난 SVD (단수 값 decomprestion), 를 얻으려면이 내가 JAMA 라이브러리를 사용하고 내가 가진

Matrix A = new Matrix(a); 
     SingularValueDecomposition s = A.svd(); 
     Matrix U = s.getU(); 
     Matrix S = s.getS(); 
     Matrix V = s.getV(); 

     Matrix K = U.times(S.times(V.inverse())); 
     System.out.println("A=\n" + A); 
     System.out.println("U=\n" + U); 
     System.out.println("S=\n" + S); 
     System.out.println("V=\n" + V); 
     System.out.println("K=\n" + K); 

코드입니다 이러한 결과는

U= 
0.42012156898152025 -0.07479925424066838 -0.04597243910578701 
0.29948675880470416 0.20009225506128975 0.4078276625537902 
0.12063481017681585 -0.27489150930195816 -0.4538001016595771 
0.15756100229407313 0.3046476172068067 -0.2006466962808193 
0.12063481017681585 -0.27489150930195816 -0.4538001016595771 
0.2625605666874469 -0.379446871447475 0.15467425717503247 
0.42012156898152014 -0.0747992542406683 -0.04597243910578692 
0.42012156898152014 -0.0747992542406683 -0.04597243910578692 
0.2625605666874469 -0.379446871447475 0.15467425717503247 
0.31512200458814627 0.6092952344136134 -0.4012933925616386 
0.29948675880470416 0.20009225506128975 0.4078276625537902 

S= 
4.098871971532176 0.0 0.0 
0.0 2.361570801317849 0.0 
0.0 0.0 1.2736686819384786 

V= 
0.49446664222485476 -0.6491757618976977 -0.5779909773443018 
0.6458223761096932 0.7194469174866516 -0.2555574131873014 
0.581735505399926 -0.24691489036406603 0.7749947346102383 

하지만 V가 잘못,이

같아야합니다

V = -0.49446664222485476 0.6491757618976977 -0.5779909773443018
-0.6458223761096932 0.7194469174866516 -0.2555574131873014
-0.581735505399926 0.24691489036406603 0.7749947346102383

정말이 포옹 실수가 USV를 multibluein 후 내가이 matirx을 가지고 있기 때문에, 단지 E-을 볼 수있다 16

K= 
1.0000000000000013 1.0000000000000004 1.000000000000001 
4.996003610813204E-16 1.0 0.9999999999999998 
1.0000000000000002 -3.885780586188048E-16 8.881784197001252E-16 
-1.1102230246251565E-16 1.0000000000000002 1.3877787807814457E-16 
1.0000000000000002 -3.885780586188048E-16 8.881784197001252E-16 
1.0000000000000004 -5.551115123125783E-16 1.0000000000000004 
1.0000000000000009 1.0000000000000002 1.0000000000000007 
1.0000000000000009 1.0000000000000002 1.0000000000000007 
1.0000000000000004 -5.551115123125783E-16 1.0000000000000004 
-2.220446049250313E-16 2.0000000000000004 2.7755575615628914E-16 
4.996003610813204E-16 1.0 0.9999999999999998 

좀 도와주세요, 내가 어떻게해야이 어디 잘못, JAMA가 잘못?!

답변

3

결과가 정확합니다. 행렬 K에서 1.0000000000000013과 4.996003610813204E-16과 같은 값은 각각 1과 0에 매우 가깝습니다. 부동 소수점 오류가 발생하여 번호가 약간 벗어났습니다. Matlab도 같은 일을합니다.