matlab中的find()函數使用說明

Matlab 之 find()函數
  當我第一次用matlab語言編寫一個工程項目時,發現自己編寫的腳本里循環特別多,導致編程效率很低,這讓我特別苦惱。有一次導師讓我閱讀他編寫的一個Matlab腳本,並按照新要求對其進行更改。我發現腳本里多次用到find()函數,猛然間豁然開朗,原來有大部分循環可以用find()函數解決!對我而言,find()函數是我從Matlab小白開始進階的標誌,僅以此文,獻給find()函數!

[1] find()函數基本功能

find()函數的基本功能是返回向量或者矩陣中不爲0的元素的位置索引。

複製代碼
1 >> X = [1 0 4 -3 0 0 0 8 6];
2 >> ind = find(X)
3
4 ind =
5
6 1 3 4 8 9
複製代碼
  其有多種用法,比如返回前k的不爲0的元素:

1 >> ind = find(X,2)
2
3 ind =
4
5 1 3
  也可以寫成:

1 >> ind = find(X,2,‘first’)
2
3 ind =
4
5 1 3
  返回後k個不爲0的元素:

1 >> ind = find(X,2,‘last’)
2
3 ind =
4
5 8 9
  若X是一個矩陣,索引該如何返回呢?

複製代碼
1 >> X = [1 -3 0;0 0 8;4 0 6]
2
3 X =
4
5 1 -3 0
6 0 0 8
7 4 0 6
8
9 >> ind = find(X)
10
11 ind =
12
13 1
14 3
15 4
16 8
17 9
複製代碼
  這是因爲在Matlab在存儲矩陣時,是一列一列存儲的,我們可以做一下驗證:

1 >> X(4)
2
3 ans =
4
5 -3
  假如你需要按照行列的信息輸出該怎麼辦呢?

複製代碼

[r,c] = find(X)
r =
1
3
1
2
3

c =
1
1
2
3
3
複製代碼
  如果你還需要輸出具體的元素值:

複製代碼
1 >> [r,c,v] = find(X)
2 r =
3 1
4 3
5 1
6 2
7 3
8
9 c =
10 1
11 1
12 2
13 3
14 3
15
16 v =
17 1
18 4
19 -3
20 8
21 6
複製代碼
  [2] 進階技巧

(1)find()函數的功能是找到向量或者矩陣中不爲0的元素,那如果需要找到其中滿足一定條件的元素,比如,等於4的元素該怎麼辦呢?

複製代碼
1 >> X = [1 0 4 -3 0 0 0 8 6];
2 >> ind = find(X == 4)
3
4 ind =
5
6 3
複製代碼
  在Matlab中,有一個logical數據類型,和C++中的bool值相同。find()函數將logical值0也視爲數值0,logical值1視爲數值1,因此可以用上面的方法找到矩陣中滿足一定條件的元素。

(2)在程序中,我們經常會以向量中是否包含某一元素爲判斷條件,比如X中是否有等於9的元素,這時也可以應用find()函數:

複製代碼

if isempty(find(X == 9))
log = 0
else
log = 1
end

log =
0
複製代碼
  這裏需要補充說明下,當輸入中沒有非0元素時,findf()返回一個空數組。

[3] 高級技巧

在進階技巧(2)中,假如向量X的階數很高,比如1000萬維,如果我們用上面的方法,運行速度會很慢。仔細分析這個語句,我們其實並不希望找到X中等於9的全部元素,我們只想找到其中是否有等於9的元素,所以,我們只需作如下更改:

1 isempty(find(X == 9,1))
  我們做一個小實驗:

複製代碼
1 X = randi(100,1,10000000);
2 tic
3 for i = 1:100
4 isempty(find(X == 9));
5 end
6 toc
複製代碼
  輸出是:

1 Elapsed time is 1.954537 seconds.
  更改後:

複製代碼
1 X = randi(100,1,10000000);
2 tic
3 for i = 1:100
4 isempty(find(X == 9,1));
5 end
6 toc
複製代碼
  輸出爲:

1 Elapsed time is 0.757994 seconds.
  運行效率約是原來的2.5倍。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章