2013-02-16 119 views
2

我想在12 * 12矩陣上執行SVD。 numpy.linalg.svd工作正常。但是當我嘗試通過執行u * s * v來獲取12 * 12矩陣A時,我沒有回到它。使用Python 12×12矩陣使用numpy.linalg.svd

import cv2 

import numpy as np 

import scipy as sp 

from scipy import linalg, matrix 

a_matrix=np.zeros((12,12)) 

with open('/home/koustav/Documents/ComputerVision/A2/codes/Points0.txt','r') as f: 

    for (j,line) in enumerate(f): 
     i=2*j 
     if(i%2==0): 
     values=np.array(map(np.double,line.strip('\n').split(' '))) 
     a_matrix[i,4]=-values[2] 
     a_matrix[i,5]=-values[3] 
     a_matrix[i,6]=-values[4] 
     a_matrix[i,7]=-1 
     a_matrix[i,8]=values[1]*values[2] 
     a_matrix[i,9]=values[1]*values[3] 
     a_matrix[i,10]=values[1]*values[4] 
     a_matrix[i,11]=values[1]*1 

     a_matrix[i+1,0]=values[2] 
     a_matrix[i+1,1]=values[3] 
     a_matrix[i+1,2]=values[4] 
     a_matrix[i+1,3]=1 
     a_matrix[i+1,8]=-values[0]*values[2] 
     a_matrix[i+1,9]=-values[0]*values[3] 
     a_matrix[i+1,10]=-values[0]*values[4] 
     a_matrix[i+1,11]=-values[0]*1 


s_matrix=np.zeros((12,12)) 

u, s, v = np.linalg.svd(a_matrix,full_matrices=1) 

k=0 

while (k<12): 

    s_matrix[k,k]=s[k] 

    k+=1 
print u 

print '\n' 

print s_matrix 

print '\n' 

print (u*s_matrix*v) 

這些是我已經使用了兩點:

285.12 14.91 2.06655 -0.807071 -6.06083 

243.92 100.51 2.23268 -0.100774 -5.63975 

234.7 176.3 2.40898 0.230613 -5.10977 

-126.59 -152.59 -1.72487 4.96296 -10.4564 

-173.32 -164.64 -2.51852 4.95202 -10.3569 

264.81 28.03 2.07303 -0.554853 -6.05747 

請通過內置的功能,如numpy.diag建議的東西...

+0

打印時,你的elementwise miltiplying他們在最後。看看文檔中的示例:http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.svd.html – 2013-02-16 11:03:32

回答

3

除了從節約一些代碼和時間,您的問題似乎是運營商*。在numpy中,您必須使用numpy.dot進行矩陣乘法。請參見下面的代碼的工作示例...

In [16]: import numpy as np 

In [17]: A = np.arange(15).reshape(5,3) 

In [18]: A 
Out[18]: 
array([[ 0, 1, 2], 
     [ 3, 4, 5], 
     [ 6, 7, 8], 
     [ 9, 10, 11], 
     [12, 13, 14]]) 


In [19]: u, s, v = np.linalg.svd(A) 

In [20]: S = np.diag(s) 

In [21]: S = np.vstack([S, np.zeros((2,3)) ]) 

In [22]: #fill in zeros to get the right shape 

In [23]: np.allclose(A, np.dot(u, np.dot(S,v))) 
Out[23]: True 

numpy.allclose檢查兩個數組是否在數值上接近...

+0

謝謝Jan。有效 。 – user1996613 2013-02-17 06:39:25