그냥 그래서이 질문은 답이 남아 있지 않습니다
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
, 상당한 차이로!
(솔직히 - 예상하지 못했습니다!)
현재 값은 잘못 되었습니까? 너무 느리십니까? 일반적이지는 않습니까? 왜 갑자기 ['integral2'] (https://www.mathworks.com/help/matlab/ref/integral2.html)로 전환해야합니까? 숙제가 있니? 입력 내용을 설명하는 대신 질문에 추가하면됩니다. –
응답 해 주셔서 감사합니다. 이유; 곧 나는 수백 개의 직책과 함께 일할 것이고, 선생님에 따르면 함수 integral2는 훨씬 더 빠르고 정확하다 (나는 그 이유를 모른다). –
통계 및 기계 학습 도구 상자가있는 경우'pdist2'가 있습니다. 'integral2'는 오픈 소스이므로 마술은 없습니다. 당신의 방법은 제가 말할 수있는 한 거의 이상적입니다. 어쨌든 최상의 접근 방식을 결정하기 전에 항상 솔루션을 벤치마킹해야합니다. –