2016-09-25 53 views
0

的理論結果是γ比率,等的混合物中的時間:總和( 甲伽瑪(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),即保證精度和提高速度。

回答

0

這可能會讓您的系統變慢,但如果您需要高精度且符合數學工具箱,則可以嘗試使用vpa()。例如:

>> exp(1000) 
ans =  
    Inf  
>> vpa('exp(1000)',1000)  
ans =  
197007111401704699388887935224332312531693798532384578995280299138506385078244119347497807656302688993096381798752022693598298173054461289923262783660152825232320535169584566756192271567602788071422466826314006855168508653497941660316045367817938092905299728580132869945856470286534375900456564355589156220422320260518826112288638358372248724725214506150418881937494100871264232248436315760560377439930623959705844189509050047074217568.2267578083308102070668818911968536445918206584929433885943734416066833995904928281627706135987730904979566512246702227965470280600169740154332169201122794194769119334980240147712089576923975942544366215939426101781299421858554271852298015286303411058042095685866168239536053428580900735188184273075136717125183129388223688310255949141146674987544438726686065824907707203395789112200325628195551034220107289821072957315749621922062772097208051047568893649549635990627082681006282905378167473398226026683503867394140748723651685213836918959449223430784235236845739442 

通過這種方式,您可以在計算中使用大量數字,但會增加內存使用量和速度。

+0

事實上,我在速度上遇到了麻煩。我所問的是如何讓它更快。對不起,我的需求描述不清。 –