C++ 基于GSL的QR分解的零空间基
我试图用GSL得到一个相对较大的矩阵,C++ 基于GSL的QR分解的零空间基,c++,c,matrix,linear-algebra,gsl,C++,C,Matrix,Linear Algebra,Gsl,我试图用GSL得到一个相对较大的矩阵,a^T的零空间的基础。到目前为止,我一直在提取SVD的右奇异向量,对应于消失的奇异值,但是对于我感兴趣的矩阵的大小来说,这变得太慢了 我知道在A的QR分解中,可以将空空间提取为Q矩阵的最后一列m-r,其中r是A的秩,但我不确定秩显示分解是如何工作的 这是我第一次尝试使用: intm=4; int n=3; gsl_矩阵*A=gsl_矩阵(m,n); gsl_矩阵_集(A,0,0,3);gsl_矩阵_集(A,0,1,6);gsl_矩阵_集(A,0,2,1);
a^T
的零空间的基础。到目前为止,我一直在提取SVD的右奇异向量,对应于消失的奇异值,但是对于我感兴趣的矩阵的大小来说,这变得太慢了
我知道在A
的QR分解中,可以将空空间提取为Q矩阵的最后一列m-r
,其中r
是A
的秩,但我不确定秩显示分解是如何工作的
这是我第一次尝试使用:
intm=4;
int n=3;
gsl_矩阵*A=gsl_矩阵(m,n);
gsl_矩阵_集(A,0,0,3);gsl_矩阵_集(A,0,1,6);gsl_矩阵_集(A,0,2,1);
gsl_矩阵_集(A,1,0,1);gsl_矩阵_集(A,1,1,2);gsl_矩阵_集(A,1,2,1);
gsl_矩阵_集(A,2,0,1);gsl_矩阵_集(A,2,1,2);gsl_矩阵_集(A,2,2,1);
gsl_矩阵_集(A,3,0,1);gsl_矩阵_集(A,3,1,2);gsl_矩阵_集(A,3,2,1);
std::cout对于4×3A
,“零空间”将由三维向量组成,而A
上的QR分解仅提供四维向量。(当然,您可以将其推广到大小为M
×N
的A
,其中M
N
)
因此,对A
的转置进行QR分解,其Q
现在是3×3
在IPython中使用Python/Numpy绘制流程(抱歉,我似乎不知道如何使用PyGSL调用gsl\u linalg\u QR\u decomp
):
[16]中的:将numpy作为np导入
在[17]中:A=np.数组([3.0,6,1],[1.0,2,1],[1.0,2,1],[1.0,2,1])
在[18]:Q,R=np.linalg.qr(A.T)#中,对于4×3A
,“零空间”将由三维向量组成,而A
上的qr分解只提供了四维向量。(当然,您可以将其推广到大小为M
×N
的A
,其中M
N
)
因此,对A
的转置进行QR分解,其Q
现在是3×3
在IPython中使用Python/Numpy绘制流程(抱歉,我似乎不知道如何使用PyGSL调用gsl\u linalg\u QR\u decomp
):
[16]中的:将numpy作为np导入
在[17]中:A=np.数组([3.0,6,1],[1.0,2,1],[1.0,2,1],[1.0,2,1])
在[18]:Q,R=np.linalg.qr(A.T)#你的A
矩阵是否总是高的,如本例所示?我所追求的零空间的矩阵通常是宽的,因此转置总是高的,如本例所示。你的A
矩阵是否总是高的,如本例所示?我所追求的零空间的矩阵通常是宽的,所以转置总是和这个例子一样高。啊,从我的描述中不清楚我是在A^t的零空间后面,这就是为什么我要取A的QR。如果你转置你会得到np.diag(R)=>数组([-6.93,0.00,-0.82])
,你是说这足以得出秩是2(rank=len([d代表np.diag(R)中的d)如果d>0.0001])
)啊,从我的描述中不清楚我是在追求A^t的零空间,这就是为什么我要取A的QR。如果你转置你会得到np.diag(R)=>数组([-6.93,0.00,-0.82])
,你是说这足以得出秩是2(rank=len([d代表np.diag(R)中的d,如果d>0.0001])
)
A:
3.00 6.00 1.00
1.00 2.00 1.00
1.00 2.00 1.00
1.00 2.00 1.00
Q:
-0.87 -0.29 0.41 -0.00
-0.29 0.96 0.06 -0.00
-0.29 -0.04 -0.64 -0.71
-0.29 -0.04 -0.64 0.71
R:
-3.46 -6.93 -1.73
0.00 0.00 0.58
0.00 0.00 -0.82
0.00 0.00 0.00
Q:
-0.87 0.50 0.00 0.00
-0.29 -0.50 -0.58 -0.58
-0.29 -0.50 0.79 -0.21
-0.29 -0.50 -0.21 0.79
R:
-6.93 -1.73 -3.46
0.00 -1.00 0.00
0.00 0.00 0.00
0.00 0.00 0.00
Perm:
1 2 0
In [16]: import numpy as np
In [17]: A = np.array([[3.0, 6, 1], [1.0, 2, 1], [1.0, 2, 1], [1.0, 2, 1]])
In [18]: Q, R = np.linalg.qr(A.T) # <---- A.T means transpose(A)
In [19]: np.diag(R)
Out[19]: array([ -6.78232998e+00, 6.59380473e-01, 2.50010468e-17])
In [20]: np.round(Q * 1000) / 1000 # <---- Q to 3 decimal places
Out[20]:
array([[-0.442, -0.066, -0.894],
[-0.885, -0.132, 0.447],
[-0.147, 0.989, 0. ]])