根据第二个矩阵中的值过滤矩阵行

时间:2014-08-27 13:36:44

标签: matlab

给定2x3矩阵x和4x2矩阵y,我想使用y的每一行来索引x。如果x中的值不等于-1,我想从y中删除该行。这是一个做我喜欢的事情的例子,除非我想在没有循环的情况下以快速,简单的方式做到这一点。

x = [1, 2, 3; -1, 2, -1];
y = [1, 1; 1, 3; 2, 1; 2, 3];

for i=size(y,1):-1:1
   if x(y(i,1), y(i,2)) ~= -1
      y(i,:) = [];
   end
end

这导致:

y =

     2     1
     2     3

3 个答案:

答案 0 :(得分:3)

sub2ind所遵循的原始方法(由路易斯发布的漂亮外观solution使用)本身就是这样 -

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 :(得分:2)

这可以很容易地按照以下方式进行矢量化(参见sub2ind):

y = y(x(sub2ind(size(x), y(:,1), y(:,2)))==-1,:);

答案 2 :(得分:0)

>> x = [1, 2, 3; -1, 2, -1];
>>y = [1, 1; 
    1, 2; 
    1, 3; 
    2, 1;
    2, 2;
    2, 3];
>>row_idx = reshape((x == -1)',1,6);
>>y = y(row_idx,:);

我认为你并没有在y中包含x的所有索引。我把所有这些都包括在内。看看..

广义版:

>> x = [1, 2, 3; -1, 2, -1];
>>y = [1, 1; 
    1, 2; 
    1, 3; 
    2, 1;
    2, 2;
    2, 3];
>>row_idx = reshape((x == -1)',1,size(x,1)*size(x,2));
>>y = y(row_idx,:);