MATLAB 除法... 29/128 应该返回 0 吗?
Posted
技术标签:
【中文标题】MATLAB 除法... 29/128 应该返回 0 吗?【英文标题】:MATLAB division... should 29/128 return 0? 【发布时间】:2010-09-11 02:40:11 【问题描述】:我真的不认为这是一个精度问题,答案应该是 0.226 左右。这是确切的代码:
val = I(i,j)
bucketSize
pos = val / bucketSize
I
只是我从中获取值的矩阵。这是 MATLAB 的输出:
val =
29
bucketSize =
128
pos =
0
我错过了什么?
【问题讨论】:
【参考方案1】:我的猜测是您的矩阵I
是从image file 加载的像素数据,其值通常为unsigned 8-bit integers。如前所述,将两个整数值转换为 double precision 值将确保 MATLAB 执行浮点除法而不是整数除法(这将对结果进行四舍五入)。
将一个值转换为double precision 是不够的:
对于一个操作数是一个整数数组的所有二元运算 数据类型(64 位整数除外),另一个是双精度标量, MATLAB 使用逐元素双精度计算运算 算术,然后将结果转换回原始整数 数据类型。
如果您想了解有关 MATLAB 中不同数值数据类型的更多信息,可以查看this documentation。
【讨论】:
【参考方案2】:尝试:
double(val)/double(bucketSize)
【讨论】:
【参考方案3】:我明白了,问题是我的矩阵出于某种原因包含 uint8,而不是双精度数。刚刚将 val=I(i,j) 更改为 val=double( I(i,j) ) 一切都很好。谢谢。
【讨论】:
【参考方案4】:这些变量可能是整数而不是双精度或长整数。 1/2 是否返回 0.5?其他操作是否有效?
【讨论】:
是的。例如,29/128 得出正确答案。我的印象是 Matlab 是无类型的?如何将变量设置为双精度值?以上是关于MATLAB 除法... 29/128 应该返回 0 吗?的主要内容,如果未能解决你的问题,请参考以下文章
什么是 MATLAB 中的双周期运算符后跟除法运算符 (../)?