2014-12-23 6 views
0

Есть ли способ векторизовать код той же формы, что и у меня?Векторизация многоуровневого цикла для цикла

for k=1:length(channel_cuttoffs) 
    [b a] = butter(5,channel_cuttoffs(k)); 
    pulse = filtfilt(b,a,pulse); 
    eyediagram(downsample(pulse,10),3) 
end 

pulse является 10000x1 и channel_cuttoffs является 1x5.

+0

Я не думаю, что функция «масло» допускает перенос векторов, поэтому я думаю, что это действительно невозможно. Вы можете пройти через 'channel_cuttoffs' с помощью' arrayfun', но я не уверен, что это повышает производительность. – hbaderts

+2

Нет причин. Эти функции являются довольно тяжеловесными (особенно графический вывод), поэтому процент времени, потраченный на «накладные расходы цикла», очень мал. Держите его читаемым. – Peter

+0

Я сохраню его как есть, в этом случае. – user137017

ответ

2

Вы можете использовать arrayfun для векторизации кода.

Что-то вроде:

[b a] = arrayfun(@(x), butter(5, x), channelcuttoffs); 
pulse = arrayfun(@(x, y), filtfilt(x, y, pulse), b, a); 

Я не думаю, что вы можете сделать что-нибудь для eyediagram, поскольку он создает фигуру не числовой вывод.

Однако следует отметить, что массивное устройство работает медленно: arrayfun can be significantly slower than an explicit loop in matlab. Why? и http://www.mathworks.com/matlabcentral/newsreader/view_thread/253596 для более подробной информации. Таким образом, вам, вероятно, лучше всего использовать цикл, как в вопросе.

+0

'arrayfun' не vectorize; это всего лишь замкнутая петля. На самом деле это может быть [медленнее] (http://stackoverflow.com/questions/12522888/arrayfun-can-be-significantly-slower-than-an-explicit-loop-in-matlab-why), чем 'for цикл. –

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