【发布时间】:2017-10-13 22:16:33
【问题描述】:
我在 MATLAB 中实现了 Forbenius 范数的以下定义 https://puu.sh/xXsJZ/c42a5e9eac.png
按照描述的方式(即我做了 2 个 for 循环,并通过对每个元素进行平方来增加总和,最后我取总和的平方根)。
我的问题是,有没有办法实现这个规范,这样如果我在矩阵中输入一个相当大的数字,它的平方就不会溢出?在某些情况下,该函数返回“Infinity”,即使真正的 Forbenius 范数可能远低于机器的溢出阈值。 (记得在计算结束时取平方根)。
编辑:还有下溢的问题。即使元素 ai,j 不是太小,它的平方也可能下溢。在 MATLAB 中,一个 下溢的元素设置为 0。现在只要其他一些元素很大 够了,结果还是可以接受的。另一方面,如果所有元素都下溢,我的函数可能会错误地返回 0。
有什么帮助吗?
在我的机器上产生无穷大的矩阵示例是
[1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999; 1, 1]
但是,当我使用内置的 Frobenius 范数函数时,它可以很好地处理该输入。为什么会这样?
【问题讨论】:
-
请发布一个重现问题的示例。如果可能,请考虑将这些循环矢量化,您可能会获得很大的速度提升
-
Matlab 的
norm已经支持 Frobenius 范数。 -
MATLAB 是如何实现 Frobenius 范数的?我查看了他们的定义并尝试执行 x = sqrt(trace(A* transpose(A))),但是我仍然遇到溢出问题。当我使用内置 Frobenius 函数 (x = norm(A, 'fro')) 时,我没有遇到溢出问题。
标签: matlab math computer-science