Я работал над ускорением следующей функции, но безрезультатно:
function beta = beta_c(k,c,gamma)
beta = zeros(size(k));
E = @(x) (1.453*x.^4)./((1 + x.^2).^(17/6));
for ii = 1:size(k,1)
for jj = 1:size(k,2)
E_int = integral(E,k(ii,jj),10000);
beta(ii,jj) = c*gamma/(k(ii,jj)*sqrt(E_int));
end
end
end
До сих пор я решил это так:
function beta = beta_calc(k,c,gamma)
k_1d = reshape(k,[1,numel(k)]);
E_1d =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = zeros(1,numel(k_1d));
parfor ii = 1:numel(k_1d)
E_int(ii) = quad(E_1d,k_1d(ii),10000);
end
beta_1d = c*gamma./(k_1d.*sqrt(E_int));
beta = reshape(beta_1d,[size(k,1),size(k,2)]);
end
Мне кажется, это не особо улучшило выступления. Что Вы думаете об этом?
Не могли бы вы пролить свет?
Я благодарю вас заранее.
ИЗМЕНИТЬ
Я собираюсь представить некоторые теоретические основы, связанные с моим вопросом. Как правило, бета рассчитывается следующим образом.
Следовательно, в сокращенном случае одномерного массива k E_int можно рассчитать как
E = 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int = 1.5 - cumtrapz(k,E);
или, альтернативно, как
E_int(1) = 1.5;
for jj = 2:numel(k)
E =@(k) 1.453.*k.^4./((1 + k.^2).^(17/6));
E_int(jj) = E_int(jj - 1) - integral(E,k(jj-1),k(jj));
end
Тем не менее, k
в настоящее время является матрицей k(size1,size2)
.
arrayfun
работал быстрее, чем циклfor
. - person Eitan T   schedule 20.01.2013