좋아,이 게시물은 정말 나를 방해.
나는 bsxfun에 대해 들어 본 적이 없다. arrayfun, cellfun, structfun을 사용하고있었습니다. 그래서 나는 그것을 사용하는 이유를 배회했고, 나는 스피드에서 나의 대답을 발견 할 것이라고 생각했다. 그래서 나는 바보 테스트했다 :
X = magic(3);
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
toc
tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
toc
을 그리고 난 대답을 얻었다 :
Elapsed time is 0.004130 seconds.
Elapsed time is 0.002468 seconds.
, arrayfun가 갈 수있는 방법이라고 나 일을했다. 그러나 X가 작은 데이터이므로 arrayfun이 더 빠르기 때문에 더 큰 X (X = magic(100);
)로 시도했습니다. 그리고 확실히, bsxfun은 훨씬 빨라서 어떤 것을 다시 코딩해야합니다. 내가 테스트를 여러 번 실행하기로 결정 결과에 충분 그러나 행복하지
Elapsed time is 0.003342 seconds.
Elapsed time is 0.395347 seconds.
그냥이 casuality의 아니었다 보장 할 수 있습니다. 그리고 여기가 불안해지기 시작합니다.
test= repmat({zeros(2,10)},2,1);
Xsizes = [3 100];
for ii=1:2,for jj=1:10
X = magic(Xsizes(ii));
tic
Y = bsxfun(@minus, X, min(X(:)));
X_normalized = bsxfun(@rdivide, Y, max(Y(:)));
test{ii}(1,jj)=toc;
tic
arrayfun(@(x) x-min(X(:))./(max(X(:))-min(X(:))),X);
test{ii}(2,jj)=toc;
end;end
display('small Size data')
test{1}
display('Big Size data')
test{2}
그리고에 allways 빠를 작은 데이터 및 대용량 데이터에 대한 빠른 bsxfun에 대한 arrayfun 기대 대답. 그러나 두 경우 모두 bsxfun이 더 빠르며 처음 세트를 계산하는 데 더 많은 시간이 걸립니다.
small Size data
ans =
1.0e-03 *
0.4900 0.0470 0.0430 0.0410 0.0410 0.0420 0.0420 0.0410 0.0420 0.0410
0.6600 0.4200 0.4040 0.3890 0.3920 0.3900 0.3920 0.3890 0.3960 0.3900
Big Size data
ans =
0.0003 0.0001 0.0001 0.0001 0.0001 0.0001 0.0002 0.0001 0.0001 0.0001
0.3853 0.3871 0.3846 0.3855 0.3874 0.3844 0.3863 0.3840 0.3860 0.3853
이것은 나에게 당황 스럽다. for 루프 밖에서 X=magic(3)
으로 다시 계산하면 bsxfun은 항상 arrayfun 이상을 소요합니다.
Elapsed time is 0.004891 seconds.
Elapsed time is 0.002008 seconds.
Elapsed time is 0.003181 seconds.
Elapsed time is 0.001994 seconds.
Elapsed time is 0.003109 seconds.
Elapsed time is 0.002008 seconds.
어떤 힌트가 있습니까?