2017-05-24 8 views
1

ベストフィット線形パラメータAおよびB(y = Ax + b)は、これらのパラメータに対するカイ二乗関数の最小値に対応します。私はグローバルな最小値(2パラメータ線形カイ2乗が放物線であるため保証)をブルートフォースグリッドで検索し、3つのネストループ(以下)で実現しましたが、ループを避けたい(配列プロパティを使用してベクトル化する) )。ベクトル化2dカイ二乗グリッド検索

カイ二乗(加重最小二乗)は(擬似コード)のように定義される:

カイ二乗(K、J)=和(Y [I] - ([K] * X [I] + B [j]))/ yerr [i])^ 2である。

以下は、AおよびBのパラメータ値(それぞれ100個の値)の10,000の組み合わせに対してカイ二乗値を100×100グリッドで満たすMatlabコードです。データアレイは、x,yyerrの3つです。

2つのパラメータを持つ直線的なカイ2乗グリッドの無限のバージョンへの助けをありがとう!

キース

% create parameter grid 
    a = linspace(85,110,100); 
    b = linspace(10,35,100); 
    [A,B] = meshgrid(a,b); 

    % calculate chi-square over parameter grid 
    chi2(100,100) = zeros; 

    for k = 1:100; 
     for j = 1:100; 
      for i = 1:length(y) 
      chi2a = ((y(i)-a(k)*x(i)-b(j))/yerr(i)).^2; 
      chi2(k,j) = chi2(k,j)+chi2a; 
      end 
     end 
    end 

答えて

1

我々はそれbsxfun可能性 -

MATLABの暗黙の拡大に伴い
x3d = reshape(x,1,1,numel(x)); 
y3d = reshape(y,1,1,numel(y)); 
yerr3d = reshape(yerr,1,1,numel(yerr)); 
p0 = bsxfun(@minus, bsxfun(@minus,y3d,bsxfun(@times,a(:),x3d)), b); 
p1 = bsxfun(@rdivide, p0, yerr3d); 
out = sum(p1.^2,3); 

p0p1を計算することに単純化する -

p0 = ((y3d - a(:).*x3d) - b); 
p1 = p0 ./yerr3d; 

タイミング -

% Setup 
N = 2000; 
x = rand(N,1); 
y = rand(N,1); 
yerr = rand(N,1); 

a = linspace(85,110,100); 
b = linspace(10,35,100); 

我々が得る -

----------- With loopy method ------------------------- 
Elapsed time is 1.056787 seconds. 
----------- With BSXFUN method ------------------------- 
Elapsed time is 0.109601 seconds. 
+0

ありがとうございました - これはとても便利です! – Carey

関連する問題