У меня есть вектор «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))
Если я правильно интерпретировал это, у вас есть небольшая проблема, потому что выражение выражения 'if' зависит от результата предыдущей итерации. Это, очевидно, будет проблематичным, если вы вексете его, поскольку вы, по крайней мере, концептуально, выполняете операцию на всех элементах одновременно. – jazzbassrob
Кроме того, просто примечание: '(sum (a == r) == length (a)' может быть написано 'all (a == r)', что немного лучше. – jazzbassrob
вы правы, это проблематично, но немыслимы. Есть уловки для решения таких проблем (http://www.cam.ac.uk/help/tpl/programs/Matlab/tricks.html, ищите главу «Векторить следующее, где элементы зависят на предыдущие »). В моем случае я пытаюсь применить его более сложным образом. – user2329652