MATLAB:使用find函数获取数组中某个值的索引

时间:2012-11-07 00:05:51

标签: matlab floating-point

我已经创建了一个双精度数组,当我想使用find命令搜索数组中特定值的索引时,这会产生一个空矩阵,这不是我想要的。我假设问题在于数组读数中未显示的值和/或小数位的精度。

命令:

peaks=find(y1==0.8236)

数组读数:

y1 =

Columns 1 through 11

0.2000    0.5280    0.8224    0.4820    0.8239    0.4787    0.8235    0.4796    0.8236    0.4794    0.8236

Columns 12 through 20

0.4794    0.8236    0.4794    0.8236    0.4794    0.8236    0.4794    0.8236    0.4794

输出:

peaks =

Empty matrix: 1-by-0

我尝试使用命令

format short

但我猜这只会截断显示的值,而不是截断数组中的实际值。

如何使用find命令提供索引数组?

3 个答案:

答案 0 :(得分:3)

默认情况下,Matlab中数值矩阵的每个元素都使用浮点双精度存储。正如您在问题中所推测的那样format shortformat long只是改变了显示的格式,而不是数字的实际格式。

因此,如果使用y1之类的内容创建y1 = rand(100, 1),并且您希望使用y1find中找到特定元素,则需要知道确切的值你正在寻找浮点双精度的元素 - 这取决于你的应用程序可能是非平凡的。当然,如果peaks=find(y1==0.8236)仅包含y1

等值,0.823622378...将返回空矩阵

那么,如何解决这个问题呢?这取决于您的应用程序。一种方法是将y1中的所有值截断为您想要使用的给定精度。有趣的是,关于该主题的SO matlab问题在12小时前吸引了两个好的答案,请参阅{{3}更多。

如果您决定沿着这条路走下去,我会建议这样的事情:

a = 1e-4 %# Define level of precision
y1Round = round((1/a) * y1); %# Round to appropriate precision, and leave y1 in integer form
Index = find(y1Round == SomeValue); %# Perform the find operation

请注意,我以整数形式使用find命令和y1Round。这是因为在使用浮点double时完全存储整数,因此您不必担心浮点精度。

解决此问题的另一种方法是使用find对错误进行一些容忍,例如:

Index = find(abs(y1 - SomeValue) < Tolerance);

您选择哪条路径取决于您。但是,在采用这些方法之前,我会仔细研究一下你的应用程序,看看它是否可以通过某种方式重新配置,这样你就不需要从一组中搜索特定的“真实”数字了。实数”。那将是最理想的结果。

编辑:在这个问题的另外两个答案中提倡的代码比我的第二个方法更简洁 - 所以我相应地对其进行了修改。

答案 1 :(得分:2)

使用浮点数测试相等性几乎总是一个坏主意。您可能想要做的是测试哪些数字足够接近到目标值:

peaks = find( abs( y - .8236 ) < .0001 );

答案 2 :(得分:1)

问题确实在于精确度。您看到的数组不是实际数组,因为实际数组的每个数字都有更多数字。更改格式只会改变数组的显示方式,因此无法解决问题。

您有两个选项,可以修改数组或修改您要查找的内容。最好修改你要找的东西,因为那样你就不会改变实际值。

因此,不是寻找相等,而是寻找接近度(因此,您搜索的数字与数组中的数字之间的差异最多只是一些小的epsilon):

peaks = find( abs(y1-0.8236) < epsilon )

一般情况下,当你处理浮点数时,总是尽量避免精确比较并使用一些错误阈值,因为这些数字的表示是有限的,因此它们通常存储有很小的不准确性。