?trsm
三角矩阵方程求解,方程是以下一种形式:
,或。
,或,或。
alpha是乘法系数,X和B为m*n一般矩阵,A是三角矩阵。
接口定义
C interface:
void cblas_strsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const BLASINT M, const BLASINT N, const float alpha, const float *A, const BLASINT lda, float *B, const BLASINT ldb);
void cblas_dtrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const BLASINT M, const BLASINT N, const double alpha, const double *A, const BLASINT lda, double *B, const BLASINT ldb);
void cblas_ctrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const BLASINT M, const BLASINT N, const void *alpha, const void *A, const BLASINT lda, void *B, const BLASINT ldb);
void cblas_ztrsm(const enum CBLAS_ORDER Order, const enum CBLAS_SIDE Side, const enum CBLAS_UPLO Uplo, const enum CBLAS_TRANSPOSE TransA, const enum CBLAS_DIAG Diag, const BLASINT M, const BLASINT N, const void *alpha, const void *A, const BLASINT lda, void *B, const BLASINT ldb);
Fortran interface:
CALL STRSM(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CALL DTRSM(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CALL CTRSM(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
CALL ZTRSM(SIDE, UPLO, TRANSA, DIAG, M, N, ALPHA, A, LDA, B, LDB)
参数
参数名 |
类型 |
描述 |
输入/输出 |
---|---|---|---|
Order |
枚举类型CBLAS_ORDER |
表示矩阵是行主序或列主序。 |
输入 |
Side |
枚举类型CBLAS_SIDE |
表示op(A)在X的左边或右边。
|
输入 |
Uplo |
枚举类型CBLAS_UPLO |
表示使用矩阵A的上三角或下三角。
|
输入 |
TransA |
枚举类型CBLAS_TRANSPOSE |
矩阵A为常规矩阵,转置矩阵或共轭矩阵。
|
输入 |
Diag |
枚举类型CBLAS_DIAG |
表示A是否是单元三角阵。
|
输入 |
M |
整型数 |
矩阵B的行。 |
输入 |
N |
整型数 |
矩阵B的列。 |
输入 |
alpha |
|
乘法系数。 |
输入 |
A |
|
三角矩阵A(lda, N)。 |
输入 |
lda |
整型数 |
矩阵A中每列存储的地址距离,要求lda大于或等于max(1, N)。 |
输入 |
B |
|
矩阵B。 |
输入/输出 |
ldb |
整型数 |
矩阵为列存,ldb至少max(1, m),否则至少max(1, n)。 |
输入 |
依赖
#include "kblas.h"
示例
C interface:
int m = 3, n = 3, lda = 3, ldb = 3; float alpha = 1.0; /** * | 4.0 1.0 2.0 | * A = | . 1.0 3.0 | * | . . 1.0 | * * B = | 2.0 3.0 1.0| * | 11.0 -2.0 2.0| * | 1.0 1.0 6.0| */ float a[9] = {4.0, 0, 0, 1.0, 1.0, 0, 2.0, 3.0, 1.0}; float b[9] = {2.0, 11.0, 1.0, 3.0, -2.0, 1.0, 1.0, 2.0, 6.0}; cblas_strsm(CblasColMajor, CblasRight, CblasUpper, CblasNoTrans, CblasNonUnit, m, n, alpha, a, lda, b, ldb); /** * Output B * | 0.500000 2.500000 -7.500000| * B = | 2.750000 -4.750000 10.750000| * | 0.250000 0.750000 3.250000 | */
Fortran interface:
INTEGER :: M=3, N=3 INTEGER :: LDA=3, LDB=3 REAL(4) :: ALPHA=1.0 REAL(4) :: A(3, 3), B(3, 3) DATA A/4.0, 0, 0, 1.0, 1.0, 0, 2.0, 3.0, 1.0/ DATA B/2.0, 11.0, 1.0, 3.0, -2.0, 1.0, 1.0, 2.0, 6.0/ EXTERNAL STRSM CALL STRSM('R', 'U', 'N', 'N', M, N, ALPHA, A, LDA, B, LDB) * Output B * | 0.500000 2.500000 -7.500000| * B = | 2.750000 -4.750000 10.750000| * | 0.250000 0.750000 3.250000 |