[英]MATLAB: using the find function to get indices of a certain value in an array
我制作了一個雙精度數組,當我想使用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命令給出索引數組?
默認情況下,Matlab中數值矩陣的每個元素都使用浮點雙精度存儲。 當您以問題format short
和format short
format long
猜測時,僅更改顯示的格式,而不是數字的實際格式。
因此,如果y1
是使用y1 = rand(100, 1)
類的東西創建的,並且您想使用find
在y1
查找特定元素,則需要知道要查找的元素的確切值,以浮點數double精度-這可能取決於您的應用程序。 當然,如果y1
僅包含類似0.823622378...
值,那么peaks=find(y1==0.8236)
將返回空矩陣0.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);
您選擇哪種方式取決於您。 但是,在采用上述兩種方法之前,我都會仔細檢查您的應用程序,看看是否可以通過某種方式將其重新格式化,從而您無需從一組“真實”。 那將是最理想的結果。
編輯:在此問題的其他兩個答案中倡導的代碼比我的第二種方法更整潔-因此我已對其進行了相應更改。
用浮點數測試相等性幾乎總是一個壞主意。 您可能想要做的是測試以查看哪些數字足夠接近目標值:
peaks = find( abs( y - .8236 ) < .0001 );
實際上,問題在於精度。 您看到的顯示的數組不是實際的數組,因為實際的數組中的每個數字都有更多的數字。 更改格式只會更改數組的顯示方式,因此不能解決問題。
您有兩個選擇,要么修改陣列,要么修改您要查找的內容。 最好修改您要查找的內容,因為那樣的話您就不會更改實際值了。
因此,您可以尋找鄰近度(而不是尋找相等性)(因此,要搜索的數字與數組中的數字之間的差異最多是一些小的epsilon):
peaks = find( abs(y1-0.8236) < epsilon )
通常,在處理浮點數時,請始終盡量避免進行精確比較,並使用一些錯誤閾值,因為這些數字的表示形式受到限制,因此它們經常以很小的誤差存儲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.