将double转换为uint8时,让Matlab发出警告,反之亦然?

seb*_*ebf 9 matlab casting

通常在Matlab中,颜色由RGB强度值的三个元素向量表示,精度为uint8(范围0-255)或双精度(范围0-1).Matlabs的功能,例如imshow使用任何一种表示,使得它们都易于在程序中使用.

然而,在将颜色值从一种类型的矩阵分配给另一种类型的矩阵时,同样容易引入错误(因为该值是静默转换的,但不会重新缩放到新范围).刚刚花了几个小时发现这样的错误,我想确保它再也不会被引入.

在进行类型转换时,如何让Matlab显示警告?

理想情况下,只有当转换介于double和之间时才会出现uint8.它也应该很难停用(即加载工作区时,或者当matlab崩溃时,不重置选项).

Lui*_*ndo 9

一种可能的解决方案是定义您自己的uint8函数,uint8如果某个值被截断,则转换为并发出警告.

您应该将此函数放在一个阴影内置函数的文件夹中uint8.例如,您的用户文件夹是一个不错的选择,因为它通常出现在第一个path.

或者,如Sam Roberts所述,如果您希望仅在转换doubleuint8(不是从任何其他类型转换为uint8)时调用此函数,请将其放在@double路径中指定的文件夹中.

function y = uint8(x)
y = builtin('uint8', x);
if any(x(:)>255) || any(x(:)<0)
    warning('MATLAB:castTruncation', 'Values truncated during conversion to uint8')
end
Run Code Online (Sandbox Code Playgroud)

默认情况下警告处于启用状态.你可以用下面的命令切换或关闭warning('on','MATLAB:castTruncation'),并warning('off','MATLAB:castTruncation')(感谢CitizenInsane您的建议).

  • 在警告中添加标识符将有助于临时禁用它(当然是出于目的). (3认同)
  • @Jubobs Luis的回答已经暗示阴影内置的'uint8`.我建议不要将它作为常规函数实现,它会影响_everything_的内置`uint8`,我们将它实现为`double`的方法,然后它只会影响内置的`uint8`.为双打.PS,只要你知道你在做什么,这样做完全没问题 - 根本不讨厌, (3认同)
  • @LuisMendo更好的是,将此函数放在名为`@ double`的路径上的文件夹中.然后它只会在你将`double`转换为`uint8`时被调用 - 当你将_anything_(例如`single`或`uint32`)转换为`uint8`时它将被调用. (2认同)