---
title: ?hemm
description: "计算矩阵A为埃尔米特矩阵乘法。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0058.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0058.html
indexId: fdc95bbba96d325f7e960c9c26fad2101f2e21f8efb6a4b6526ef7ae383bcdd474
---
# ?hemm

计算矩阵A为埃尔米特矩阵乘法。

或

alpha, beta为乘法系数， A为埃尔米特矩阵，B和C为m*n一般矩阵。

#### 接口定义

C interface：

void cblas_chemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const BLASINT M, const BLASINT N, const void *alpha, const void *A, const BLASINT lda, const void *B, const BLASINT ldb, const void *beta, void *C, const BLASINT ldc);

void cblas_zhemm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const BLASINT M, const BLASINT N, const void *alpha, const void *A, const BLASINT lda, const void *B, const BLASINT ldb, const void *beta, void *C, const BLASINT ldc);

Fortran interface：

CALL CHEMM(SIDE, UPLO, M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC)

CALL ZHEMM(SIDE, UPLO, M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC)


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| order | 枚举类型CBLAS\_ORDER | 表示矩阵是行主序或列主序。 | 输入 |
| Side | 枚举类型CBLAS\_SIDE | 埃尔米特矩阵A在矩阵B的左边还是右边。 | 输入 |
| Uplo | 枚举类型CBLAS\_UPLO | 表示使用矩阵A的上三角或下三角。 如果Uplo=CblasUpper，则使用A的上三角部分。 如果Uplo=CblasLower，则使用A的下三角部分。 | 输入 |
| M | 整型数 | 矩阵C的行。 A\*B为矩阵A的行。 B\*A为矩阵B的行。 | 输入 |
| N | 整型数 | 矩阵C的列。 A\*B为矩阵B的列。 B\*A为矩阵A的列。 | 输入 |
| alpha | 在chemm中，alpha为单精度复数类型。 在zhemm中，alpha为双精度复数类型。 | 乘法系数。 | 输入 |
| A | 在chemm中，A为单精度复数类型。 在zhemm中，A为双精度复数类型。 | 埃尔米特矩阵A(lda, ka)。 如果Side = CblasLeft，ka = m，否则ka = n。 | 输入 |
| lda | 整型数 | 如果Side = CblasLeft，lda至少max(1, m)，否则至少max(1, n)。 | 输入 |
| B | 在chemm中，B为单精度复数类型。 在zhemm中，B为双精度复数类型。 | 矩阵B(ldb, n)。 | 输入 |
| ldb | 整型数 | 矩阵为列存，ldb至少max(1, m)。 矩阵为行存，ldb至少max(1, n)。 | 输入 |
| beta | 在chemm中，beta为单精度复数类型。 在zhemm中，beta为双精度复数类型。 | 乘法系数。 | 输入 |
| C | 在chemm中，C为单精度复数类型。 在zhemm中，C为双精度复数类型。 | 矩阵C(ldc, n)。 | 输入/输出 |
| ldc | 整型数 | 矩阵为列存，ldc至少max(1, m)。 矩阵为行存，ldc至少max(1, n)。 | 输入 |


#### 依赖

#include "kblas.h"


#### 示例

C interface：

```
int m = 2, n = 3, lda = 4, ldb =3, ldc = 5;
float alpha[2] = {2.0, 3.0}, beta[2] = {1.0, 6.0};
/**
*
*                |  (2.0,  . )        .           .      |
*        A    =  |  (13.0, -2.0)  (2.0,  . )      .      |
*                | (-2.0, -6.0)  (2.0, 14.0)  (2.0,  . ) |
*                |      .             .           .      |
*
*                | (2.0, 2.0)  (-13.0, 12.0)   (3.0, 3.0)  |
*        B    =  | (2.0, 6.0)   (4.0, -5.0)  (-11.0, -4.0) |
*                |     .               .            .      |
*
*                |  (3.0, 6.0)    (-1.0, 6.0)  (1.0, 7.0)  |
*                | (-11.0, 8.0)   (1.0, 1.0)  (-14.0, 2.0) |
*        C    =  |       .             .            .      |
*                |       .             .            .      |
*                |       .             .            .      |
*
*/
float a[24] = {2.0, 0, 13.0, -2.0, -2.0, -6.0, 0, 0,
0, 0, 2.0, 0, 2.0, 14.0, 0, 0,
0, 0, 0, 0,2.0, 0, 0, 0};
float b[18] = {2.0, 2.0, 2.0, 6.0, 0, 0,
-13.0, 12.0, 4.0, -5.0, 0, 0,
3.0, 3.0, -11.0, -4.0, 0, 0};
float c[30] = {3.0,6.0,-11.0,8.0,0,0,0,0,0,0,
-1.0,6.0,1.0,1.0,0,0,0,0,0,0,
1.0,7.0,-14.0,2.0,0,0,0,0,0,0};
cblas_chemm(CblasColMajor,CblasRight,CblasLower, m, n, alpha, a, lda, b, ldb, beta, c, ldc);
/**
* Ouput C
*                | (-777.0,  -39.0)  (-423.0, 84.0)  (-437.0, 849.0) |
*                | (-10.0, 100.0)   (337.0,  -5.0)  (-52.0, -602.0)  |
*        C    =  |        .                .                .        |
*                |        .                .                .        |
*                |        .                .                .        |
*
*/
```

Fortran interface：

```
INTEGER :: M=2, N=3
INTEGER :: LDA=4, LDB=3, LDC=5
COMPLEX(4) :: ALPHA=(2.0, 3.0), BETA=(1.0, 6.0)
COMPLEX(4) :: A(4, 3), B(3, 3), C(5, 3)
DATA A/(2.0, 0), (13.0, -2.0), (-2.0, -6.0), (0, 0),
$       (0, 0), (2.0, 0), (2.0, 14.0), (0, 0),
$       (0, 0), (0, 0), (2.0, 0), (0, 0)/
DATA B/(2.0, 2.0), (2.0, 6.0), (0, 0),
$       (-13.0, 12.0), (4.0, -5.0), (0, 0),
$       (3.0, 3.0), (-11.0, -4.0), (0, 0)/
DATA C/(3.0, 6.0), (-11.0, 8.0), (0, 0), (0, 0), (0, 0),
$       (-1.0, 6.0), (1.0, 1.0), (0, 0), (0, 0), (0, 0),
$       (1.0, 7.0), (-14.0, 2.0), (0, 0), (0, 0), (0, 0)/
EXTERNAL CHEMM
CALL CHEMM('R', 'L', M, N, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
*     Ouput C
*                    | (-777.0,  -39.0)  (-423.0, 84.0)  (-437.0, 849.0) |
*                    | (-10.0, 100.0)   (337.0,  -5.0)  (-52.0, -602.0)  |
*            C    =  |        .                .                .        |
*                    |        .                .                .        |
*                    |        .                .                .        |
```
