2016-02-11 3 views
1

мне нужно оценить интеграл, и мой кодVectorize двойной для петель

r=0:25; 
t=0:250; 
Ti=exp(-r.^2); 
T=zeros(length(r),length(t)); 
for n=1:length(t) 
    w=1/2/t(n); 
    for m=1:length(r) 
    T(m,n)=w*trapz(r,Ti.*exp(-(r(m).^2+r.^2)*w/2).*r.*besseli(0,r(m)*r*w)); 
    end 
end 

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

ответ

2

Вы можете оптимизировать его, передавая матрицу аргумент Y в trapz(A,Y), и с помощью dim = 2, то есть цикл становится:

r = 0:25; 
t = 0:250; 
Ti = exp(-r.^2); 

tic 
T = zeros(length(r),length(t)); 
for n = 1:length(t) 
    w = 1/2/t(n); 
    for m = 1:length(r) 
     T(m,n) = w*trapz(r,Ti.*exp(-(r(m).^2+r.^2)*w/2).*r.*besseli(0,r(m)*r*w)); 
    end 
end 
toc 

tic 
T1 = zeros(length(r),length(t)); 
for n = 1:length(t) 
    w = 1/2/t(n); 
    Y = bsxfun(@times,Ti.*r, exp(-bsxfun(@plus,r'.^2,r.^2)*w/2).*besseli(0,bsxfun(@times,r',r*w))); 
    T1(:,n) = w* trapz(r,Y,2); 
end 
toc 

max(abs(T(:)-T1(:))) 

Вы могли бы, вероятно, векторизации его полностью, будет иметь вид позже.

+0

Спасибо за подсказку, но код имеет ошибку ... – noir

+0

@noir Какая ошибка? Численные результаты совпадают с точностью до числовой точности машины. Я получаю 'max (abs (T (:) - T2 (:))) = 3.4694e-18', где' T2' вычисляется с помощью моего цикла. – Oleg

+0

'Ti' и' r' должны быть дополнены 'repmat', в противном случае размеры не совпадают. @Oleg – noir