我正在使用Intel MKL中的LAPACK的zheev。我得到了int INFO=99
。我在互联网上搜索这个代码对应的含义,但是我找不到列出所有整数错误代码及其含义的文档。
是否有人有LAPACK/BLAS错误代码完整列表的链接?或者如果您有离线副本,请将其复制粘贴作为答案?
我正在使用Intel MKL中的LAPACK的zheev。我得到了int INFO=99
。我在互联网上搜索这个代码对应的含义,但是我找不到列出所有整数错误代码及其含义的文档。
是否有人有LAPACK/BLAS错误代码完整列表的链接?或者如果您有离线副本,请将其复制粘贴作为答案?
INFO
报告了两种错误。一方面,如果 INFO<0
,则参数-INFO
的值非法。参数编号为 1、2、3 等:没有 0(Fortran)。例如,矩阵的大小是负数。另一方面,INFO>0
报告了计算失败。
失败的实际原因在引发错误的程序的注释中描述。 例如,对于 zheev()
,它写道:
查看0:如果 INFO=i,则算法无法收敛。i 个中间三对角形式的非对角线元素未收敛为零。
zheev()
的源代码,矩阵首先被缩放并降为三角形式,然后根据需要计算特征向量。如果不需要计算特征向量,则调用 dsterf()
;如果需要计算特征向量,则从反射系数开始调用 zungtr()
形成一个酉矩阵 Q,并调用 zsteqr()
计算三对角矩阵的特征值和特征向量。因此,输出的 INFO 取决于 dsterf()
或 zsteqr()
的结果。zsteqr()
,当最大迭代次数后仍存在非空错误时,在第536行会增加INFO的值。一些可能导致QR迭代失败的情况在Daniel Kressner的《常规和结构化特征值问题的数值方法》第1.3.6节中报告。尽管如此,错误通常是由编程错误引起的,列举如下:
数组类型错误。例如,zheev()
函数期望的是双精度复数数组,即在 Fortran 中的 DOUBLE COMPLEX
或者 COMPLEX*16
。如果使用了 COMPLEX*8
,可能会导致未定义的行为,并且可能会返回正 INFO。
在运行 LAPACK 程序之前,数组(矩阵和向量)可能已经被损坏。对于 zheev()
,这可能是由数组中的 INF 或 NaN 引起的。
调用程序时发生了编程错误。例如,参数 LDA
是数组 A
的主维度。它会检查 LDA >= max(1,N),如果不满足这个条件,则返回 INFO=-5
。然而,程序员仍然可以分配大小为 n*n
的数组 A
并指定 LDA=2*n
,这将导致未定义的行为,因为将使用超出数组索引的值。同样,可能的行为是返回 INFO=99
。
info
的LAPACK_WORK_MEMORY_ERROR
和LAPACK_TRANSPOSE_MEMORY_ERROR
:#define LAPACK_WORK_MEMORY_ERROR -1010
#define LAPACK_TRANSPOSE_MEMORY_ERROR -1011