原始的方法來sub2ind
遵循什麼(13759本看起來很漂亮solution由Luis發佈)本質上就是這樣 -
y = y(x((y(:,2)-1)*size(x,1)+y(:,1))==-1,:)
標杆
基準測試代碼
N = 5000;
num_runs = 10000;
x = round(rand(N,N).*2)-1;
y = zeros(N,2);
y(:,1) = randi(size(x,1),N,1);
y(:,2) = randi(size(x,2),N,1);
disp('----------------- With sub2ind ')
tic
for k = 1:num_runs
y1 = y(x(sub2ind(size(x), y(:,1), y(:,2)))==-1,:);
end
toc,clear y1
disp('----------- With raw version of sub2ind ')
tic
for k = 1:num_runs
y2 = y(x((y(:,2)-1)*size(x,1)+y(:,1))==-1,:);
end
toc
結果
----------------- With sub2ind
Elapsed time is 4.095730 seconds.
----------- With raw version of sub2ind
Elapsed time is 2.405532 seconds.
+1幹得好!有一段時間我不知道'sub2ind',我會這樣做。然後我發現這個函數並且很懶:-) – 2014-08-27 21:04:25
@LuisMendo哈哈,你怎麼不知道'sub2ind'! :)嗯,這很有趣我猜想,當我們想要避免性能函數調用,並依靠基本的數學運算,讓我們的大腦移動:)你已經有了我的+1! – Divakar 2014-08-27 21:09:01
一開始我不知道'sub2ind',甚至不知道線性索引。我認爲線性索引是一些Matlab的bug! (「Matlab如何允許二維數組使用_one_索引進行索引?」)然後,我得到了它的邏輯並開始使用它,但手動進行轉換,就像在你的回答中一樣 – 2014-08-27 21:18:28