2016-04-15 17 views
0

質問: この問題では、Asと呼ばれる行列のリストが与えられ、あなたの仕事はそれぞれのQR分解を見つけることです。修正されたGram Schmidtを使用したQR因子分解

qr_by_gram_schmidtの実装:この関数は行列Aを入力としてQR分解を計算し、QとRを返します。ここでA = QR、Q直交、Rは対角線以下です。

Aは、n≧m(すなわち列より多くの行)のn×m行列である。

修正されたGram-Schmidt手順を使用してこの機能を実装する必要があります。

INPUT:

とおり

Qsの:配列

OUTPUTのリストQの一覧と同じ順序で、qr_by_gram_schmidtによって出力行列。形状n×mの行列Aに対して、Qは、形状n×mを有するべきである。
Rs:qr_by_gram_schmidtが出力するR行列のリストで、Asと同じ順序で表示されます。

私はループを書き込むにはどうすればよい
import numpy as np 
def qr_by_gram_schmidt(A): 
m = np.shape(A)[0] 
n = np.shape(A)[1] 
Q = np.zeros((m, m)) 
R = np.zeros((n, n)) 
for j in xrange(n): 
    v = A[:,j] 
    for i in xrange(j): 
     R[i,j] = Q[:,i].T * A[:,j] 
     v = v.squeeze() - (R[i,j] * Q[:,i]) 
    R[j,j] = np.linalg.norm(v) 
    Q[:,j] = (v/R[j,j]).squeeze() 
return Q, R 

:形状の行列Aに対してN M×、Rは私が正しいと信じQR分解のコードを書かれているM

×形状mを有するべきですAsの各行列のQR分解を計算し、その順に格納するか?

編集:コードにもエラーがあります。デバッグに手伝っていただければ幸いです。

おかげ

答えて

0

私はそれをコンパイルするために(正確ではないかもしれない!)あなたのGSコードをチェックしますが、変更をしなければならなかったしませんでした。行列のリストを設定するだけで、2つの行列を作り、そのリストをループして関数を適用します。

NPとして輸入numpyの

def gs(A): 
    m = np.shape(A)[0] 
    n = np.shape(A)[1] 
    Q = np.zeros((m, m)) 
    R = np.zeros((n, n)) 
    print m,n,Q,R 
    for j in xrange(n): 
     v = A[:,j] 
     for i in xrange(j): 
      R[i,j] = np.dot(Q[:,i].T , A[:,j]) # I made an arbitrary change here!!! 
      v = v.squeeze() - (R[i,j] * Q[:,i]) 
     R[j,j] = np.linalg.norm(v) 
     Q[:,j] = (v/R[j,j]).squeeze() 
    return Q, R 

As= np.random.rand(2,3,3) # list of 2 (3x3) matrices 
print As 

for A in As: 
    print gs(A) 

出力:

[[[ 0.9599614 0.02213113 0.43343881] 
    [ 0.44202415 0.6816688 0.52] 
    [ 0.93098107 0.80528361 0.88473308]] 

[[ 0.41794678 0.10762796 0.42110659] 
    [ 0.89598082 0.81225543 0.52947205] 
    [ 0.0621515 0.59826789 0.14021332]]] 
(array([[ 0.68158915, -0.67980134, 0.27075149], 
     [ 0.31384477, 0.60583989, 0.73106736], 
     [ 0.66101262, 0.41331364, -0.626286 ]]), array([[ 1.40841649, 0.76132516, 1.15743793], 
     [ 0.  , 0.73077208, 0.60610414], 
     [ 0.  , 0.  , 0.20894464]])) 
(array([[ 0.42190511, -0.39510208, 0.81602109], 
     [ 0.90446656, 0.121136 , -0.40898205], 
     [ 0.06274013, 0.91061541, 0.40846452]]), array([[ 0.99061796, 0.81760207, 0.66535379], 
     [ 0.  , 0.6006613 , 0.02543844], 
     [ 0.  , 0.  , 0.18435946]])) 
+0

はあなたの助けをいただき、ありがとうございます。しかし、このコードでは正しい出力は得られません。その理由を理解できません。各反復でのQとRの形状が正しくない –

関連する問題