2013-06-12 13 views
3

我有一個問題,似乎很簡單,但也許我錯過了一些東西。讓我們說我有:vector = [10:1:19];。我有另一個矢量,want = [11 16 19];我只想要一種命令將返回給我的方式,其中11,16和19發生在向量中的痕跡。換句話說,我想返回2,7和10.什麼命令可以做到這一點?我不能使用find,(因爲尺寸不匹配),那麼還有其他方法嗎?在MATLAB中查找矢量中的特定事件,而不是for-loop?

實際上,vectorwant的長度會很長,所以for循環不會。

回答

7

使用intersect

[C, i_vector, i_want] = intersect(vector, want) 

C是在兩種載體中的公共元素。 i_vector將是vectori_want中的常用集合索引,是want向量中的匹配集合索引。

+1

謝謝!我對此毫無頭緒。 MATLAB如何使這個命令運行得非常快btw?引擎蓋下發生了什麼?當然沒有for循環的權利? – Spacey

+1

@Learnaholic結構良好的循環可以非常快。 MatLab也爲矩陣進行了優化。 – KronoS

+0

@Learnaholic:還有許多Matlab內置函數都經過了優化和預編譯,如果我沒有弄錯,有時會導致更多的速度。 – pm89

1

或者,您可以使用ismember

要獲得vector目前的元素want

vector(ismember(vector,want)) 
ans = 
    11  16 19 

得到他們的指標:

find(ismember(vector,want)) 
ans = 
    2  7 10 

或者只是:

[tf, loc] = ismember(vector,want) 
tf = 
    0  1  0  0  0  0  1  0  0  1 
loc = 
    0  1  0  0  0  0  2  0  0  3 

其中TF指示的每個元素vector是否存在於wantloc表示want中的相應索引。