2017-02-21 1 views
1

크기가 10x2 인 위치 매트릭스 P이 있다고 가정 해 봅시다. 첫 번째 열에는 x 값이 있고 두 번째 열에는 y 값이 있습니다. 나는 위치의 길이의 평균을 원한다. 지금까지이 작업을 수행 한 방법은 다음 코드입니다 :평균 2 차원 유클리드 거리의 고성능 계산

avg = sum(sqrt(P(:,1).^2 + P(:,2).^2))/10); 

나는 적분 기능 integral2 훨씬 더 빠르고 정확한이 작업이라고 들었다. integral2을 사용하여 평균값을 계산하려면 어떻게해야합니까?

+2

현재 값은 잘못 되었습니까? 너무 느리십니까? 일반적이지는 않습니까? 왜 갑자기 ['integral2'] (https://www.mathworks.com/help/matlab/ref/integral2.html)로 전환해야합니까? 숙제가 있니? 입력 내용을 설명하는 대신 질문에 추가하면됩니다. –

+0

응답 해 주셔서 감사합니다. 이유; 곧 나는 수백 개의 직책과 함께 일할 것이고, 선생님에 따르면 함수 integral2는 훨씬 더 빠르고 정확하다 (나는 그 이유를 모른다). –

+1

통계 및 기계 학습 도구 상자가있는 경우'pdist2'가 있습니다. 'integral2'는 오픈 소스이므로 마술은 없습니다. 당신의 방법은 제가 말할 수있는 한 거의 이상적입니다. 어쨌든 최상의 접근 방식을 결정하기 전에 항상 솔루션을 벤치마킹해야합니다. –

답변

2

그냥 그래서이 질문은 답이 남아 있지 않습니다

function q42372466(DO_SUM) 
if ~nargin % nargin == 0 
    DO_SUM = true; 
end 

% Generate some data: 
P = rand(2E7,2); 

% Correctness: 
R{1} = m1(P); 
R{2} = m2(P); 
R{3} = m3(P); 
R{4} = m4(P); 
R{5} = m5(P); 
R{6} = m6(P); 

for ind1 = 2:numel(R) 
    assert(abs(R{1}-R{ind1}) < 1E-10); 
end 

% Benchmark: 
t(1) = timeit(@()m1(P)); 
t(2) = timeit(@()m2(P)); 
t(3) = timeit(@()m3(P)); 
t(4) = timeit(@()m4(P)); 
t(5) = timeit(@()m5(P)); 
t(6) = timeit(@()m6(P)); 

% Print timings: 
disp(t); 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

% Original method: 
function out = m1(P) 
    if DO_SUM 
    out = sum(sqrt(P(:,1).^2 + P(:,2).^2))/max(size(P)); 
    else 
    out = mean(sqrt(P(:,1).^2 + P(:,2).^2)); 
    end 
end 

% pdist2 method: 
function out = m2(P) 
    if DO_SUM 
    out = sum(pdist2([0,0],P))/max(size(P)); 
    else 
    out = mean(pdist2([0,0],P)); 
    end 
end 

% Shortened method #1: 
function out = m3(P) 
    if DO_SUM 
    out = sum(sqrt(sum(P.*P,2)))/max(size(P)); 
    else 
    out = mean(sqrt(sum(P.*P,2))); 
    end  
end 

% Shortened method #2: 
function out = m4(P) 
    if DO_SUM 
    out = sum(sqrt(sum(P.^2,2)))/max(size(P)); 
    else 
    out = mean(sqrt(sum(P.^2,2))); 
    end  
end 

% hypot 
function out = m5(P) 
    if DO_SUM 
    out = sum(hypot(P(:,1),P(:,2)))/max(size(P)); 
    else 
    out = mean(hypot(P(:,1),P(:,2))); 
    end 
end 

% (a+b)^2 formula , Divakar's idea 
function out = m6(P) 
    % Since a^2 + b^2 = (a+b)^2 - 2ab, 
    if DO_SUM 
    out = sum(sqrt(sum(P,2).^2 - 2*prod(P,2)))/max(size(P)); 
    else 
    out = mean(sqrt(sum(P,2).^2 - 2*prod(P,2))); 
    end 
end 

end 

일반적인 결과 내 R2016b + Win10 x64의에 :

당신의 방법은 실제로 위의 가장 좋은 것을 의미
>> q42372466(0) % with mean() 
    0.1165 0.1971 0.2167 0.2161 0.1719 0.2375 

>> q42372466(1) % with sum() 
    0.1156 0.1979 0.2233 0.2181 0.1610 0.2357 

, 상당한 차이로!
(솔직히 - 예상하지 못했습니다!)