【问题标题】:QR factorisation using modified Gram Schmidt使用改进的 Gram Schmidt 进行 QR 分解
【发布时间】:2016-08-06 18:44:59
【问题描述】:

问题: 对于这个问题,你会得到一个名为 As 的矩阵列表,你的工作是找到每个矩阵的 QR 分解。

实现 qr_by_gram_schmidt:此函数将矩阵 A 作为输入并计算 QR 分解,返回两个变量 Q 和 R,其中 A=QR,Q 正交,对角线下方 R 为零。

A 是一个 n×m 矩阵,n≥m(即行多于列)。

您应该使用修改后的 Gram-Schmidt 过程来实现此功能。

输入:

As:数组列表

输出:

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 分解并按该顺序存储它们?

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

谢谢

【问题讨论】:

    标签: python numpy orthogonal qr-decomposition


    【解决方案1】:

    我没有检查您的 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.88321052]
      [ 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]]))
    

    【讨论】:

    • 感谢您的帮助。但是这段代码没有给出正确的输出,我不明白为什么。每次迭代Q和R的形状都不正确
    猜你喜欢
    • 1970-01-01
    • 2015-10-08
    • 2011-03-15
    • 2018-07-14
    • 2012-08-28
    • 2017-03-08
    • 2021-02-09
    • 2020-07-28
    • 2012-06-22
    相关资源
    最近更新 更多