现在的位置: 首页 > 综合 > 正文

gsl数据类型之矩阵

2013年10月08日 ⁄ 综合 ⁄ 共 3322字 ⁄ 字号 评论关闭

http://blog.csdn.net/insectC/article/details/5305239

       如果在程序中需要调用gsl中的矩阵类型,首先需要声明#include<gsl/gsl_matrix.h>

       与向量一样,gsl中的矩阵同样也构建在数据块之上。其声明如下:

  1. [gsl_matrix_double.h]  
  2. ......  
  3. typedef struct   
  4. {  
  5.   size_t size1;//矩阵的行数  
  6.   size_t size2;//矩阵的列数  
  7.   size_t tda;//矩阵的实际列数  
  8.   double * data;//实际上就是block->data  
  9.   gsl_block * block;//矩阵相应的数据块  
  10.   int owner;//所有者标识符  
  11. } gsl_matrix;  
  12. ......  

 

需要仔细说明的是矩阵中tda的意义。举一个矩阵的例子:

1  2  3  X  X  X

4  5  6  X  X  X

      这个矩阵中"X"表示未使用的内存单元。则在这个矩阵中,size1=2,size2=3,而实际列数tda=6。这样的规定与c语言中二维数组的存储格式为行优先有关。因此gsl_matrix中block->data内存块的实际大小为size1*tda*sizeof(double)。 gsl在矩阵中还设置了一个size2参数正是体现了内容与描述分离的思想。

      类似于向量,gsl也提供了各种关于矩阵内存分配的函数:

  1. [gsl_matrix_double.h]  
  2. ......  
  3. gsl_matrix *   
  4. gsl_matrix_alloc (const size_t n1, const size_t n2);  
  5. gsl_matrix *   
  6. gsl_matrix_calloc (const size_t n1, const size_t n2);  
  7. gsl_matrix *   
  8. gsl_matrix_alloc_from_block (gsl_block * b,   
  9.                                    const size_t offset,   
  10.                                    const size_t n1,   
  11.                                    const size_t n2,   
  12.                                    const size_t d2);  
  13. gsl_matrix *   
  14. gsl_matrix_alloc_from_matrix (gsl_matrix * m,  
  15.                                     const size_t k1,   
  16.                                     const size_t k2,  
  17.                                     const size_t n1,   
  18.                                     const size_t n2);  
  19. gsl_vector *   
  20. gsl_vector_alloc_row_from_matrix (gsl_matrix * m,  
  21.                                         const size_t i);  
  22. gsl_vector *   
  23. gsl_vector_alloc_col_from_matrix (gsl_matrix * m,  
  24.                                         const size_t j);  
  25. void gsl_matrix_free (gsl_matrix * m);  
  26. ......  

 

      这些函数的作用容易从函数名中理解。需要注意的是其中alloc与calloc函数创建的矩阵中owner=1,而alloc_from_block与alloc_from_matrix中owner=0。如同vector 中的owner一样,不同的取值将影响gsl_matrix_free的动作。即如果owner=1,则销毁矩阵时将同时销毁矩阵所对应的数据块,而如果owner=0,则销毁矩阵的同时不会销毁对应的数据块。

      如果需要访问矩阵中的第i+1行,j+1列的元素,可以使用下面的两个函数:

  1. [gsl_matrix_double.h]  
  2. ......  
  3. double   gsl_matrix_get(const gsl_matrix * m, const size_t i, const size_t j);  
  4. void    gsl_matrix_set(gsl_matrix * m, const size_t i, const size_t j, const double x);  
  5. ......  

      当然,gsl也允许以向量为单位访问矩阵元素。下面的两个函数将把给定向量中的元素拷贝到矩阵中行或列元素:

  1. [gsl_matrix_double.h]  
  2. ......  
  3. int gsl_matrix_set_row(gsl_matrix * m, const size_t i, const gsl_vector * v);  
  4. int gsl_matrix_set_col(gsl_matrix * m, const size_t j, const gsl_vector * v);  
  5. ......  

    或者,反过来,亦可将矩阵中某行或者某列拷贝到给定的向量中:

   

  1. [gsl_matrix_double.h]  
  2. ......  
  3. int gsl_matrix_get_row(gsl_vector * v, const gsl_matrix * m, const size_t i);  
  4. int gsl_matrix_get_col(gsl_vector * v, const gsl_matrix * m, const size_t j);  
  5. ......  

此外,我们还可利用如下的两个函数直接根据矩阵中的数据创建新的向量:

   

  1. [gsl_matrix_double.h]  
  2. ......  
  3. gsl_vector *   
  4. gsl_vector_alloc_row_from_matrix (gsl_matrix * m,  
  5.                                         const size_t i);  
  6. gsl_vector *   
  7. gsl_vector_alloc_col_from_matrix (gsl_matrix * m,  
  8.                                         const size_t j);  
  9. ......  

 

      值得注意的是,与前面两个函数的拷贝方法不同,以这种方式创建的向量中的数据只是对矩阵中相应数据的一种引用,这一点在函数的源代码中得到验证:

  1. [getset_source.c]  
  2. ......  
  3. TYPE (gsl_vector) *  
  4. FUNCTION (gsl_vector, alloc_row_from_matrix) (TYPE(gsl_matrix) * m,  
  5.                                               const size_t i)  
  6. {  

抱歉!评论已关闭.