讓我們說我有以下幾點:MATLAB:我想基於向量中的閾值來閾值矩陣,沒有for循環。可能?
M = randn(10,20);
T = randn(1,20);
我想門檻M
每一列,由T
每個條目。例如,查找大於T(1)
的所有元素M(:,1)
的所有標記。查找M(:,2)
中所有元素的大於T(2)
等的所有元素等。
當然,我想這樣做沒有for-loop。這可能嗎?
讓我們說我有以下幾點:MATLAB:我想基於向量中的閾值來閾值矩陣,沒有for循環。可能?
M = randn(10,20);
T = randn(1,20);
我想門檻M
每一列,由T
每個條目。例如,查找大於T(1)
的所有元素M(:,1)
的所有標記。查找M(:,2)
中所有元素的大於T(2)
等的所有元素等。
當然,我想這樣做沒有for-loop。這可能嗎?
您可以使用bsxfun
這樣的:
I = bsxfun(@gt, M, T);
然後I
將是一個size(M)
矩陣logcial與那些地方M(:,i) > T(i)
。
您可以使用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循環實際上會更快。通過更改M
和T
變量的大小來爲自己嘗試一下。
對,很好的建議,謝謝。 – Spacey
沒問題。這是所有關於學習,這使得這樣一個適當的用戶名:) – MZimmerman6
可以複製的閾值向量和矩陣使用比較:
s=size(M);
T2=repmat(T, s(1), 1);
M(M<T2)=0;
Indexes=find(M);
啊,太棒了 - 我不知道這存在! :-) – Spacey
我也沒有很長一段時間.. :) – jmbond
'arrayfun','cellfun','bsxfun'和'spfun'都是允許你做一些非常有趣的操作來代替可怕的for-循環 – MZimmerman6