的理論結果是γ比率,等的混合物中的時間:總和( 甲我伽瑪(B 我)/伽瑪(C 我)),其中A
是一個二項式係數,並且通過直接在matlab中使用nchoosek
將很難計算。所以我的解決方案是將結果中的所有元素分解爲prod(vector)
,但是,隨着矢量變長,我遇到了數字問題。所以我改變了解決方案,得到x(1:n) = log(vector)
然後rst = sum(exp(x))
。在實踐中,我發現這非常耗時,尤其是當伽馬術語的數量非常大時。如何提高日誌和冪運算的消耗
下面是一個代碼段:
gamma_sum = zeros(1,x2+1);
coef = ones(1,x2+1);
% sub_gamma_sum = zeros(1,x2+1);
% coef(1) = prod(1./sqrt(1:x2));
coef(1) = sum(log(1:x2))/2-sum(log([1:1-1 1:x2-1+1]));
if x1>0
% gamma_sum(1) = gamma(beta)/gamma(alpha+beta)/...
% prod((alpha+beta:alpha+beta+x1-1));
% gamma_sum(1) = prod(1./(alpha+beta:alpha+beta+x1-1));
gamma_sum(1) = sum(log(1./(alpha+beta:alpha+beta+x1-1)));
else
% gamma_sum(1) = gamma(beta)/gamma(alpha+beta);
% gamma_sum(1) = 1;
gamma_sum(1) = log(1);
end
for i = 2:x2+1
% coef(i) = prod((1:x2)./[1:i-1 1:x2-i+1]);
% coef(i) = exp(sum(log(1:x2))/2-sum(log([1:i-1 1:x2-i+1])));
coef(i) = sum(log(1:x2))/2-sum(log([1:i-1 1:x2-i+1]));
% coef(i) = prod(1./[1:i-1 1:x2-i+1])*exp(sum(log(1:x2))/2);
% gamma_sum(i) = prod((beta:beta+i-2)./(alpha+beta:alpha+beta+i-2))*prod(1./(alpha+beta+i-1:alpha+beta+x1+i-2));%% den has x1+i-1 terms
gamma_sum(i) = sum(log((beta:beta+i-2)./(alpha+beta:alpha+beta+i-2)))+sum(log(1./(alpha+beta+i-1:alpha+beta+x1+i-2)));
end
在代碼中,COEF是A 我,和gamma_sum是其餘部分。剛剛發現,當x2
,即伽馬術語的數量,計算時間真的很麻煩。 P.S:我試圖用矩陣運算替換所有for
循環,但是當x2
增加矩陣大小時也會使計算耗時。有沒有什麼辦法可以解決這個問題,比如使用其他方法更有效地解決數字問題(數量超過1e300或數字小於e-200),即保證精度和提高速度。
事實上,我在速度上遇到了麻煩。我所問的是如何讓它更快。對不起,我的需求描述不清。 –