中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

kml_sparse_?csrmv

矩阵与向量乘积,矩阵是CSR格式的稀疏矩阵。

y = alpha * A * x + beta * y或y = alpha * AT * x + beta * y或y = alpha * AH * x + beta * y

其中,alpha和beta是缩放系数,x和y是向量,A是CSR格式的稀疏向量。

接口定义

C interface:

kml_sparse_status_t kml_sparse_scsrmv(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT k, const float alpha, const char *matdescra, const float *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const float *x, const float beta, float *y);

kml_sparse_status_t kml_sparse_dcsrmv(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT k, const double alpha, const char *matdescra, const double *val, const KML_INT *indx, const KML_INT *pntrb, const KML_INT *pntre, const double *x, const double beta, double *y);

kml_sparse_status_t kml_sparse_ccsrmv(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT k, 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, const KML_Complex8 beta, KML_Complex8 *y);

kml_sparse_status_t kml_sparse_zcsrmv(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT k, 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, const KML_Complex16 beta, KML_Complex16 *y);

Fortran interface:

RES = KML_SPARSE_SCSRMV(OPT, M, K, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, BETA, Y);

RES = KML_SPARSE_DCSRMV(OPT, M, K, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, BETA, Y);

RES = KML_SPARSE_CCSRMV(OPT, M, K, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, BETA, Y);

RES = KML_SPARSE_ZCSRMV(OPT, M, K, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, BETA, Y);

参数

参数名

类型

描述

输入/输出

opt

枚举类型kml_sparse_operation_t

表示矩阵A的操作。

  • 如果opt=KML_SPARSE_OPERATION_NON_TRANSPOSE,则y = alpha * A * x + beta * y。
  • 如果opt=KML_SPARSE_OPERATION_TRANSPOSE,则y = alpha * AT * x + beta * y。
  • 如果opt=KML_SPARSE_OPERATION_CONJUGATE_TRANSPOSE,则y = alpha * AH * x + beta * y。

输入

m

整型数

表示A矩阵的行数,取值范围为[1, MAX_KML_INT]。

输入

k

整型数

表示A矩阵的列数,取值范围为[1, MAX_KML_INT]。

输入

alpha

  • 在scsrmv中,alpha是单精度浮点类型。
  • 在dcsrmv中,alpha是双精度浮点类型。
  • 在ccsrmv中,alpha是单精度复数。
  • 在zcsrmv中,alpha是双精度复数。

表示系数。

输入

matdescra

char指针

矩阵的操作属性,具体参考matdescra说明。

输入

val

  • 在scsrmv中,val是单精度浮点数组。
  • 在dcsrmv中,val是双精度浮点数组。
  • 在ccsrmv中,val是单精度复数数组。
  • 在zcsrmv中,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

  • 在scsrmv中,x是单精度浮点数组。
  • 在dcsrmv中,x是双精度浮点数组。
  • 在ccsrmv中,x是单精度复数数组。
  • 在zcsrmv中,x是双精度复数数组。

向量x。

输入

beta

  • 在scsrmv中,beta是单精度浮点类型。
  • 在dcsrmv中,beta是双精度浮点类型。
  • 在ccsrmv中,beta是单精度复数。
  • 在zcsrmv中,beta是双精度复数。

表示系数。

输入

y

  • 在scsrmv中,y是单精度浮点数组。
  • 在dcsrmv中,y是双精度浮点数组。
  • 在ccsrmv中,y是单精度复数数组。
  • 在zcsrmv中,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; 
    KML_INT k = 4; 
    float alpha = 0.5; 
    float beta = 1.2; 
    char *matdescra = "G00F"; //一般矩阵,基1索引 
    float val[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9}; 
    KML_INT indx[9] = {1, 2, 4, 3, 4, 1, 3, 4, 1}; 
    KML_INT pntrb[4] = {1, 4, 6, 9}; 
    KML_INT pntre[4] = {4, 6, 9, 10}; 
    float x[4] = {1, 3, -2, 5}; 
    float y[4] = {-1, 1, 5, 3}; 
    kml_sparse_status_t status = kml_sparse_scsrmv(opt, m, k, alpha, matdescra, val, indx, pntrb, pntre, x, beta, y); 
    /* 
     *  Output Y: 
     *     12.80  -14.80  26.50   8.10 
     * 
     */

Fortran interface:

    INTEGER(C_INT) :: OPT = KML_SPARSE_OPERATION_NON_TRANSPOSE 
    INTEGER(C_INT) :: M = 4 
    INTEGER(C_INT) :: K = 4 
    REAL(C_FLOAT) :: ALPHA = 0.5 
    REAL(C_FLOAT) :: BETA = 1.2 
    CHARACTER(KIND=C_CHAR, LEN=4) :: MATDESCRA = "G00F" !一般矩阵,基1索引 
    REAL(C_FLOAT) :: VAL(9), X(4), Y(4)  
    INTEGER(C_INT) INDX(9), PNTRB(4), PNTRE(4) 
    INTEGER(C_INT) :: STATUS 
    DATA INDX/1, 2, 4, 3, 4, 1, 3, 4, 1/ 
    DATA PNTRB/1, 4, 6, 9/  
    DATA PNTRE/4, 6, 9, 10/ 
    DATA VAL /2, -3, 7, 1, -6, 8, -4, 5, 9/ 
    DATA X/1, 3, -2, 5/ 
    DATA Y/-1, 1, 5, 3/ 
    STATUS = KML_SPARSE_SCSRMV(OPT, M, K, ALPHA, MATDESCRA, VAL, INDX, PNTRB, PNTRE, X, BETA, Y) 
    ! 
    !  OUTPUT Y: 
    !     12.80  -14.80  26.50   8.10 
    !