Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于GSL的QR分解的零空间基_C++_C_Matrix_Linear Algebra_Gsl - Fatal编程技术网

C++ 基于GSL的QR分解的零空间基

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);

我试图用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);
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×3
A
,“零空间”将由三维向量组成,而
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×3
A
,“零空间”将由三维向量组成,而
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.   ]])