矩阵 QR 分解算法
Matrix QR factorization algorithms
我一直在尝试逐步可视化 QR 分解,但没有得到预期的结果。我是 numpy 的新手,所以如果有专家能发现我可能遗漏的东西,那就太好了:
import numpy as np
from scipy import linalg
A = np.array([[12, -51, 4],
[6, 167, -68],
[-4, 24, -41]])
#Givens
v = np.array([12, 6])
vnorm = np.linalg.norm(v)
W_12 = np.array([[v[0]/vnorm, v[1]/vnorm, 0],
[-v[1]/vnorm, v[0]/vnorm, 0],
[0, 0, 1]])
W_12 * A #this should return a matrix such that [1,0] = 0
#gram-schmidt
A[:,0]
v = np.linalg.norm(A[:,0]) * np.array([1, 0, 0])
u = (A[:,0] - v)
u = u / np.linalg.norm(u)
W1 = np.eye(3) - 2 * np.outer(u, u.transpose())
W1 * A #this matrix's first column should look like [a, 0, 0]
任何有助于澄清这一事实的信息,即这个中间结果没有显示它们应该被广泛接受的特性
NumPy 旨在处理同构多维数组,它并不是专门的 线性代数 包。因此,根据设计,*
运算符是 元素级 乘法,而不是矩阵乘积。
如果想得到矩阵乘积,有以下几种方式:
您可以创建 np.matrix
个对象,而不是 np.ndarray
个对象,*
运算符 是 矩阵乘积。
也可以使用@
运算符,如W_12 @ A
,就是矩阵乘积。
或者您可以使用 np.dot(W_12, A)
或 W_12.dot(A)
,计算点积。
其中任何一项,使用您提供的数据,returns 吉文斯旋转的以下内容:
>>> np.dot(W_12 A)[1, 0]
-2.2204460492503131e-16
这是 Gram-Schmidt 步骤:
>>> (W1.dot(A))[:, 0]
array([ 1.40000000e+01, -4.44089210e-16, 4.44089210e-16])
我一直在尝试逐步可视化 QR 分解,但没有得到预期的结果。我是 numpy 的新手,所以如果有专家能发现我可能遗漏的东西,那就太好了:
import numpy as np
from scipy import linalg
A = np.array([[12, -51, 4],
[6, 167, -68],
[-4, 24, -41]])
#Givens
v = np.array([12, 6])
vnorm = np.linalg.norm(v)
W_12 = np.array([[v[0]/vnorm, v[1]/vnorm, 0],
[-v[1]/vnorm, v[0]/vnorm, 0],
[0, 0, 1]])
W_12 * A #this should return a matrix such that [1,0] = 0
#gram-schmidt
A[:,0]
v = np.linalg.norm(A[:,0]) * np.array([1, 0, 0])
u = (A[:,0] - v)
u = u / np.linalg.norm(u)
W1 = np.eye(3) - 2 * np.outer(u, u.transpose())
W1 * A #this matrix's first column should look like [a, 0, 0]
任何有助于澄清这一事实的信息,即这个中间结果没有显示它们应该被广泛接受的特性
NumPy 旨在处理同构多维数组,它并不是专门的 线性代数 包。因此,根据设计,*
运算符是 元素级 乘法,而不是矩阵乘积。
如果想得到矩阵乘积,有以下几种方式:
您可以创建
np.matrix
个对象,而不是np.ndarray
个对象,*
运算符 是 矩阵乘积。也可以使用
@
运算符,如W_12 @ A
,就是矩阵乘积。或者您可以使用
np.dot(W_12, A)
或W_12.dot(A)
,计算点积。
其中任何一项,使用您提供的数据,returns 吉文斯旋转的以下内容:
>>> np.dot(W_12 A)[1, 0]
-2.2204460492503131e-16
这是 Gram-Schmidt 步骤:
>>> (W1.dot(A))[:, 0]
array([ 1.40000000e+01, -4.44089210e-16, 4.44089210e-16])