kml_sparse_?csrsv
求解三角矩阵方程组计算,稀疏矩阵采用CSR格式存储,具体执行操作如下:
A * y = alpha * x或AT * y = alpha * x或AH * y = alpha * x
其中,x和y为向量,A是m * m的稀疏矩阵,采用CSR格式存储。矩阵A中的给定行的非零元素的存储顺序必须与行中显示的顺序相同(从左到右)。
接口定义
C interface:
kml_sparse_status_t kml_sparse_scsrsv(const kml_sparse_operation_t opt, const KML_INT m, const float alpha, const char *matdescra, const float *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const float *x, float *y);
kml_sparse_status_t kml_sparse_dcsrsv(const kml_sparse_operation_t opt, const KML_INT m, const double alpha, const char *matdescra, const double *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const double *x, double *y);
kml_sparse_status_t kml_sparse_ccsrsv(const kml_sparse_operation_t opt, const KML_INT m, const KML_Complex8 alpha, const char *matdescra, const KML_Complex8 *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const KML_Complex8 *x, KML_Complex8 *y);
kml_sparse_status_t kml_sparse_zcsrsv(const kml_sparse_operation_t opt, const KML_INT m, const KML_Complex16 alpha, const char *matdescra, const KML_Complex16 *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const KML_Complex16 *x, KML_Complex16 *y);
Fortran interface:
RES = KML_SPARSE_SCSRSV(OPT, M, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, Y);
RES = KML_SPARSE_DCSRSV(OPT, M, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, Y);
RES = KML_SPARSE_CCSRSV(OPT, M, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, Y);
RES = KML_SPARSE_ZCSRSV(OPT, M, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, Y);
参数
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
opt |
枚举类型kml_sparse_operation_t |
表示矩阵A的操作。
|
输入 |
m |
整型数 |
表示A矩阵的行数,取值范围为[1, MAX_KML_INT]。 |
输入 |
alpha |
|
表示系数。 |
输入 |
matdescra |
char指针 |
矩阵的操作属性,具体参考matdescra说明。 |
输入 |
val |
|
A矩阵中的非零元素。 |
输入 |
indx |
整型数组 |
indx[i]表示val数组中第i个元素在矩阵A中的列序号。 |
输入 |
pntrb |
整型数组 |
长度为m的数组,包含矩阵A的行索引,pntrb[i] - pntrb[0]表示第i行第一个非零元素在val和indx数组内的下标。 |
输入 |
pntre |
整型数组 |
长度为m的数组,包含矩阵A的行索引,pntre[i] - pntrb[0]-1表示第i行最后一个非零元素在val和indx数组内的下标。 |
输入 |
x |
|
向量x。 |
输入 |
y |
|
向量y, 更新后输出。 |
输入/输出 |
函数内部不对参数做完整校验,接口调用者需保证pntrb和pntre内部元素不超出矩阵最大索引值。
返回值
函数执行状态,枚举类型kml_sparse_status_t。
依赖
C: "kspblas.h"
Fortran: "kspblas.f03"
示例
C interface:
kml_sparse_operation_t opt = KML_SPARSE_OPERATION_NON_TRANSPOSE; KML_INT m = 4; float alpha = 1.0; char *matdescra = "TLNF"; //一般矩阵,基1索引 float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9}; KML_INT indx[9] = {1, 2, 4, 2, 4, 1, 3, 1, 4}; KML_INT pntrb[4] = {1, 4, 6, 8}; KML_INT pntre[4] = {4, 6, 8, 10}; float x[4] = {1, 3, -2, 5}; float y[4] = {0, 0, 0, 0}; kml_sparse_status_t status = kml_sparse_scsrsv(opt, m, alpha, matdescra, val, indx, pntrb, pntre, x, y); /* * Output Y: * 0.500000 3.000000 1.500000 0.277778 * */
Fortran interface:
INTEGER(C_INT) :: OPT = KML_SPARSE_OPERATION_NON_TRANSPOSE INTEGER(C_INT) :: M = 4 REAL(C_FLOAT) :: ALPHA = 1.0 CHARACTER(KIND=C_CHAR, LEN=4) :: MATDESCRA = "TLNF" !一般矩阵,基1索引 REAL(C_FLOAT) :: VAL(9), X(4), Y(4) INTEGER(C_INT) :: INDX(9), PNTRB(4),PNTRE(4) INTEGER(C_INT) :: STATUS DATA VAL /2, -3, 7, 1, -6, 8, -4, 5, 9/ DATA INDX /1, 2, 4, 2, 4, 1, 3, 1, 4/ DATA PNTRB /1, 4, 6, 8/ DATA PNTRE/4, 6, 8, 10/ DATA X/1, 3, -2, 5/ DATA Y/0, 0, 0, 0/ STATUS = KML_SPARSE_SCSRSV(OPT, M, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, Y); ! ! OUTPUT Y: ! 0.500000 3.000000 1.500000 0.277778 !