试试这个单线(其中 A 是您的交集矩阵,B 是要删除的值):
A = [-4.0 0.5;
-2.0 0.5;
2.0 3.0;
4.0 0.5;
-2.0 0.5];
B = [-2.0 0.5];
A = A(~all(A == repmat(B,size(A,1),1),2),:);
然后,只需为要删除的每个新 B 重复最后一行。
编辑:
...还有一个选择:
A = A((A(:,1) ~= B(1)) | (A(:,2) ~= B(2)),:);
警告:这里的答案最适用于不期望出现小浮点错误的情况(即整数值)。如follow-up question 中所述,使用“==”和“~=”运算符可能会导致不需要的结果。在这种情况下,应修改上述选项以使用关系运算符而不是相等运算符。例如,我添加的第二个选项将更改为:
tolerance = 0.001; % Or whatever limit you want to set
A = A((abs(A(:,1)-B(1)) > tolerance) | (abs(A(:,2)-B(2)) > tolerance),:);
请注意! =)
一些基本的时间安排:
如果有人真的对效率感兴趣,我只是对三种不同的方法来获取矩阵的子索引做了一些简单的计时(我上面列出的两个选项和Fanfan'sSTRMATCH选项):
>> % Timing for option #1 indexing:
>> tic; for i=1:10000, index = ~all(A == repmat(B,size(A,1),1),2); end; toc;
Elapsed time is 0.262648 seconds.
>> % Timing for option #2 indexing:
>> tic; for i=1:10000, index = (A(:,1) ~= B(1)) | (A(:,2) ~= B(2)); end; toc;
Elapsed time is 0.100858 seconds.
>> % Timing for STRMATCH indexing:
>> tic; for i=1:10000, index = strmatch(B,A); end; toc;
Elapsed time is 0.192306 seconds.
如您所见,STRMATCH 选项比我的第一个建议要快,但我的第二个建议是三个选项中最快的。但请注意,我的选项和 Fanfan 做的事情略有不同:我的选项将行的逻辑索引返回到 keep,而 Fanfan 将行的线性索引返回到 remove。这就是 STRMATCH 选项使用以下形式的原因:
A(index,:) = [];
而我的使用表格:
A = A(index,:);
但是,我的索引可以被否定以使用第一种形式(索引行以删除):
A(all(A == repmat(B,size(A,1),1),2),:) = []; % For option #1
A((A(:,1) == B(1)) & (A(:,2) == B(2)),:) = []; % For option #2