我已经创建了一个双精度数组,当我想使用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命令提供索引数组?
答案 0 :(得分:3)
默认情况下,Matlab中数值矩阵的每个元素都使用浮点双精度存储。正如您在问题中所推测的那样format short
和format long
只是改变了显示的格式,而不是数字的实际格式。
因此,如果使用y1
之类的内容创建y1 = rand(100, 1)
,并且您希望使用y1
在find
中找到特定元素,则需要知道确切的值你正在寻找浮点双精度的元素 - 这取决于你的应用程序可能是非平凡的。当然,如果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 )
一般情况下,当你处理浮点数时,总是尽量避免精确比较并使用一些错误阈值,因为这些数字的表示是有限的,因此它们通常存储有很小的不准确性。