---
title: ?trsm
description: "三角矩阵方程求解。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_kml_16_0064.html
sourcePath: /source/zh/kunpengboostkithistory/240RC1/accel/kunpengaccel_kml_16_0064.html
indexId: 9ac85dc5e843a9567c51d3c2ee4e42d697c4bcad080c7980b87b567804abfe2576
---
# ?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的左边或右边。 如果Side=CblasLeft，则。 如果Side=CblasRight，则。 | 输入 |
| Uplo | 枚举类型CBLAS\_UPLO | 表示使用矩阵A的上三角或下三角。 如果Uplo=CblasUpper，则使用A的上三角部分。 如果Uplo=CblasLower，则使用A的下三角部分。 | 输入 |
| TransA | 枚举类型CBLAS\_TRANSPOSE | 矩阵A为常规矩阵，转置矩阵或共轭矩阵。 如果trans=CblasNoTrans，则。 如果trans=CblasTrans，则。 如果trans=CblasConjTrans，则。 | 输入 |
| Diag | 枚举类型CBLAS\_DIAG | 表示A是否是单元三角阵。 如果Diag=CblasUnit，则A是单元三角矩阵。 如果Diag=CblasNonUnit，则A不是单元三角矩阵。 | 输入 |
| M | 整型数 | 矩阵B的行。 | 输入 |
| N | 整型数 | 矩阵B的列。 | 输入 |
| alpha | 在strsm中是单精度浮点类型。 在dtrsm中是双精度浮点类型。 在ctrsm中是单精度复数类型。 在ztrsm中是双精度复数类型。 | 乘法系数。 | 输入 |
| A | 在strsm中是单精度浮点类型。 在dtrsm中是双精度浮点类型。 在ctrsm中是单精度复数类型。 在ztrsm中是双精度复数类型。 | 三角矩阵A(lda, N)。 | 输入 |
| lda | 整型数 | 矩阵A中每列存储的地址距离，要求lda大于或等于max(1, N)。 | 输入 |
| B | 在strsm中是单精度浮点类型。 在dtrsm中是双精度浮点类型。 在ctrsm中是单精度复数类型。 在ztrsm中是双精度复数类型。 | 矩阵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 |
```
