我在尝试对单精度变量执行 sub2ind 时遇到了以下奇怪的行为。例如,当我尝试:
[a b] = ind2sub([50000 50000], sub2ind([50000 50000], single(1000), single(1000)))
我得到:
a = 1001
b = 1000
这是一个错误还是我遗漏了什么?我知道这可能是因为 matlab 代码某处发生了溢出,但它不应该发生,对吗?
我从 64 位 (glnxa64) R2012a、R2011a、R2010b、R2010a 得到了相同的错误行为,但从 32 位 (glnx86) R2010b 得到了正确的结果。
最佳答案
发生这种情况的原因如下。
ind2sub.m的第35行是
vi = rem(ndx-1, k(i)) + 1;
其中 ndx 是传入的索引。因此,通过 sub2ind 的调用,ndx 为 49951000。现在,当您传入单精度值时,它会强制 matlab 以单精度计算所有数学。因此,比较 l.35 上发生的差异。
K>> 49951000-1
ans =
49950999
K>> single(49951000)-1
ans =
49951000
从大数中减去小数就是问题所在。所以不,这不是错误,它是对单精度浮点精度的限制。 This might help some.
编辑:正如 Rasman 所指出的,一个很好的展示方式是使用 eps。
eps(single(49951000))=4
因此,由于单精度的准确性,在范围 (-4,4) 内从 single(49951000) 添加或减去的任何值都将导致返回 495100。
关于matlab - 这是与 sub2ind/ind2sub 相关的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10212291/