问题描述
在调用 ZHEEVD 函数,并且设定 JOBZ = 'N' (仅求取本征值,不求取本征向量) 时、矩阵行数不小于 1000 时,KML 的计算结果似乎存在数值问题。
下述复现过程请参考文件夹 ajz34/issue-kml:issue-zheevd-eigvalsh。
该计算用到的 libklapack_full.so 文件的生成,参考文档 生成完整的LAPACK。
该问题是在开发 Rust 高维度张量库 RSTSR 时发现的,其影响的 单元测试 与函数 rt::linalg::eigvalsh 有关。
复现问题
首先通过 Python 生成 1000 大小、种子确定的随机矩阵 (在 ARM 或 x86 架构下,该矩阵是唯一确定的)。
执行该文件将会生成 a-re.txt, a-im.txt, b-re.txt, b-im.txt。其程序输出是
随后执行 C++ 编译与运行:
实际执行 KML 时,其结果是
上述输出表明,在调用 ZHEEVD 且只计算本征值、而不计算本征向量时,结果存在数值误差。
其他观察到的现象
- 该问题只在矩阵大小为 1000 或以上时出现;在 999 或以下时,
ZHEEVD 仅计算本征值的结果是正确的。 - 在我的观察范围内,该问题仅出现在
ZHEEVD 的本征值计算。若计算本征向量、或计算广义本征值问题 (ZHEGVD)、或实 64 位浮点 (DSYEVD),似乎不会出现问题。不过由于我的测试不非常充分,这个结论不一定正确。
问题描述
在调用 ZHEEVD 函数,并且设定
JOBZ = 'N'(仅求取本征值,不求取本征向量) 时、矩阵行数不小于 1000 时,KML 的计算结果似乎存在数值问题。下述复现过程请参考文件夹 ajz34/issue-kml:issue-zheevd-eigvalsh。
该计算用到的 libklapack_full.so 文件的生成,参考文档 生成完整的LAPACK。
该问题是在开发 Rust 高维度张量库 RSTSR 时发现的,其影响的 单元测试 与函数
rt::linalg::eigvalsh有关。复现问题
首先通过 Python 生成 1000 大小、种子确定的随机矩阵 (在 ARM 或 x86 架构下,该矩阵是唯一确定的)。
执行该文件将会生成
a-re.txt,a-im.txt,b-re.txt,b-im.txt。其程序输出是随后执行 C++ 编译与运行:
实际执行 KML 时,其结果是
上述输出表明,在调用
ZHEEVD且只计算本征值、而不计算本征向量时,结果存在数值误差。其他观察到的现象
ZHEEVD仅计算本征值的结果是正确的。ZHEEVD的本征值计算。若计算本征向量、或计算广义本征值问题 (ZHEGVD)、或实 64 位浮点 (DSYEVD),似乎不会出现问题。不过由于我的测试不非常充分,这个结论不一定正确。