2012-08-26 70 views
3

我有這樣的載體:八度:比較兩個向量

t = 1: 10 % t = 1 2 3 ..10 

A= [3 4 5] % a column vector 

如果鍵入:

(3 == t) 

我得到的結果是:

0 0 1 0 0 0 0 0 0 0 % it means: 1 at location equals, and 0 at others 

我想爲矢量做到這一點a,這意味着它將採用向量A中的每個元素並比較並返回另一個向量。所以在這種情況下,結果將是一個3×10的矩陣。

但是這行會導致錯誤:A==t

當然,我可以通過使用for循環來做到這一點,但我想要矢量化這個操作。

回答

8

你正在尋找的是功能ismember

octave> t = 1:10 
t = 
    1 2 3 4 5 6 7 8 9 10 

octave> A = ismember (t, [2 3 4]) 
A = 
    0 1 1 1 0 0 0 0 0 0 
3

使用倍頻的廣播能力,它存在於3.6.3(不知道它被引入時),你可以簡單地這樣說:

A'==t 

如果你想讓它產生相同的結果carandraug的ismember命令,你只需添加一個「任何」,像這樣:

any(A'==t) 

對於較小的向量,此方法比ismember方法快得多。

octave:209> tic; for i=1:10000 B=ismember(t,A); end; toc; 
Elapsed time is 1.5 seconds. 
octave:211> tic; for i=1:10000 B=any(A'==t); end; toc; 
Elapsed time is 0.2 seconds. 

注意:如果您的倍頻的版本不支持廣播,或者你想保持它與舊版本兼容,A「== t可通過bsxfun更換(@當量,A」,T) 。

+0

-1:[Octave broadcast](http://www.gnu.org/software/octave/doc/interpreter/Broadcasting.html#Broadcasting)僅僅是['bsxfun'](http:/ /octave.sourceforge.net/octave/function/bsxfun.html)。結果肯定不是'ismember',所以兩者比較沒有意義。 –

+0

我很抱歉,但如果你打算閱讀它,你會發現它是與bsxfun產生相同結果的任何(A'== t)。如果你願意,你可以試試。至於bsxfun,除了你提到的任何關於bsxfun的內容外,沒有人會提到任何有關bsxfun的內容,所以我真的不認爲這一點的相關性......但即使有相關性,代碼的可讀性也是相關的,並且如果廣播八度更容易閱讀,它更好。而且,無論出於什麼原因,我發現廣播速度稍微快一點......在B = bsxfun(@ eq,t,A')上循環10000次需要比循環10000次多10%的時間B = A'= = T。 –

+0

你能舉一個例子說明給出不同的結果嗎?因爲我看不到它會這樣做的任何情況。如果它確實給出了不同的結果,它是成員還是我的解決方案給出了正確的結果? –