3

次の関数の高速化に取り組んでいますが、結果はありません。

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

私には、それは実際にはパフォーマンスを向上させなかったようです. これについてあなたはどう思いますか?

光を当ててみませんか?

よろしくお願いします。

編集

私の質問に関連する理論的背景を紹介します。通常、ベータは次のように計算されます。

ここに画像の説明を入力

したがって、1 次元の 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)です。

4

2 に答える 2

2

spmdまたはを簡単に使用できるため、並列化という別のアプローチがありparforます。integral検討する代わりに、例quadについてはこのリンクを参照してください...

于 2013-01-21T07:23:30.910 に答える
2

私はこの質問が好きです。

問題:関数integralは積分を制限するのでスカラーのみを取ります。したがって、の計算をベクトル化することは困難ですE_int

手がかり:同じ機能k(ii,jj)を無限に何度も統合することには多くの冗長性があるようです...

提案された解決策:kの値を最小から最大にソートし、と統合するE_sort_int(si) = integral( E, sortedK(si), sortedK(si+1) );のはどうですかsortedK( numel(k) + 1 ) = 10000;。次に、の完全な値E_int = cumsum( E_sort_int );(並べ替えを「元に戻し」、サイズを元に戻すだけですk)。

于 2013-01-20T19:47:08.723 に答える