(どこあなたの交差点行列であると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のための最後の行を繰り返します削除する。
EDIT:
A = A((A(:,1) ~= B(1)) | (A(:,2) ~= B(2)),:);
WARNING:ここで回答は最高の小さな浮動小数点エラーが期待されていない場合に使用されている(つまり、と
...と、ここでは別のオプションです整数値)。このfollow-up questionに記載されているように、 "=="および "〜="演算子を使用すると、望ましくない結果が生じる可能性があります。そのような場合、上記のオプションは、等価演算子の代わりに関係演算子を使用するように変更する必要があります。たとえば、私が追加した2番目のオプションは、
tolerance = 0.001; % Or whatever limit you want to set
A = A((abs(A(:,1)-B(1)) > tolerance) | (abs(A(:,2)-B(2)) > tolerance),:);
に変更されました。誰もが効率が本当に興味があった場合、私はちょうど行列のためのサブインデックスを取得するための3つの異なる方法のためのいくつかの簡単なタイミングをした
(2:=)
初歩的なタイミングオプションI)は、上記とFanfan's STRMATCHオプションリストアップしました:
>> % 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オプションは、私の最初の提案よりも高速ですが、私の2番目の提案は3つの中で最速です。私のオプションは、行の論理インデックスをとし、Fanfanは行の線形インデックスをに返します。を削除します。鉱山は、フォームを使用しながら、
A(index,:) = [];
:STRMATCHオプションはフォームを使用する理由です
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
は、私はほとんどベクター溶液があったが、あなたよりも少し冗長ではありません。ニースワンライナー。 – Azim
うわー...そうエレガントな方法.... –