---
title: kml_csparse_?csrgemv
description: "矩阵与向量计算，稀疏矩阵采用CSR格式存储，具体执行操作如下："
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0084.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0084.html
indexId: e94314369cef31b8f2139820e699347789b918e00be173e9d85111e94c02de7374
---
# kml_csparse_?csrgemv

矩阵与向量计算，稀疏矩阵采用CSR格式存储，具体执行操作如下：

y = A * x或y = AT * x或y = AH * x，

其中，x和y为向量，A是的稀疏矩阵，采用CSR格式3数组存储。仅支持矩阵indx从0开始的矩阵。

#### 接口定义

C interface：

kml_sparse_status_t kml_csparse_scsrgemv(const kml_sparse_operation_t opt, const KML_INT m, const float *a, const KML_INT *ia, const KML_INT *ja, const float *x, float *y);

kml_sparse_status_t kml_csparse_dcsrgemv(const kml_sparse_operation_t opt, const KML_INT m, const double *a, const KML_INT *ia, const KML_INT *ja, const double *x, double *y);

kml_sparse_status_t kml_csparse_ccsrgemv(const kml_sparse_operation_t opt, const KML_INT m, const KML_Complex8 *a, const KML_INT *ia, const KML_INT *ja,

const KML_Complex8 *x, KML_Complex8 *y);

kml_sparse_status_t kml_csparse_zcsrgemv(const kml_sparse_operation_t opt, const KML_INT m, const KML_Complex16 *a ,const KML_INT *ia, const KML_INT *ja, const KML_Complex16 *x, KML_Complex16 *y);

Fortran interface：

RES = KML_CSPARSE_SCSRGEMV(OPT, M, A, IA, JA, X, Y);

RES = KML_CSPARSE_DCSRGEMV(OPT, M, A, IA, JA, X, Y);

RES = KML_CSPARSE_CCSRGEMV(OPT, M, A, IA, JA, X, Y);

RES = KML_CSPARSE_ZCSRGEMV(OPT, M, A, IA, JA, X, Y);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| opt | 枚举类型kml\_sparse\_operation\_t | 表示矩阵A的操作， 如果opt=KML\_SPARSE\_OPERATION\_NON\_TRANSPOSE，则。 如果opt=KML\_SPARSE\_OPERATION\_TRANSPOSE，则。 如果opt=KML\_SPARSE\_OPERATION\_CONJUGATE\_TRANSPOSE，则。 | 输入 |
| m | 整型数 | 表示A矩阵的行数和列数，取值范围为[1, MAX\_KML\_INT]。 | 输入 |
| a | 在c\_scsrgemv中，val是单精度浮点数组。 在c\_dcsrgemv中，val是双精度浮点数组。 在c\_ccsrgemv中，val是单精度复数数组。 在c\_zcsrgemv中，val是双精度复数数组。 | A矩阵中的非零元素。 | 输入 |
| ia | 整型数组 | 长度为m+1的向量。 ia[i]表示A矩阵第i行第一个非零元素在val数组中的索引。 | 输入 |
| ja | 整型数组 | ja[i]表示val数组中第i个元素在矩阵A中的列序号。 | 输入 |
| x | 在c\_scsrgemv中，x是单精度浮点数组。 在c\_dcsrgemv中，x是双精度浮点数组。 在c\_ccsrgemv中，x是单精度复数数组。 在c\_zcsrgemv中，x是双精度复数数组。 | 向量x。 | 输入 |
| y | 在c\_scsrgemv中，y是单精度浮点数组。 在c\_dcsrgemv中，y是双精度浮点数组。 在c\_ccsrgemv中，y是单精度复数数组。 在c\_zcsrgemv中，y是双精度复数数组。 | 向量y，更新后输出。 | 输入/输出 |


函数内部不对参数做完整校验，接口调用者需保证ia和ja内部元素不超出矩阵最大索引值。


#### 返回值

函数执行状态，枚举类型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 a[9] = {2, -3, 7, 1, -6, 8, -4, 5, 9};
KML_INT ja[9] = {0, 1, 3, 2, 3, 0, 2, 3, 0};
KML_INT ia[5] = {0, 3, 5, 8, 9};
float x[4] = {1, 3, -2, 5};
float y[4] = {-1, 1, 5, 3};
kml_sparse_status_t status = kml_csparse_scsrgemv(opt, m, a, ia, ja, x, y);
/*
*  Output Y:
*     28.000000   -32.000000    41.000000     9.000000
*
*/
```

Fortran interface：

```
INTEGER(C_INT) :: OPT = KML_SPARSE_OPERATION_NON_TRANSPOSE
INTEGER(C_INT) :: M = 4
REAL(C_FLOAT) :: A(9), X(4), Y(4)
INTEGER(C_INT) :: JA(9), IA(5)
INTEGER(C_INT) :: STATUS
DATA A/2, -3, 7, 1, -6, 8, -4, 5, 9/
DATA JA/0, 1, 3, 2, 3, 0, 2, 3, 0/
DATA IA/0, 3, 5, 8, 9/
DATA X/1, 3, -2, 5/
DATA Y/-1, 1, 5, 3/
STATUS = KML_CSPARSE_SCSRGEMV(OPT, M, A, IA, JA, X, Y)
!
!  OUTPUT Y:
!     28.000000   -32.000000    41.000000     9.000000
!
```
