Ускорение двойного цикла по интегралам с изменением значений функции параметра в Matlab

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

l=3;
t=linspace(0,1,365);
fun3= @(v) integral(@(v)exp(.071*v),0,v,'ArrayValued',true);
for i=2:length(t)
  for j=i:length(t)
      xx=t(i);
      yy=t(j);
      fun  = @(x,y) exp(0.14*0.00607*fun3(yy)).*exp(-(x-y).^2/l).*exp(0.14*0.00607*fun3(xx));
      y(i,j)=integral2(fun,t(i-1),t(i),t(j-1),t(j));
  end
end

person jlopez    schedule 24.08.2013    source источник
comment
Я предлагаю вам уточнить свой предыдущий вопрос и / или попросить человека, который ответил на него, улучшить свое решение...   -  person Eitan T    schedule 25.08.2013


Ответы (1)


Да, циклы for печально известны своей медленностью в Matlab. Обычно я использую функцию arrayfun, чтобы не использовать их.

Пример:

[i,j] = meshgrid(1:length(t));
y = arrayfun(@(i,j)integral2(fun,t(i-1),t(i),t(j-1),t(j)),i,j)
person dsgrnt    schedule 25.08.2013
comment
Какое ускорение вы увидели при переходе от вложенных циклов for к использованию arrayfun? - person dsgrnt; 01.09.2013