---
title: ?gttrf
description: "计算一般三对角矩阵A的LU分解。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0344.html
sourcePath: /source/zh/kunpengboostkithistory/2200/accel/kunpengaccel_kml_16_0344.html
indexId: 89fca2e620a4f0de1b370afa809ccb727d53ac129234713ec046ec541c546b2c74
---
# ?gttrf

计算一般三对角矩阵A的LU分解。

#### 接口定义

C Interface：

void sgttrf(const int *N, float *DL, float *D, float *DU, float *DU2, int *IPIV, int *INFO);

void dgttrf(const int *N, double *DL, double *D, double *DU, double *DU2, int *IPIV, int *INFO);

void cgttrf(const int *N, float _Complex *DL, float _Complex *D, float _Complex *DU, float _Complex *DU2, int *IPIV, int *INFO);

void zgttrf(const int *N, double _Complex *DL, double _Complex *D, double _Co mplex *DU, double _Complex *DU2, int *IPIV, int *INFO);

Fortran Interface：

SGTTRF(N,DL,D,DU,DU2,IPIV,INFO);

DGTTRF(N,DL,D,DU,DU2,IPIV,INFO);

CGTTRF(N,DL,D,DU,DU2,IPIV,INFO);

ZGTTRF(N,DL,D,DU,DU2,IPIV,INFO);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| N | 整型数 | 矩阵A的维数，N≥0。 | 输入 |
| DL | 在sgttrf中为单精度浮点型数组。 在dgttrf中为双精度浮点型数组。 在cgttrf中为单精度复数型数组。 在zgttrf中为双精度复数型数组。 | 输入时，为三对角矩阵A的次对角元素，维度为N\-1。 输出时，为L矩阵。 | 输入、输出 |
| D | 在sgttrf中为单精度浮点型数组。 在dgttrf中为双精度浮点型数组。 在cgttrf中为单精度复数型数组。 在zgttrf中为双精度复数型数组。 | 输入时，为三对角矩阵A的对角元素，维度为N。 输出时，为U的对角元素。 | 输入、输出 |
| DU | 在sgttrf中为单精度浮点型数组。 在dgttrf中为双精度浮点型数组。 在cgttrf中为单精度复数型数组。 在zgttrf中为双精度复数型数组。 | 输入时，为三对角矩阵A的超对角元素，维度为N\-1。 输出时，为U的第一超对角元素。 | 输入、输出 |
| DU2 | 在sgttrf中为单精度浮点型数组。 在dgttrf中为双精度浮点型数组。 在cgttrf中为单精度复数型数组。 在zgttrf中为双精度复数型数组。 | 输出时，为U的第二超对角元素。 | 输出 |
| IPIV | 整型数 | 转置数组。 | 输出 |
| INFO | 整型数 | 等于0：成功退出。 小于0：表示第\-INFO个参数非法。 大于0：表示U(INFO, INFO)为零，分解失败。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
const int n = 4;
double dl[] = {0.923077, 0.153846, 0.153846};
double d[] = {0.521739, 0.043478, 0.304348, 0.086957};
double du[] = {0.924528, 0.150943, 0.566038};
double du2[] = {0.986301, 0.397260};
double ipiv[4];
int info = 0;
dgttrf_(&n, dl, d, du, du2, ipiv, &info);
if (info != 0) {
printf("ERROR, info = %d\n", info);
}
/*
* Output:
*   d:    0.923077        0.899954        0.318932        -0.186088
*   dl:   0.565217        0.170949        0.482378
*   du:   0.043478        -0.085316       0.566038
*   du2:  0.150943        0.000000
*   ipiv: 2       2       3       4
*/
```

Fortran Interface：

```
PARAMETER (n = 4)
INTEGER :: info = 0
REAL(8) :: d(n)
REAL(8) :: dl(n-1)
REAL(8) :: du(n-1)
REAL(8) :: du2(n-2)
INTEGER :: ipiv(n)
DATA d / 0.521739, 0.043478, 0.304348, 0.086957 /
DATA dl / 0.923077, 0.153846, 0.153846 /
DATA du / 0.924528, 0.150943, 0.566038 /
DATA du2 / 0.986301, 0.397260 /
EXTERNAL DGTTRF
CALL DGTTRF(n, dl, d, du, du2, ipiv, info);
*
* Output:
*   d:    0.923077        0.899954        0.318932        -0.186088
*   dl:   0.565217        0.170949        0.482378
*   du:   0.043478        -0.085316       0.566038
*   du2:  0.150943        0.000000
*   ipiv: 2       2       3       4
```
