P?GETRF
计算矩阵A的LU分解,允许行交换(partial pivoting)。分解结果为A=PLU,其中P为置换矩阵、L为下三角矩阵或下阶梯矩阵且对角线为1,U是上三角矩阵或上阶梯矩阵。
接口定义
C Interface:
void psgetrf_(const int *m, const int *n, float *a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)
void pdgetrf_(const int *m, const int *n, double*a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)
void pcgetrf_(const int *m, const int *n, float _Complex *a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)
void pzgetrf_(const int *m, const int *n, double _Complex*a, const int *ia, const int *ja, const int *desca, int *ipiv, int *info)
Fortran Interface:
PSGETRF(m, n, a, ia, ja, desca, ipiv, info)
PDGETRF(m, n, a, ia, ja, desca, ipiv, info)
PCGETRF(m, n, a, ia, ja, desca, ipiv, info)
PZGETRF(m, n, a, ia, ja, desca, ipiv, info)
参数
参数 |
类型 |
范围 |
说明 |
输入/输出 |
---|---|---|---|---|
m |
整型 |
全局 |
要操作的行数,比如子矩阵的行数。 |
输入 |
n |
整型 |
全局 |
要操作的列数,比如子矩阵的列数。 |
输入 |
a |
|
本地 |
|
输入,输出 |
ia |
整型 |
全局 |
子矩阵在全局矩阵中的行索引。 |
输入 |
ja |
整型 |
全局 |
子矩阵在全局矩阵中的列索引。 |
输入 |
desca |
整型数组 |
本地,全局 |
分布式矩阵A的矩阵描述符。 |
输入 |
ipiv |
整型 |
本地 |
包含了主元信息。 |
输出 |
info |
整型 |
全局 |
执行结果:
|
输出 |
依赖
#include <kscalapack.h>
#include <kscalapack_utils.h>
示例
int m = 8; int n = 8; int nprow = 2; int npcol = 2; int mb = 4;:q int nb = 4; np = 4; int descA[9]; int info; int ipiv[10] = {0}; int lddA = mpA > 1 ? mpA : 1; descinit_( descA, &n, &n, &nb, &nb, &izero, &izero, &ictxt, &lddA, &info); /* * Origin A: * 4.00000 19.0000 25.0000 16.0000 19.0000 19.0000 25.0000 16.0000 22.0000 8.00000 17.0000 25.0000 22.0000 21.0000 17.0000 25.0000 23.0000 22.0000 7.00000 19.0000 23.0000 22.0000 18.0000 19.0000 21.0000 18.0000 23.0000 13.0000 21.0000 18.0000 23.0000 22.0000 19.0000 19.0000 25.0000 16.0000 4.00000 19.0000 25.0000 16.0000 22.0000 21.0000 17.0000 25.0000 22.0000 8.00000 17.0000 25.0000 23.0000 22.0000 18.0000 19.0000 23.0000 22.0000 7.00000 19.0000 21.0000 18.0000 23.0000 22.0000 21.0000 18.0000 23.0000 13.0000 */ /* Query optimal work size */ pdgetrf_(&n, &n, A, &ione, &ione, descA, ipiv, &info); // run with 4 processes * After PDGETRF: /* 23.0000 22.0000 7.00000 19.0000 23.0000 22.0000 18.0000 19.0000 0.173913 15.1739 23.7826 12.6957 15.0000 15.1739 21.8696 12.6957 0.956522 -0.859599 30.7479 17.7393 12.8940 13.0000 18.5817 17.7393 0.913043 -0.137536 0.646538 -14.0708 -6.27341 -8.40499 -2.44069 -5.07082 0.826087 0.0544413 0.582891 0.762348 -18.5499 -1.17005 -0.0305972 -6.86113 0.956522 -0.00286533 0.337340 -0.0624197 0.253277 -17.6137 -6.56767 2.29955 1.00000 0.00000 0.357749 0.451018 0.0961398 0.0424351 -16.2651 -3.49711 0.913043 -0.137536 0.646538 0.360379 0.216315 0.290848 -0.0218688 -11.5045 */