如何在Dyalog中使用矩阵求逆⌹避免DOMAIN ERROR?
从APL*PLUS PC移植到Dyalog时⌹运算符触发DOMAIN ERROR的解决方法
问题场景
将DOS平台旧版APL*PLUS PC函数移植到Dyalog APL过程中,矩阵求逆操作⌹触发DOMAIN ERROR,该问题在GNU_64 APL中同样可复现。
复现代码
F←6.91E9 5.655E9 I←¯0.0144722 ¯0.01897385 Z←I⌹2 2⍴F[1],(÷-F[1]),F[2],÷-F[2] DOMAIN ERROR Z←I⌹2 2⍴F[1],(÷-F[1]),F[2],÷-F[2] ∧
问题原因
APL*PLUS PC对矩阵奇异性的判定阈值更为宽松,而Dyalog与GNU APL的⌹运算符对接近奇异的矩阵会严格抛出DOMAIN ERROR。本次案例中的2x2矩阵行列式数值极小,属于接近奇异的范畴,因此触发报错。
自定义解决方案
针对2x2矩阵,手动实现求逆与矩阵乘法逻辑,绕过标准运算符的严格检查,可得到正确计算结果。
自定义DIVIDE函数代码
Z←I2 DIVIDE M22;A;B;C;D A←M22[1;1] ⋄ B←M22[1;2] ⋄ C←M22[2;1] ⋄ D←M22[2;2] Z←÷(A×D)-B×C Z←Z×(2 2)⍴D,(-B),(-C),A Z←Z+.×I2
测试结果
Z←I DIVIDE 2 2⍴F[1],(÷-F[1]),F[2],÷-F[2] Z 4.625648461E¯13 122089494.5
结果验证
(2 2⍴F[1],(÷-F[1]),F[2],÷-F[2])+.×Z ¯0.0144722 ¯0.01897385
验证结果与原始输入I完全一致,说明自定义函数逻辑正确。
内容的提问来源于stack exchange,提问作者MLS
相关产品推荐
相关产品推荐

