如何使用GSL库计算C中2D数组的协方差矩阵



我有 2D 数组:

21 6 160 110 3.90 2.62 16.46 0 1 4 4
21 6 160 110 3.9 2.875 17.02 0 1 4 4
22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
18.7 8 360 175 3.15 3.44 17.02 0 0 3 2
18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
14.3 8 360 245 3.21 3.570 15.84 0 0 3 4
24.4 4 146.7 62 3.69 3.190 20 1 0 4 2
22.8 4 140.8 95 3.92 3.15 22.90 1 0 4 2
19.2 6 167.6 123 3,92 3.440 18.3 1 0 4 4

我想使用 GSL 库计算 C 语言中的协方差-方差矩阵。谁能指导我如何使用这个库?

我假设您有一个包含 55 行和 2 列的 2D 数组(正如您在上面提到的 110 个值的数据值)。首先,您必须将这些数据放在一个文件中,例如test.dat,(从这里下载),然后您可以在gsl_matrix中读取它并使用gsl_stats_covariance函数计算协方差矩阵,如下所示:

#include <stdio.h>
#include <gsl/gsl_statistics.h>
#include <gsl/gsl_matrix.h>
int main (void)
{
int i, j;
int rows = 55, col = 2;

gsl_matrix * m = gsl_matrix_alloc (rows, col);
gsl_matrix * C = gsl_matrix_alloc (col, col);

{
FILE * f = fopen ("test.dat", "rb");
gsl_matrix_fscanf (f, m);
fclose (f);
}

for (i = 0; i < m->size2; i++) 
{
for (j = 0; j < m->size2; j++) 
{
gsl_vector_view col1, col2;  
col1 = gsl_matrix_column (m, i);
col2 = gsl_matrix_column (m, j);
double cov = gsl_stats_covariance(col1.vector.data, col1.vector.stride, 
col2.vector.data, col2.vector.stride, 
col1.vector.size);
gsl_matrix_set (C, i, j, cov);
}
}

for (i = 0; i < C->size1; i++) 
{
for (j = 0; j < C->size2; j++) 
{
printf("%f ", gsl_matrix_get(C, i, j));
}
}
gsl_matrix_free (m);
gsl_matrix_free (C);

return 0;
}

您可以看到C矩阵已初始化为2x2矩阵,因为协方差矩阵是方阵。矩阵m的每一列都按gsl_vector_view进行切片,并在gsl_stats_covariance函数中使用。最后,打印协方差矩阵。

最新更新