2016-04-15 155 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:

如:阵列

列表

OUTPUT:

Qs的:由qr_by_gram_schmidt的Q输出矩阵的列表,以相同的顺序以As。对于形状为n×m的矩阵A,Q应该具有n×m的形状。
Rs:qr_by_gram_schmidt输出的R矩阵的列表,顺序与As相同。对于形状n×m个的矩阵A,R应具有形状M×M

我所编写的代码的QR分解我相信这是正确的:

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 

我怎样写循环到计算As中每个矩阵的QR分解并按顺序存储它们?

编辑:代码也有一些错误。如果您能帮助我调试它,我将不胜感激。

感谢

回答

0

我没有检查你的代码GS,却不得不做出改变(可能是不正确的!),使其编译。您只需设置矩阵列表,我制作了其中的2个矩阵,然后遍历该列表并应用您的功能。

进口numpy的为NP

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的形状是不正确的 –