---
title: ?herk
description: "复数矩阵乘矩阵秩k更新，矩阵C为复数埃尔米特矩阵。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0653.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0653.html
indexId: 1c1af97bd3e463e3781a2718285869b22aeb6abaace5542da117b60581ee019d61
---
# ?herk

复数矩阵乘矩阵秩k更新，矩阵C为复数埃尔米特矩阵。

即： 或 。

alpha，beta为实乘法系数，C为n*n的埃尔米特矩阵；第一种情况矩阵A为n*k，第二种情况矩阵A为k*n。

#### 接口定义

C interface：

void cblas_cherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const BLASINT N, const BLASINT K, const float alpha, const void *A, const BLASINT lda, const float beta, void *C, const BLASINT ldc);

void cblas_zherk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const BLASINT N, const BLASINT K, const double alpha, const void *A, const BLASINT lda, const double beta, void *C, const BLASINT ldc);

Fortran interface：

CALL CHERK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)

CALL ZHERK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| order | 枚举类型CBLAS\_ORDER | 表示矩阵是行主序或列主序。 | 输入 |
| Uplo | 枚举类型CBLAS\_UPLO | 矩阵C存储方式。 | 输入 |
| Trans | 枚举类型CBLAS\_TRANSPOSE | 矩阵A为常规矩阵或共轭矩阵。 当Trans = CblasNoTrans， 。 当Trans = CblasConjTrans， 。 | 输入 |
| N | 整型数 | 矩阵C的阶数。 | 输入 |
| K | 整型数 | 当Trans = CblasNoTrans，矩阵A的列。 当Trans = CblasConjTrans，矩阵A的行。 | 输入 |
| alpha | 在cherk中是单精度实数类型。 在zherk中是双精度实数类型。 | 乘法系数。 | 输入 |
| A | 在cherk中是单精度复数类型。 在zherk中是双精度复数类型。 | 矩阵A(lda, ka)。 如果Trans = CblasNoTrans，ka = k，否则ka = n。 | 输入 |
| lda | 整型数 | 矩阵为列存，Trans = CblasNoTrans，lda至少max(1, n)，否则至少max(1, k)。 矩阵为行存，Trans = CblasNoTrans，lda至少max(1, k)，否则至少max(1, n)。 | 输入 |
| beta | 在cherk中是单精度实数类型。 在zherk中是双精度类型。 | 乘法系数。 | 输入 |
| C | 在cherk中是单精度复数类型。 在zherk中是双精度复数类型。 | 矩阵C(ldc, n)。 | 输入/输出 |
| ldc | 整型数 | ldc至少max(1, n)。 | 输入 |


#### 依赖

#include "kblas.h"


#### 示例

C interface：

```
int n = 2, lda = 2, k = 2, ldc = 2; 
    float alpha = 2.0, beta = 2.0; 
    /** 
     *                    | 4.0 1.0   1.0 2.0 | 
     *     A(2 * 2)    =  | 3.0 2.0   4.0 1.0 | 
     *  
     *                    |  3.0 1.0  2.0  1.0 | 
     *     C(2 * 2)    =  | -1.0 1.0  -6.0 2.0 | 
     */ 
    float a[8] = {4.0, 1.0, 3.0, 2.0, 1.0, 2.0, 4.0, 1.0}; 
    float c[8] = {3.0, 1.0, -1.0, 1.0, 2.0, 1.0, -6.0, 2.0}; 
 
    cblas_cherk(CblasColMajor, CblasUpper, CblasConjTrans, n, k, alpha, a, lda, beta, c, ldc); 
    /** 
     * Output C 
     *                   | (66.0, 0.0)  (44.0, 6.0) | 
     *    C(2 * 2)    =  | (-1.0, 1.0)  (32.0, 0.0) | 
     * 
     */
```

Fortran interface：

```
INTEGER :: N=2, K=2
INTEGER :: LDA=2, LDC=2
REAL(4) :: ALPHA=2.0
REAL(4) :: BETA=2.0
COMPLEX(4) :: A(2, 2), C(2, 2)
DATA A/(4.0, 1.0), (3.0, 2.0), (1.0, 2.0), (4.0, 1.0)/
DATA B/(2.0, 1.0), (11.0, 2.0), (3.0, 2.0), (-2.0, 1.0)/
DATA C/(3.0, 1.0), (-1.0, 1.0), (2.0, 1.0), (-6.0, 2.0)/
EXTERNAL CHERK
CALL CHERK('U', 'C', N, K, ALPHA, A, LDA, BETA, C, LDC)
*     Output C
*                    | (66.0, 0.0)  (44.0, 6.0) |
*     C(2 * 2)    =  | (-1.0, 1.0)  (32.0, 0.0) |
*
```
