簡體   English   中英

MATLAB:使用find函數獲取數組中某個值的索引

[英]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 shortformat short format long猜測時,僅更改顯示的格式,而不是數字的實際格式。

因此,如果y1是使用y1 = rand(100, 1)類的東西創建的,並且您想使用findy1查找特定元素,則需要知道要查找的元素的確切值,以浮點數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM