这是一个与sub2ind/ind2sub相关的错误吗?

use*_*230 2 matlab

我试图在单精度变量上做sub2ind,我遇到了以下奇怪的行为.例如,当我尝试:

[a b] = ind2sub([50000 50000], sub2ind([50000 50000], single(1000), single(1000)))
Run Code Online (Sandbox Code Playgroud)

我明白了:

a = 1001
b = 1000
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我遗失了什么?我知道这可能是因为matlab代码中某处出现溢出但不应该发生,对吧?

我从64位(glnxa64)R2012a,R2011a,R2010b,R2010a得到了相同的错误行为,但是从32位(glnx86)R2010b得到了正确的结果.

Chr*_*ris 6

发生这种情况的原因如下.

在ind2sub.m的第35行是

vi = rem(ndx-1, k(i)) + 1;   
Run Code Online (Sandbox Code Playgroud)

其中ndx是传入的索引.因此,通过sub2ind的调用,ndx为49951000.现在,当您传入单个精度值时,它会强制matlab以单精度计算所有数学运算.因此,比较在l.35上发生的事情的差异.

K>> 49951000-1
ans =
        49950999

K>> single(49951000)-1
ans =
        49951000
Run Code Online (Sandbox Code Playgroud)

从大数字中减去一小部分是个问题.所以不,这不是一个错误,它是对单精度浮点精度的限制.这可能会有所帮助.

编辑:正如拉斯曼所指出的,展示这一点的好方法是使用eps

eps(single(49951000))=4
Run Code Online (Sandbox Code Playgroud)

因此,在范围(-4,4)上的单个(49951000)中添加或减去的任何值将导致由于单精度的准确性而返回495100.

  • 一点都不.您要求Matlab使用单精度数字进行计算(通过单个传递).没有演员表,你不能混合单精度和双精度.仅仅因为*输出*适合[realmin('single'),realmax('single)]与你选择的FP格式的局限性有关,如果你计算的数字是有意义的. (3认同)