---
title: ?getrf
description: "计算矩阵A的LU分解，允许行交换（partial pivoting）。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_kml_16_0209.html
sourcePath: /source/zh/kunpengboostkithistory/240RC2/accel/kunpengaccel_kml_16_0209.html
indexId: c8389207178744562217d506a05222d84aed21cb914236f3ed433bf8f4fe0a2976
---
# ?getrf

计算矩阵A的LU分解，允许行交换（partial pivoting）。

分解结果为A=PLU，其中P为置换矩阵、L为下三角矩阵或下阶梯矩阵且对角线为1，U是上三角矩阵或上阶梯矩阵。

#### 接口定义

C Interface：

void sgetrf_(const int *m, const int *n, float *a, const int *lda, int *ipiv, int *info);

void dgetrf_(const int *m, const int *n, double *a, const int *lda, int *ipiv, int *info);

void cgetrf_(const int *m, const int *n, float _Complex *a, const int *lda, int *ipiv, int *info);

void zgetrf_(const int *m, const int *n, double _Complex *a, const int *lda, int *ipiv, int *info);

Fortran Interface：

SGETRF(m, n, a, lda, ipiv, info)

DGETRF(m, n, a, lda, ipiv, info)

CGETRF(m, n, a, lda, ipiv, info)

ZGETRF(m, n, a, lda, ipiv, info)


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| m | 整数型 | 矩阵A的行数。 | 输入 |
| n | 整数型 | 矩阵A的列数。 | 输入 |
| a | 在sgetrf中为单精度浮点型数组。 在dgetrf中为双精度浮点型数组。 在cgetrf中为单精度复数型数组。 在zgetrf中为双精度复数型数组。 | 调用前保存矩阵A。 调用后保存分解结果L和U，不保存L的对角线元素（均为1）。 | 输入/输出 |
| lda | 整数型 | A的leading dimension大小，要求lda ≥ max(1, n)。 | 输入 |
| ipiv | 整数型数组 | ?getrf得到的主元索引，长度为min(m,n)：1 ≤ ipiv ≤ min(m,n)，表示分解中矩阵第i行与第ipiv[i\-1]行交换。 | 输出 |
| info | 整数型 | 执行结果： 等于0：成功。 小于0：第\-info个参数值不合法。 大于0：矩阵U对角线上第info个元素为0，矩阵分解完成但U是奇异的，会导致求解线程方程组时出现除以零的错误。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
int m = 4;
int n = 4;
int lda = 4;
int ipiv[4];
int info = 0;
/*
* A (stored in column-major):
*  1.80  2.88    2.05  -0.89
*  5.25  -2.95  -0.95  -3.80
*  1.58  -2.69  -2.90  -1.04
* -1.11  -0.66  -0.59   0.80
*/
double a[] = {1.80,  5.25,  1.58, -1.11,
2.88, -2.95, -2.69, -0.66,
2.05, -0.95, -2.90, -0.59,
-0.89, -3.80, -1.04,  0.80};
dgetrf_(&m, &n, a, &lda, ipiv, &info);
/*
* Output:
*  5.2500  -2.9500  -0.9500  -3.8000
*  0.3429   3.8914   2.3757   0.4129
*  0.3010  -0.4631  -1.5139   0.2948
* -0.2114  -0.3299   0.0047   0.1314
*/
```

Fortran Interface：

```
PARAMETER (m = 4)
PARAMETER (n = 4)
PARAMETER (lda = 4)
INTEGER :: ipiv(4)
INTEGER :: info = 0
*       A (stored in column-major):
*        1.80  2.88    2.05  -0.89
*        5.25  -2.95  -0.95  -3.80
*        1.58  -2.69  -2.90  -1.04
*       -1.11  -0.66  -0.59   0.80
REAL(8) :: a(m, n)
DATA a / 1.80,  5.25,  1.58, -1.11,
$           2.88, -2.95, -2.69, -0.66,
$           2.05, -0.95, -2.90, -0.59,
$           -0.89, -3.80, -1.04,  0.80 /
EXTERNAL DGETRF
CALL DGETRF(m, n, a, lda, ipiv, info);
*       Output:
*        5.2500  -2.9500  -0.9500  -3.8000
*        0.3429   3.8914   2.3757   0.4129
*        0.3010  -0.4631  -1.5139   0.2948
*       -0.2114  -0.3299   0.0047   0.1314
```
