问题: 对于这个问题,您将获得一个名为As的矩阵列表,您的工作就是找到每个矩阵的QR因子分析。
实现qr_by_gram_schmidt:此函数将矩阵A作为输入并计算QR分解,返回两个变量Q和R,其中A = QR,Q正交,R 0低于对角线。
A是n×m矩阵,其中n≥m(即行多于列)。
您应该使用修改后的Gram-Schmidt程序实现此功能。
INPUT:
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分解并按顺序存储它们?
编辑:代码也有一些错误。如果你能帮助我调试它,我将不胜感激。
由于
答案 0 :(得分:0)
我没有检查你的GS代码,但是必须进行更改(可能不正确!)才能编译。你只需要设置一个矩阵列表,我制作了两个矩阵,然后循环遍历该列表并应用你的函数。
将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]]))