tool_spmat.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. /**
  2. * @file tool_spmat.h
  3. * @brief 稀疏矩阵的函数原型。此模块是稀疏线性代数模块的一部分。
  4. * This is function prototypes for sparse matrix. This module serves as part of sparse linear algebra module.
  5. * @version 0.1
  6. * @date 2021-09-17
  7. *
  8. * @copyright Copyright (c) 2021
  9. *
  10. */
  11. #ifndef __TOOL_SPMAT_H__
  12. #define __TOOL_SPMAT_H__
  13. #include "csocp_config.h"
  14. /*
  15. * Creating and deleting methods
  16. */
  17. /** 创建新稀疏矩阵 Create a new sparse matrix */
  18. c_spmat *c_spmat_create(c_int nRow, /**< 行数 Number of rows */
  19. c_int nCol, /**< 列数 Number of columns */
  20. c_int nElem /**< 非零元素数量 Number of elements */
  21. );
  22. /** 从已有数据中生成稀疏矩阵 Generate a sparse matrix from existing arrays */
  23. c_spmat *c_spmat_generate(c_int nRow, /**< 行数 Number of rows */
  24. c_int nCol, /**< 列数 Number of columns */
  25. c_int nElem, /**< 非零元素数量 Number of elements */
  26. c_int *colBeg, /**< CSC矩阵的begin指针 Begin pointer of column-wise matrix */
  27. c_int *colIdx, /**< CSC矩阵的index指针 Index pointer of column-wise matrix */
  28. c_real *colElem /**< CSC矩阵的element指针 Element pointer of column-wise matrix */
  29. );
  30. /** 将数据加载到系数矩阵中 Load data to sparse matrix */
  31. void c_spmat_loaddata(c_spmat *dstMat, /**< 需要加载数据的稀疏矩阵 Matrix to load data */
  32. c_int *colBeg, /**< CSC矩阵的begin指针 Begin pointer of column-wise matrix */
  33. c_int *colIdx, /**< CSC矩阵的index指针 Index pointer of column-wise matrix */
  34. c_real *colElem /**< CSC矩阵的element指针 Element pointer of column-wise matrix */
  35. );
  36. /** 析构一个稀疏矩阵 Free a sparse matrix */
  37. void c_spmat_free(c_spmat **p_Mat);
  38. /*
  39. * Advanced operation methods
  40. */
  41. /** 寻找行/列中的最大值 Find maximal values for rows/columns of sparse matrix */
  42. void c_spmat_findmax(c_spmat *srcMat, /**< 输入:稀疏矩阵 Input sparse matrix */
  43. c_real *dstVal, /**< 输出:值 Output values */
  44. c_int ifCol /**< 行/列 Whether to compute for rows/columns */
  45. );
  46. /** 计算行/列的平方和 Calculate sum of squares for rows/columns of sparse matrix */
  47. void c_spmat_sumsquare(c_spmat *srcMat, /**< 输入:稀疏矩阵Input sparse matrix */
  48. c_real *dstVal, /**< 输出:值Output values */
  49. c_int ifCol /**< 行/列 Whether to compute for rows/columns */
  50. );
  51. /** 缩放行/列 Scale rows/columns of sparse matrix */
  52. void c_spmat_setscale(c_spmat *srcMat, /**< 输入:稀疏矩阵 Input sparse matrix */
  53. c_real *srcFactor, /**< 输入:缩放系数 Input scaling factors */
  54. c_int ifCol /**< 行/列 Whether to compute for rows/columns */
  55. );
  56. /** 矩阵转置 Transpose a sparse matrix and return transposed sparse matrix */
  57. c_spmat *c_spmat_transpose(c_spmat *srcMat /**< 输入:稀疏矩阵 Input sparse matrix */
  58. );
  59. /** 对称矩阵置换(仅保存上三角部分)Permutes a symmetric matrix with only the upper triangular part stored */
  60. void c_spmat_permute(c_spmat *srcMat, /**< 输入:对称稀疏矩阵 Input sparse matrix */
  61. c_int *srcInvP, /**< 输入:逆转置 Input inverse permutation */
  62. c_spmat *dstMat, /**< 输出:上三角矩阵 Output upper triangular sparse matrix */
  63. c_int *srcDstMap /**< Index map between input and output */
  64. );
  65. /** 稀疏矩阵-向量乘法 Sparse matrix-vector multiplication */
  66. void c_spmat_matvec(c_spmat *srcMat, /**< 输入:稀疏矩阵 Input sparse matrix */
  67. c_real *srcX, /**< 输入:稠密向量 Input dense vector */
  68. c_real *srcDstY, /**< 输入输出:稠密向量 Output + Input dense vector */
  69. c_int nSign, /**< 是否进行加/减 Whether to do summation or subtraction */
  70. c_int ifNewVec /**< 是否使用新向量Y存储结果 Whether to use vector Y for output only */
  71. );
  72. /** 稀疏矩阵转置-向量乘法 Sparse matrix-transpose-vector multiplication */
  73. void c_spmat_matvecm(c_spmat *srcMat, /**< 输入:稀疏矩阵 Input sparse matrix */
  74. c_real *srcX, /**< 输入:稠密向量 Input dense vector */
  75. c_real *srcDstY, /**< 输入输出:稠密向量 Output + Input dense vector */
  76. c_int ifNewVec, /**< 是否使用新向量Y存储结果 Whether to use vector Y for output only */
  77. c_int ifSkipDiag /**< 是否跳过对角元素 Whether to skip diagonal elements */
  78. );
  79. /*
  80. * Auxiliary methods
  81. */
  82. /** 存储稀疏矩阵 调试功能 Dump sparse matrix to file for debug purpose */
  83. void c_spmat_dump(c_spmat *srcMat, /**< 输入:稀疏矩阵 Input sparse matrix */
  84. char *matFile /**< 存储稀疏矩阵文件 Dumped matrix file */
  85. );
  86. /** 获取稀疏矩阵的内存需求量 Get memory requirment of sparse matrix */
  87. c_int c_spmat_getmem(c_int nCol, /**< 列数 Number of columns */
  88. c_int nElem /**< 非零元素数量 Number of elements */
  89. );
  90. #endif