GSL:如何在 GSL 中进行 LDLT 分解
GSL: how to get LDLT decomposition in GSL
我想从 LDLT 分解中得到矩阵 Q
的矩阵 l and d
。同样的结果scipy.linalg.ldl()
,这里是代码:
#include <gsl/gsl_math.h> #include <gsl/gsl_sf.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_errno.h>
int main() {
const int dim = 3;
double pars[3] = { 0, 0, 0 };
double Q[9] = {
2,-1,0,
-1,3,-1,
0,-1,4
};
int i=0,j=0;
// Gaussian Multivariate distribution
gsl_matrix *L = gsl_matrix_calloc(dim, dim);
gsl_vector *S = gsl_vector_calloc(dim);
gsl_permutation * perm = gsl_permutation_calloc(dim);
for(i=0;i<dim*dim;i++) L->data[i]=Q[i];
>> gsl_linalg_ldlt_decomp(L);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%.4f ", L->data[i*3+j]);
}
printf("\n");
}
printf("\n S=");
for(i=0;i<3;i++)
printf("%.4f ", S->data[i]);
printf("\n");
}
我的编译参数是gcc ldl.c -lm -llapack -lblas -lgsl
但是 returns;
ldl.c: In function ‘main’:
ldl.c:39:5: warning: implicit declaration of function ‘gsl_linalg_ldlt_decomp’; did you mean ‘gsl_linalg_PTLQ_decomp’? [-Wimplicit-function-declaration]
39 | gsl_linalg_ldlt_decomp(L);
| ^~~~~~~~~~~~~~~~~~~~~~
| gsl_linalg_PTLQ_decomp
/usr/bin/ld: /tmp/ccSWXMMb.o: in function `main':
ldl.c:(.text+0x170): undefined reference to `gsl_linalg_ldlt_decomp'
collect2: error: ld returned 1 exit status
为什么?我该怎么办?
也许通过 command-line 编译 GSL 程序的最佳方法是使用 GSL 本身提供的标志。它们可以通过
阅读
gsl-config
实用程序。
在您的情况下,按如下方式使用它(前提是您的 shell 可以正确处理反引号):
gcc ldl.c `gsl-config --libs`
如果没有,直接使用gsl-config --libs
的输出作为命令行参数。
总之,你的代码在我的系统上编译运行没有任何问题。
我想从 LDLT 分解中得到矩阵 Q
的矩阵 l and d
。同样的结果scipy.linalg.ldl()
,这里是代码:
#include <gsl/gsl_math.h> #include <gsl/gsl_sf.h>
#include <gsl/gsl_rng.h>
#include <gsl/gsl_randist.h>
#include <gsl/gsl_vector.h>
#include <gsl/gsl_matrix.h>
#include <gsl/gsl_blas.h>
#include <gsl/gsl_linalg.h>
#include <gsl/gsl_cdf.h>
#include <gsl/gsl_errno.h>
int main() {
const int dim = 3;
double pars[3] = { 0, 0, 0 };
double Q[9] = {
2,-1,0,
-1,3,-1,
0,-1,4
};
int i=0,j=0;
// Gaussian Multivariate distribution
gsl_matrix *L = gsl_matrix_calloc(dim, dim);
gsl_vector *S = gsl_vector_calloc(dim);
gsl_permutation * perm = gsl_permutation_calloc(dim);
for(i=0;i<dim*dim;i++) L->data[i]=Q[i];
>> gsl_linalg_ldlt_decomp(L);
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("%.4f ", L->data[i*3+j]);
}
printf("\n");
}
printf("\n S=");
for(i=0;i<3;i++)
printf("%.4f ", S->data[i]);
printf("\n");
}
我的编译参数是gcc ldl.c -lm -llapack -lblas -lgsl
但是 returns;
ldl.c: In function ‘main’:
ldl.c:39:5: warning: implicit declaration of function ‘gsl_linalg_ldlt_decomp’; did you mean ‘gsl_linalg_PTLQ_decomp’? [-Wimplicit-function-declaration]
39 | gsl_linalg_ldlt_decomp(L);
| ^~~~~~~~~~~~~~~~~~~~~~
| gsl_linalg_PTLQ_decomp
/usr/bin/ld: /tmp/ccSWXMMb.o: in function `main':
ldl.c:(.text+0x170): undefined reference to `gsl_linalg_ldlt_decomp'
collect2: error: ld returned 1 exit status
为什么?我该怎么办?
也许通过 command-line 编译 GSL 程序的最佳方法是使用 GSL 本身提供的标志。它们可以通过
阅读gsl-config
实用程序。 在您的情况下,按如下方式使用它(前提是您的 shell 可以正确处理反引号):
gcc ldl.c `gsl-config --libs`
如果没有,直接使用gsl-config --libs
的输出作为命令行参数。
总之,你的代码在我的系统上编译运行没有任何问题。