给定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
答案 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,:);