2014-01-27 44 views

回答

5

您可以使用bsxfun這樣的:

I = bsxfun(@gt, M, T); 

然後I將是一個size(M)矩陣logcial與那些地方M(:,i) > T(i)

+0

啊,太棒了 - 我不知道這存在! :-) – Spacey

+1

我也沒有很長一段時間.. :) – jmbond

+2

'arrayfun','cellfun','bsxfun'和'spfun'都是允許你做一些非常有趣的操作來代替可怕的for-循環 – MZimmerman6

3

您可以使用bsxfun來做這樣的事情,但它可能不會比for循環更快(下面更多)。

result = bsxfun(@gt,M,T) 

這將做一個元素明智的比較,並返回一個邏輯矩陣,指示由第一個參數支配的關係。我在下面發佈了代碼以顯示直接比較,表明它確實會返回您正在查找的內容。

%var declaration 
M = randn(10,20); 
T = randn(1,20); 
% quick method 
fastres = bsxfun(@gt,M,T); 

% looping method 
res = false(size(M)); 
for i = 1:length(T) 
    res(:,i) = M(:,i) > T(i); 
end 

% check to see if the two matrices are identical 
isMatch = all(all(fastres == res)) 

這個功能非常強大,可以用來幫助加速過程,但請記住,這隻會加快東西,如果有大量的數據。有一些背景工作bsxfun必須做,這實際上可能會導致它變慢。

我只會建議使用它,如果你有幾千個數據點。否則,傳統的for循環實際上會更快。通過更改MT變量的大小來爲自己嘗試一下。

+0

對,很好的建議,謝謝。 – Spacey

+1

沒問題。這是所有關於學習,這使得這樣一個適當的用戶名:) – MZimmerman6

1

可以複製的閾值向量和矩陣使用比較:

s=size(M); 
T2=repmat(T, s(1), 1); 
M(M<T2)=0; 
Indexes=find(M);