1

我制作了一个双精度数组,当我想使用 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 命令给出索引数组?

4

3 回答 3

4

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

因此,如果y1是使用类似的东西创建的y1 = rand(100, 1),并且您想在y1using中找到特定元素find,则需要知道要查找的元素的浮点双精度的确切值 - 这取决于您的应用程序可能是非琐碎的。当然,如果只包含类似的值,peaks=find(y1==0.8236)将返回空矩阵y10.823622378...

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

如果你决定走这条路,我会推荐这样的东西:

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这是因为整数在使用浮点双精度时精确存储,因此您无需担心浮点精度。

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

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

选择哪条路取决于你。但是,在采用这些方法中的任何一种之前,我会仔细检查您的应用程序,看看它是否可以以某种方式重新制定,这样您就不需要从一组“实”。那将是最理想的结果。

编辑:这个问题的其他两个答案中提倡的代码比我的第二种方法更整洁 - 所以我已经相应地改变了它。

于 2012-11-07T00:35:28.580 回答
3

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

peaks = find( abs( y - .8236 ) < .0001 );
于 2012-11-07T00:34:51.713 回答
2

问题确实在于精度。您看到显示的数组不是实际数组,因为实际数组中每个数字都有更多位数。改变格式只是改变了数组的显示方式,所以并不能解决问题。

您有两个选择,要么修改数组,要么修改您要查找的内容。修改您要查找的内容可能会更好,因为这样您就不会更改实际值。

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

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

通常,当您处理浮点数时,请始终尽量避免精确比较并使用一些错误阈值,因为这些数字的表示是有限的,因此它们通常以小的不准确性存储。

于 2012-11-07T00:32:29.020 回答