【问题标题】:Make Matlab issue a warning when converting a double to a uint8 and vice versa?在将 double 转换为 uint8 时让 Matlab 发出警告,反之亦然?
【发布时间】:2015-03-16 13:53:47
【问题描述】:

在 Matlab 中,颜色通常由 RGB 强度值的三个元素向量表示,精度为 uint8(范围 0 - 255)或双精度(范围 0 - 1)。 imshow 等 Matlabs 函数可与任一表示一起工作,从而使两者都易于在程序中使用。

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

如何让 Matlab 在发生类型转换时显示警告?

理想情况下,只有在doubleuint8 之间进行转换。它也应该很难停用(即在加载工作区或 matlab 崩溃时不会重置该选项)。

【问题讨论】:

  • 花了几个小时才发现这样的错误 [...] 我感到你的痛苦。 MATLAB 的弱类型系统让我改用 Julia...

标签: matlab casting


【解决方案1】:

一种可能的解决方案是定义您自己的 uint8 函数,该函数将转换为 uint8 并在某些值被截断时发出警告。

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

或者,正如 Sam Roberts 所指出的,如果您希望仅在从 double 转换为 uint8 时调用此函数(而不是在从任何其他类型转换为 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

警告默认开启。您可以使用命令 warning('on','MATLAB:castTruncation')warning('off','MATLAB:castTruncation') 将其打开或关闭(感谢 CitizenInsane 的建议)。

【讨论】:

  • 向警告添加标识符将有助于暂时禁用它(当然是故意的)。
  • @CitizenInsane 感谢您的建议。我已经添加了
  • @LuisMendo 更好的是,将此函数放在名为@double 的路径上的文件夹中。然后它只会在您将double 转换为uint8 时被调用 - 目前它将在您将anything(例如singleuint32)转换为uint8 时调用。
  • @Jubobs Luis 的回答已经建议隐藏内置的 uint8。我建议不要将它实现为一个常规函数,它会影响 everything 的内置 uint8,我们将它实现为 double 的方法,然后它只会影响双打的内置uint8。 PS只要你知道自己在做什么,这样做完全没问题——一点也不讨厌,
  • @Jubobs 同意。我本来希望有一个更优雅的解决方案,但我找不到任何
猜你喜欢
  • 1970-01-01
  • 2015-11-16
  • 2012-06-15
  • 1970-01-01
  • 2021-08-03
  • 2014-05-11
  • 2010-12-03
  • 2011-10-08
相关资源
最近更新 更多