2009-04-10 37 views

Trả lời

16

Một cách:

x(x == 0) = []; 

Lưu ý về thời gian:

Như đã đề cập bởi woodchips, phương pháp này có vẻ chậm so với một sử dụng bởi KitsuneYMG. Điều này cũng đã được ghi nhận bởi Loren ở một trong số MathWorks blog posts của cô. Vì bạn đã đề cập phải làm điều này hàng ngàn lần, bạn có thể nhận thấy một sự khác biệt, trong trường hợp này tôi sẽ thử x = x(x~=0); trước tiên.

CẢNH BÁO: Cẩn thận nếu bạn đang sử dụng số không phải số nguyên. Ví dụ: nếu bạn có một số rất nhỏ mà bạn muốn xem xét đủ gần bằng 0 để nó sẽ bị xóa, mã ở trên sẽ không xóa nó. Chỉ chính xác số không được xóa. Sau đây sẽ giúp bạn cũng xóa số "đủ gần" để zero:

tolerance = 0.0001; % Choose a threshold for "close enough to zero" 
x(abs(x) <= tolerance) = []; 
+0

này không thành công trên số âm Hãy thử 'abs (x) <= tolerance' – KitsuneYMG

+0

X = = dung sai sẽ loại trừ các số dấu phẩy động phủ định. Bạn có lẽ sẽ cần phải mở rộng so sánh để được x> = khoan dung và x <= khoan dung. Các nhà điều hành cho hợp lý và trong MATLAB thoát tôi vào lúc này. –

+0

Tôi đã sửa câu trả lời để xóa bất kỳ giá trị nào đủ gần bằng 0 từ hướng tiêu cực hoặc dương. – gnovice

11

Chỉ cần được khác nhau:

x=x(x~=0); 

hoặc

x=x(abs(x)>threshold); 

này có tiền thưởng làm việc trên phức tạp các số quá

3

Đây là một cách khác

y = x (tìm (x))

Tôi sẽ để cho bạn tìm ra hiệu quả tương đối của các phương pháp khác nhau mà bạn thử - viết và cho chúng tôi biết.

11

Đó là ba giải pháp phổ biến. Nó giúp thấy sự khác biệt.

x = round(rand(1,15000)); 

y = x; 

tic,y(y==0) = [];toc 

Elapsed time is 0.004398 seconds. 

y = x; 

tic,y = y(y~=0);toc 

Elapsed time is 0.001759 seconds. 

y = x; 

tic,y = y(find(y));toc 

Elapsed time is 0.003579 seconds. 

Như bạn thấy, cách rẻ nhất là chỉ số logic trực tiếp, chọn ra các yếu tố cần giữ lại. Việc tìm kiếm là tốn kém hơn, kể từ MATLAB tìm thấy những yếu tố đó, trả về một danh sách của chúng, và sau đó chỉ mục vào vector.

+0

Chà! Những con số đó có đúng không? Tôi có thể thề rằng "y (y == 0) = [];" và "y = y (y ~ = 0);" có thể so sánh với nhau một cách khôn ngoan về tốc độ. Tôi sẽ phải kiểm tra lại số của mình. – gnovice

+0

Đừng bận tâm ... Tôi vừa tìm thấy một bài đăng trên blog của Loren tại công trình toán học giải quyết chính xác vấn đề này và dường như đồng ý với các con số của bạn. – gnovice

+0

@gnovice Lưu ý rằng bây giờ bạn có thể sử dụng '[~, ~, y] = find (y)' sẽ cho hiệu suất tương tự với giải pháp với lập chỉ mục logic. –

0
x = [0 0 0 1 1 0 5 0 7 0] 
y = [0 2 0 1 1 2 5 2 7 0] 

Sau đó x2 và y2 có thể thu được như sau:

x2=x(~(x==0 & y==0)) 
y2=y(~(x==0 & y==0)) 

x2 = [0  1  1  0  5  0  7] 
y2 = [2  1  1  2  5  2  7] 

Hope this helps!

2

Mặc dù kết quả thời gian của tôi là không thuyết phục để cho dù đó là nhanh hơn đáng kể, điều này dường như là cách tiếp cận nhanh nhất và dễ dàng nhất:

y = nonzeros(y) 
Các vấn đề liên quan