2017-05-24 5 views
1

최적의 선형 매개 변수 A 및 B (y = Ax + b)는 이러한 매개 변수에 대한 카이 제곱 함수의 최소값에 해당합니다. 전역 최소 (2 매개 변수 선형 카이로 광장 포물선 때문에 보장) 및 3 중첩 된 루프 (아래)를 달성했습니다하지만 무결성 루프 (즉, 배열 속성을 사용하여 vectorize 원하는 피하기)).벡터화 2d 카이 제곱 그리드 검색

카이 제곱 (가중 최소 제곱)는 (의사)로서 정의된다 :

카이 제곱 (K, J) = SUM (Y [I] - (A [K] * X [I] + B [j]))/yerr [i])^2.

다음은 AB 매개 변수 값 (각각 100 개 값)의 10,000 개 조합에 대해 카이 제곱 값으로 100 x 100 격자를 채우는 MATLAB 코드입니다. 세 데이터 배열 : x, yyerr이 있습니다.

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이 수 -

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

타이밍 - -

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); 
MATLAB의 암시 적 확장 컴퓨팅 p0

p1가 간소화 것

% 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