---
title: kml_sparse_?cscmm
description: "矩阵与矩阵计算，其中一个稀疏矩阵采用CSC格式存储。具体执行操作如下："
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0045.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0045.html
indexId: ea5a299b05814c5091898632dee41c751924ed9530ae10af6f6bcfce8a749f4761
---
# kml_sparse_?cscmm

矩阵与矩阵计算，其中一个稀疏矩阵采用CSC格式存储。具体执行操作如下：

- C = alpha * A*B + beta * C
- C = alpha * AT* B + beta * C
- C = alpha * AH* B + beta * C

其中，B和C为稠密矩阵，A是采用CSC格式存储的mxk的稀疏矩阵。

layout与sparse matrix indexing的关系如表1所示。


**表1 layout与sparse matrix indexing关系**

| Sparse matrix indexing | Dense matrix layout |
| --- | --- |
| KML\_SPARSE\_INDEX\_BASE\_ZERO | KML\_SPARSE\_LAYOUT\_ROW\_MAJOR |
| KML\_SPARSE\_INDEX\_BASE\_ONE | KML\_SPARSE\_LAYOUT\_COLUMN\_MAJOR |


#### 接口定义

C interface：

kml_sparse_status_t kml_sparse_scscmm(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT n, 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 *b, const KML_INT ldb, const float beta , float *c , const KML_INT ldc);

kml_sparse_status_t kml_sparse_dcscmm(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT n, 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 *b, const KML_INT ldb, const double beta , double *c , const KML_INT ldc);

kml_sparse_status_t kml_sparse_ccscmm(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT n, 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 *b, const KML_INT ldb, const KML_Complex8 beta , KML_Complex8 *c , const KML_INT ldc);

kml_sparse_status_t kml_sparse_zcscmm(const kml_sparse_operation_t opt, const KML_INT m, const KML_INT n, 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 *b, const KML_INT ldb, const KML_Complex16 beta , KML_Complex16 *c , const KML_INT ldc);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| opt | 枚举类型kml\_sparse\_operation\_t | 表示是否转置： KML\_SPARSE\_OPERATION\_NON\_TRANSPOSE，C := alpha\*A\*B + beta\*C。 KML\_SPARSE\_OPERATION\_TRANSPOSE，C := alpha\*AT\*B + beta\*C。 KML\_SPARSE\_OPERATION\_CONJUGATE\_TRANSPOSE，C := alpha\*AH\*B + beta\*C。 | 输入 |
| m | 整型数 | 矩阵A的行数，取值范围为[1, MAX\_KML\_INT]。 | 输入 |
| n | 整型数 | 矩阵C的列数，取值范围为[1, MAX\_KML\_INT]。 | 输入 |
| k | 整型数 | 矩阵A的列数，取值范围为[1, MAX\_KML\_INT]。 | 输入 |
| alpha | 在scscmm中，alpha是单精度浮点类型。 在dcscmm中，alpha是双精度浮点类型。 在ccscmm中，alpha是单精度复数。 在zcscmm中，alpha是双精度复数。 | 标量alpha。 | 输入 |
| matdescra | char指针 | 矩阵的操作属性，具体参考表5 支持的matdescra可能取值说明。 | 输入 |
| val | 在scscmm中，val是单精度浮点数组。 在dcscmm中，val是双精度浮点数组。 在ccscmm中，val是单精度复数数组。 在zcscmm中，val是双精度复数数组。 | CSC格式中values数组，存储矩阵A的非零元素，长度为pntre[m\-1] \- pntrb[0]。 | 输入 |
| indx | 整型数组 | CSC格式中columns数组，用于表示矩阵A中非零元素所在的行索引。 | 输入 |
| pntrb | 整型数组 | 长度为m的数组，包含矩阵A的列索引，pntrb[i] \- pntrb[0]表示第i列第一个非零元素在val和indx数组内的下标。 | 输入 |
| pntre | 整型数组 | 长度为m的数组，包含矩阵A的列索引，pntre[i] \- pntrb[0]\-1表示第i列最后一个非零元素在val和indx数组内的下标。 | 输入 |
| b | 在scscmm中，b是单精度浮点数组。 在dcscmm中，b是双精度浮点数组。 在ccscmm中，b是单精度复数数组。 在zcscmm中，b是双精度复数数组。 | 矩阵B的value数组。 | 输入 |
| ldb | 整型数 | 矩阵indx从1开始时，矩阵B的主维度大小。 矩阵indx从0开始时，矩阵B的第二维度大小。 | 输入 |
| beta | 在scscmm中，beta是单精度浮点类型。 在dcscmm中，beta是双精度浮点类型。 在ccscmm中，beta是单精度复数。 在zcscmm中，beta是双精度复数。 | 标量beta。 | 输入 |
| c | 在scscmm中，c是单精度浮点数组。 在dcscmm中，c是双精度浮点数组。 在ccscmm中，c是单精度复数数组。 在zcscmm中，c是双精度复数数组。 | 矩阵C的value数组。 | 输入/输出 |
| ldc | 整型数 | 矩阵indx从1开始时，矩阵C的主维度大小。 矩阵indx从0开始时，矩阵C的第二维度大小。 | 输入 |


B矩阵参数约束如表2所示。


**表2 B矩阵参数约束**

| opt | B矩阵规模 | B矩阵数据排布 | 参数范围 |
| --- | --- | --- | --- |
| op(A) = A | k \* n | 行主序 | k \* ldbMAX\_KML\_INT |
| op(A) = A | k \* n | 列主序 | ldb \* n MAX\_KML\_INT |
| op(A) = AT或AH | m \* n | 行主序 | m \* ldbMAX\_KML\_INT |
| op(A) = AT或AH | m \* n | 列主序 | ldb \* n MAX\_KML\_INT |


C矩阵参数约束如表3所示。


**表3 C矩阵参数约束**

| opt | C矩阵规模 | C矩阵数据排布 | 参数范围 |
| --- | --- | --- | --- |
| op(A) = A | m \* n | 行主序 | m \* ldcMAX\_KML\_INT |
| op(A) = A | m \* n | 列主序 | ldc \* n MAX\_KML\_INT |
| op(A) = AT或AH | k \* n | 行主序 | k \* ldc MAX\_KML\_INT |
| op(A) = AT或AH | k \* n | 列主序 | ldc \* n MAX\_KML\_INT |


函数内部不对参数做完整校验，接口调用者需保证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 = 3; 
    KML_INT n = 3; 
    KML_INT k = 3; 
    float alpha = 1.0; 
    float beta = 1.0; 
    char *matdescra = "G00C"; //一般矩阵，基0索引 
    float val[4] = {8, 5, 2, 9}; 
    KML_INT indx[4] = {0, 1, 2, 0}; 
    KML_INT pntrb[3] = {0, 0, 1}; 
    KML_INT pntre[3] = {0, 1, 4}; 
    float b[9] = {1, 5, 7, 4, 7, 7, 3, 3, 7}; 
    float c[9] = {0, 8, 8, 0, 2, 8, 3, 5, 6}; 
    KML_INT ldb = 3; 
    KML_INT ldc = 3; 
    kml_sparse_status_t status = kml_sparse_scscmm(opt, m, n, k, alpha, matdescra, val, indx, pntrb, pntre, b, ldb, beta, c, ldc); 
     
    /* 
     *  Output c: 
     *    59.00  91.00  127.00   
15.00  17.00  43.00   
9.00  11.00  20.00 
     * 
     * */
```
