原始的方法来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