---
title: ?gesv
description: "求解线性方程组，其中是的矩阵，和为的矩阵。求解过程中，对使用具有部分旋转和行交换的LU分解，将其分解为的形式，其中是置换矩阵，是单位下三角矩阵，是上三角矩阵。并通过LU分解的结果来求解线性方程组。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0736.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/kunpengaccel_kml_0736.html
indexId: 04f3330464a7c4f03ca8515f19563de4fa063dd9695e426032ccc900742dfd7a61
---
# ?gesv

求解线性方程组，其中是的矩阵，和为的矩阵。求解过程中，对使用具有部分旋转和行交换的LU分解，将其分解为的形式，其中是置换矩阵，是单位下三角矩阵，是上三角矩阵。并通过LU分解的结果来求解线性方程组。

#### 接口定义

C Interface：

void sgesv_(const int *n,const int *nrhs,float *a,const int *lda,int *ipiv, float *b, const int *ldb,int *info);

void dgesv_(const int *n,const int *nrhs,double *a,const int *lda,int *ipiv, double *b, const int *ldb,int *info);

void cgesv_(const int *n,const int *nrhs,float_Complex *a,const int *lda,int *ipiv, float_Complex *b, const int *ldb,int *info);

void zgesv_(const int *n,const int *nrhs, double_Complex *a,const int *lda,int *ipiv, double_Complex *b, const int *ldb,int *info);

Fortran Interface：

SGESV(n, nrhs, a, lda, ipiv, b, ldb, info);

DGESV(n, nrhs, a, lda, ipiv, b, ldb, info);

CGESV(n, nrhs, a, lda, ipiv, b, ldb, info);

ZGESV(n, nrhs, a, lda, ipiv, b, ldb, info);


#### 参数

| 参数名 | 类型 | 描述 | 输入/输出 |
| --- | --- | --- | --- |
| n | 整数型 | 矩阵A的阶数，要求n≥0。 | 输入 |
| nrhs | 整数型 | 右端项的数量，即矩阵B的列数，要求nrhs≥0。 | 输入 |
| a | 在sgesv中为单精度浮点型数组。 在dgesv中为双精度浮点型数组。 在cgesv中为单精度复数型数组。 在zgesv中为双精度复数型数组。 | 矩阵维度为(lda,n)。 输入：n\*n的系数矩阵A。 输出：储存了中的和，其中的单位对角线元素不存储。 | 输入/输出 |
| lda | 整数型 | A的leading dimension大小，要求lda≥max(1, n)。 | 输入 |
| ipiv | 整数型数组 | 数组维度为n。 存放了置换矩阵P的主元索引，即矩阵第i行与第ipiv(i)行交换。 | 输出 |
| b | 在sgesv中为单精度浮点型数组。 在dgesv中为双精度浮点型数组。 在cgesv中为单精度复数型数组。 在zgesv中为双精度复数型数组。 | 矩阵维度为(ldb,nrhs)。 输入：的右端矩阵B。 输出：在info=0的情况下，为的解矩阵X。 | 输入/输出 |
| ldb | 整数型 | B的leading dimension大小，要求ldb≥max(1, n)。 | 输入 |
| info | 整数型 | 执行结果： 等于0：成功。 小于0：第\-info个参数值不合法。 大于0：，分解已经完成，但是因为奇异，所以无法完成求解。 | 输出 |


#### 依赖

#include "klapack.h"


#### 示例

C Interface：

```
int n = 5; 
int nrhs = 2; 
int lda = 5; 
int ldb = 5; 
int ipiv[5]; 
int info = 0; 
double a[]={72.1673 , 66.1857 , 64.7644 , 28.0199 , 91.4151, 
            6.5180 , 62.8483 , 72.4323 , 46.5760 ,  8.6928, 
            28.9821 , 42.1828 , 18.6437 , 99.8612 , 35.6972, 
            67.9812 ,  5.0880 , 85.5035 ,79.2945 , 54.5920, 
            28.6869 , 49.7512 ,  7.5186 ,28.6929 , 84.6041}; 
double b[]={ 9.4532 ,  1.5204 ,  2.2127 ,  0.9891, 7.1778, 
             6.8955 ,   7.2465,  3.5019 ,  8.2268, 3.5287}; 
dgesv_(&n,&nrhs,a,&lda,ipiv,b,&ldb,&info); 
/* 
* Output: 
* 0.17538061067669766        0.16637572403098155 
* -0.11183914210321674       -3.7758100714851153E-002 
* 5.5415093265516101E-002    0.15550950667724139 
* -1.4901096204948673E-002   -7.3593964815566168E-002 
* -0.10693481055391466       -0.15230871441871899 
*/
```

Fortran Interface：

```
PARAMETER(n=5)
PARAMETER(nrhs=2)
PARAMETER(lda=5)
PARAMETER(ldb=5)
INTEGER::info =0
INTEGER :: ipiv(n)
REAL(8) :: a(n*n)
DATA a / 72.1673 , 66.1857 , 64.7644 , 28.0199 , 91.4151,
$           6.5180 , 62.8483 , 72.4323 , 46.5760 ,  8.6928,
$           28.9821 , 42.1828 , 18.6437 , 99.8612 , 35.6972,
$           67.9812 ,  5.0880 , 85.5035 ,79.2945 , 54.5920,
$           28.6869 , 49.7512 ,  7.5186 ,28.6929 , 84.6041 /
REAL(8) :: b(n, nrhs)
DATA b /9.4532 ,  1.5204 ,  2.2127 ,  0.9891, 7.1778,
$           6.8955 ,   7.2465,  3.5019 ,  8.2268, 3.5287 /
EXTERNAL DGESV
CALL DGESV(n, nrhs, a, lda, ipiv, b, ldb, info);
*       Output:
*       0.17538061067669766        0.16637572403098155
*       -0.11183914210321674       -3.7758100714851153E-002
*       5.5415093265516101E-002    0.15550950667724139
*      -1.4901096204948673E-002   -7.3593964815566168E-002
*       -0.10693481055391466       -0.15230871441871899
```
