?syrk
矩阵乘矩阵秩k更新,矩阵C为对称矩阵。
即: 或 。
alpha,beta为乘法系数,C为n*n的对称矩阵;第一种情况矩阵A为n*k,第二种情况矩阵A为k*n一般矩阵。
接口定义
C interface:
void cblas_ssyrk(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 float *A, const BLASINT lda, const float beta, float *C, const BLASINT ldc);
void cblas_dsyrk(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 double *A, const BLASINT lda, const double beta, double *C, const BLASINT ldc);
void cblas_csyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const BLASINT N, const BLASINT K, const void *alpha, const void *A, const BLASINT lda, const void *beta, void *C, const BLASINT ldc);
void cblas_zsyrk(const enum CBLAS_ORDER Order, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE Trans, const BLASINT N, const BLASINT K, const void *alpha, const void *A, const BLASINT lda, const void *beta, void *C, const BLASINT ldc);
Fortran interface:
CALL SSYRK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
CALL DSYRK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
CALL CSYRK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
CALL ZSYRK(UPLO, TRANS, N, K, ALPHA, A, LDA, BETA, C, LDC)
参数
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
order |
枚举类型CBLAS_ORDER |
表示矩阵是行主序或列主序。 |
输入 |
Uplo |
枚举类型CBLAS_UPLO |
矩阵C存储方式。 |
输入 |
Trans |
枚举类型CBLAS_TRANSPOSE |
矩阵A和C为常规矩阵、转置矩阵或共轭矩阵。 |
输入 |
N |
整型数 |
矩阵C的主序长度。 |
输入 |
K |
整型数 |
当Trans = CblasNoTrans,K为矩阵A的列,否则为矩阵A的行。 |
输入 |
alpha |
|
乘法系数。 |
输入 |
A |
|
矩阵A(lda, ka)。 当Trans = CblasNoTrans, ka = k,否则ka = n。 |
输入 |
lda |
整型数 |
|
输入 |
beta |
|
乘法系数。 |
输入 |
C |
|
对称矩阵C。 |
输入/输出 |
ldc |
整型数 |
ldc至少max(1, n)。 |
输入 |
依赖
#include "kblas.h"
示例
C interface:
int n = 3, lda = 3, k = 2, ldc = 3; float alpha = 2.0, beta = 2.0; /** * | 4.0 1.0 | * A(3 * 2) = | 3.0 4.0 | * | . . | * * | 3.0 2.0 .| * C(3 * 3) = | -1.0 -6.0 .| * | . . .| */ float a[6] = {4.0, 3.0, 0, 1.0, 4.0, 0}; float c[9] = {3.0, -1.0, 0, 2.0, -6.0, 0, 0, 0, 0}; cblas_ssyrk(CblasColMajor, CblasUpper, CblasNoTrans, n, k, alpha, a, lda, beta, c, ldc); /** * Output C * | 40.0 36.0 .| * C(3 * 3) = | -1.0 38.0 .| * | . . .| * */
Fortran interface:
INTEGER :: N=3, K=2 INTEGER :: LDA=3, LDC=3 REAL(4) :: ALPHA=2.0, BETA=2.0 REAL(4) :: A(3, 2), C(3, 3) DATA A/4.0, 3.0, 0, 1.0, 4.0, 0/ DATA C/3.0, -1.0, 0, 2.0, -6.0, 0/ EXTERNAL SSYRK CALL SSYRK('U', 'N', N, K, ALPHA, A, LDA, BETA, C, LDC) * Output C * | 40.0 36.0 .| * C(3 * 3) = | 30.0 38.0 .| * | . . .|