2013-04-28 9 views
1

У меня есть вектор «a» и фильтр «b». Оба этих вектора содержат только 0 или 1. Я хотел бы преобразовать «a», так что любая последовательность из 1 начинается только тогда, когда b находится в 1.векторизовать фильтр для подпоследовательности массива в Matlab

Я проиллюстрировал это с помощью цикла, но, поскольку мои векторы огромны, он крайне неэффективен.

Результат, который я хотел бы, хранится в «r».

a=[0;0;1;1;1;1;1;1;0;0;1;1;0;0;1;1;1;1;1]; 

b=[0;0;0;0;1;0;1;0;0;1;0;1;0;1;1;0;0;0;0]; 

r=[0;0;0;0;1;1;1;1;0;0;0;1;0;0;1;1;1;1;1]; 

for i=2:length(a) 

    if a(i)==1 &&a(i-1)==0 && b(i)==0   
     a(i)=a(i-1);   
    end 
end 

assert(sum(a==r)==length(a)) 
+0

Если я правильно интерпретировал это, у вас есть небольшая проблема, потому что выражение выражения 'if' зависит от результата предыдущей итерации. Это, очевидно, будет проблематичным, если вы вексете его, поскольку вы, по крайней мере, концептуально, выполняете операцию на всех элементах одновременно. – jazzbassrob

+0

Кроме того, просто примечание: '(sum (a == r) == length (a)' может быть написано 'all (a == r)', что немного лучше. – jazzbassrob

+0

вы правы, это проблематично, но немыслимы. Есть уловки для решения таких проблем (http://www.cam.ac.uk/help/tpl/programs/Matlab/tricks.html, ищите главу «Векторить следующее, где элементы зависят на предыдущие »). В моем случае я пытаюсь применить его более сложным образом. – user2329652

ответ

0

Вот два лайнера:

r = a; 
r([false; diff(a)>0 & b(2:end)==0]) = 0; 

Пожалуйста, обратите внимание, что вам нужно адаптировать код для векторов-строк (это работает для векторов-столбцов).

+0

он производит:
[0; 0; 0; 1; 1; 1 1; 1; 0; 0; 1; 0; 1; 1; 1; 1; 1]
вместо [0; 0; 0; 1; 1; 1; 1; 0; 0; 1; 0; 0; 1; 1; 1; 1; 1] – user2329652

+0

4-й элемент не является корр. ect, потому что использование в вашем коде diff (a)> 0 удалит только первую последовательность из одного, но не следующего – user2329652

Смежные вопросы