2013-12-01 1 views
1

Учитывая,Удаление элементов из массива в Matlab

a = [2 4 6 8 10 0 7 18 9 0 8 2 0 5]; 
b = [1 3 0 5 70 8 6 87 1 9 7 8 0 2]; 

Я пытаюсь удалить элементы (как в «а» & «Ъ»), что соответствует к «0» или меньше «0» в любом из 'а' или 'б', то есть, я хочу

% a = [2 4 8 10 7 18 9 8 2 5]; 
% b = [1 3 5 70 6 87 1 7 8 2]; 

Я пытаюсь, как это -

n = length(b); 

a1 = []; 
b1 = []; 

for k = 1:n 
    if a(n) <= 0 || b(n) <= 0 
     a1 = [a; a(a > 0)] % eliminates 0 from a 
     b1 = [b; b(b > 0)] % eliminates 0 from b 
    end 
end 

Любая помощь будет б Очень полезно.

ответ

0

Использование find:

a = [2 4 6 8 10 0 7 18 9 0 8 2 0 5]; 
b = [1 3 0 5 70 8 6 87 1 9 7 8 0 2]; 

A = a(find(a > 0 & b > 0)); 
B = b(find(a > 0 & b > 0)); 

или даже быстрее:

C = a( a > 0 & b > 0 ); 
D = b( a > 0 & b > 0 ); 

возвращается:

C = 

    2  4  8 10  7 18  9  8  2  5 
D = 

    1  3  5 70  6 87  1  7  8  2 

Если вы можете быть уверены, что нет значения ниже нуля вы также можно использовать:

E = a(logical(a) & logical(b)); 
F = b(logical(a) & logical(b)); 

, который немного быстрее, но содержит также отрицательные значения.

+0

Спасибо за быстрый ответ, но А = (найти (а> 0)); дает все ненулевые элементы в 'a' (это также может быть выполнено a (a> 0)) & B = a (find (b> 0)); дает элементы в том числе «0». –

+0

см. Edit;) – thewaywewalk

+0

Я бы не рекомендовал решение с 'find'. В последних версиях это неэффективное решение даже генерирует предупреждение mlint. –

0

Эффективный и компактный способ сделать это, чтобы сначала создать соответствующий индекс, который предотвращает двойной расчет:

idx = a>0 & b>0 

a = a(idx); 
b = b(idx);