使用python在12 x 12矩阵上使用numpy.linalg.svd

时间:2013-02-16 10:50:46

标签: python numpy camera svd

我想在12 * 12矩阵上执行SVD。 numpy.linalg.svd工作正常。但是当我试图通过执行u * s * v来获得12 * 12矩阵A时,我不会回来。

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

请提出建议......

1 个答案:

答案 0 :(得分:3)

除了使用内置函数numpy.diag保存一些代码和时间外,您的问题似乎是*运算符。在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检查两个数组是否在数值上接近......