matlab - 这是与 sub2ind/ind2sub 相关的错误吗?

标签 matlab

我在尝试对单精度变量执行 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/

相关文章:

matlab - 在 MATLAB 中是否有 'self' 来引用自己的结构?

Matlab - 一种更好的插值散点热图的方法

matlab - 在 Octave/Matlab 的 arrayfun 中使用 if 子句

matlab - Matlab/CUDA : ocean wave simulation

matlab - MATLAB : Copy/Paste? 中的 Emacs 键盘绑定(bind)

java - 防止 MATLAB 更改 Java 外观

matlab - 在 Matlab 中将函数传递给另一个函数时出现“输出参数太多”错误

matlab - 在 MATLAB 中删除元胞数组中的字符串

arrays - 3d 数组 R 中的 n 个前邻居列表

matlab - SVM分类器一敌多