【发布时间】:2016-08-05 07:07:25
【问题描述】:
我正在尝试使用 GSL 获取相对较大矩阵 A^T 的零空间的基础。到目前为止,我一直在提取与消失的奇异值相对应的 SVD 的右奇异向量,但这对于我感兴趣的矩阵大小来说变得太慢了。
我知道零空间可以提取为A的QR分解中Q矩阵的最后m-r列,其中r是A的秩,但我不确定等级揭示分解如何工作。
这是我第一次尝试使用gsl_linalg_QR_decomp:
int m = 4;
int n = 3;
gsl_matrix* A = gsl_matrix_calloc(m,n);
gsl_matrix_set(A, 0,0, 3);gsl_matrix_set(A, 0,1, 6);gsl_matrix_set(A, 0,2, 1);
gsl_matrix_set(A, 1,0, 1);gsl_matrix_set(A, 1,1, 2);gsl_matrix_set(A, 1,2, 1);
gsl_matrix_set(A, 2,0, 1);gsl_matrix_set(A, 2,1, 2);gsl_matrix_set(A, 2,2, 1);
gsl_matrix_set(A, 3,0, 1);gsl_matrix_set(A, 3,1, 2);gsl_matrix_set(A, 3,2, 1);
std::cout<<"A:"<<endl;
for(int i=0;i<m;i++){ for(int j=0;j<n;j++) printf(" %5.2f",gsl_matrix_get(A,i,j)); std::cout<<std::endl;}
gsl_matrix* Q = gsl_matrix_alloc(m,m);
gsl_matrix* R = gsl_matrix_alloc(m,n);
gsl_vector* tau = gsl_vector_alloc(std::min(m,n));
gsl_linalg_QR_decomp(A, tau);
gsl_linalg_QR_unpack(A, tau, Q, R);
std::cout<<"Q:"<<endl;
for(int i=0;i<m;i++){ for(int j=0;j<m;j++) printf(" %5.2f",gsl_matrix_get(Q,i,j)); std::cout<<std::endl;}
std::cout<<"R:"<<endl;
for(int i=0;i<m;i++){ for(int j=0;j<n;j++) printf(" %5.2f",gsl_matrix_get(R,i,j)); std::cout<<std::endl;}
这个输出
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
但我不确定如何由此计算排名r。我的第二次尝试使用gsl_linalg_QRPT_decomp,将最后一部分替换为
gsl_vector* tau = gsl_vector_alloc(std::min(m,n));
gsl_permutation* perm = gsl_permutation_alloc(n);
gsl_vector* norm = gsl_vector_alloc(n);
int* sign = new int(); *sign = 1;
gsl_linalg_QRPT_decomp2(A, Q, R, tau, perm, sign, norm );
std::cout<<"Q:"<<endl;
for(int i=0;i<m;i++){ for(int j=0;j<m;j++) printf(" %5.2f",gsl_matrix_get(Q,i,j)); std::cout<<std::endl;}
std::cout<<"R:"<<endl;
for(int i=0;i<m;i++){ for(int j=0;j<n;j++) printf(" %5.2f",gsl_matrix_get(R,i,j)); std::cout<<std::endl;}
std::cout<<"Perm:"<<endl;
for(int i=0;i<n;i++) std::cout<<" "<<gsl_permutation_get(perm,i);
导致
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
在这里,我认为排名是R 中非零对角元素的数量,但我不确定要从Q 中提取哪些元素。我应该采取哪种方法?
【问题讨论】:
-
你的
A矩阵是否总是像这个例子一样高? -
我所追求的零空间的矩阵通常很宽,所以转置总是像这个例子一样高。
标签: c++ c matrix linear-algebra gsl