---
title: kml_sparse_?csrmv
description: "矩阵与向量乘积，矩阵是CSR格式的稀疏矩阵。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0086.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0086.html
indexId: 1605b6d3c4dcb5bd64a504a88f5d7501a5eb14d7eb8eda74dd6eabae1499a68974
---
# 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
!
```
