Hãy thử điều này một liner (nơi Một là ma trận ngã tư của bạn và B là giá trị để loại 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),:);
Sau đó, chỉ cần lặp lại dòng cuối cùng cho mỗi mới B bạn muốn để loại bỏ.
EDIT:
... và đây là một lựa chọn:
A = A((A(:,1) ~= B(1)) | (A(:,2) ~= B(2)),:);
CẢNH BÁO: Những câu trả lời ở đây được sử dụng tốt nhất cho trường hợp sai sót điểm nhỏ nổi không mong đợi (ví dụ với giá trị số nguyên). Như đã lưu ý trong số follow-up question này, việc sử dụng toán tử "==" và "~ =" có thể gây ra kết quả không mong muốn. Trong những trường hợp như vậy, các tùy chọn ở trên nên được sửa đổi để sử dụng các toán tử quan hệ thay vì các toán tử bình đẳng. Ví dụ: tùy chọn thứ hai tôi đã thêm sẽ được thay đổi thành:
tolerance = 0.001; % Or whatever limit you want to set
A = A((abs(A(:,1)-B(1)) > tolerance) | (abs(A(:,2)-B(2)) > tolerance),:);
Chỉ cần nhanh lên! =)
MỘT SỐ THỜI GIAN thô sơ:
Trong trường hợp bất cứ ai đã thực sự quan tâm đến hiệu quả, tôi chỉ làm một số thời gian đơn giản cho ba cách khác nhau để có được những subindex cho ma trận (hai tùy chọn tôi đã liệt kê ở trên và Fanfan's tùy chọn 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.
Như bạn có thể thấy, các tùy chọn STRMATCH là nhanh hơn so với đề nghị đầu tiên của tôi, nhưng đề nghị thứ hai của tôi là nhanh nhất trong cả ba. Tuy nhiên, lưu ý rằng các tùy chọn của tôi và Fanfan làm những việc hơi khác nhau: các tùy chọn của tôi trả về các chỉ số hợp lý của các hàng thành giữ và chỉ số tuyến tính trả về của hàng của Fanfan là xóa.Đó là lý do lựa chọn STRMATCH sử dụng các hình thức:
A(index,:) = [];
khi tôi sử dụng các hình thức:
A = A(index,:);
Tuy nhiên, chỉ số của tôi có thể được phủ nhận để sử dụng các hình thức đầu tiên (hàng lập chỉ mục để loại bỏ):
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
tôi gần như đã có một giải pháp vector nhưng không nhiều hơn một chút tiết hơn của bạn. Đẹp một lót. – Azim
WoW ... rất thanh lịch ... –