2013-02-26 10 views
4

나는 전체 행렬에 이미 전체 행렬의 변환은 느린 것으로 나타났습니다 :전체 행렬을 전체 행렬로 변환하는 속도가 느립니까?

>> tic; for k = 1:100; x = uint16(ones(10000,100)); end; toc 
Elapsed time is 0.035748 seconds. 
>> tic; for k = 1:100; x = uint16(uint16(ones(10000,100))); end; toc 
Elapsed time is 0.034180 seconds. 
>> tic; for k = 1:100; x = full(uint16(ones(10000,100))); end; toc 
Elapsed time is 0.460977 seconds. %%%%% SLOW! 

나는뿐만 아니라 uint16없이 테스트 :

>> tic; for k = 1:100; x = ones(10000,100); end; toc 
Elapsed time is 0.060028 seconds. 
>> tic; for k = 1:100; x = full(ones(10000,100)); end; toc 
Elapsed time is 0.229058 seconds. %%%%% SLOW! 

같은 효과를.

왜 이런가요? full은 스파 스 매트릭스를 전체 매트릭스로 변환하기로되어 있습니다. 이미 가득 차 있다면 아무 것도하지 않아야합니까?

편집 : issparse은 매우 빠릅니다! MEX가 된 것 같아요, 대부분 메모리 비용 이죠?

맥 OS X

+1

이 컨텍스트는 무엇입니까? 느린 경우에는하지 마십시오. 'issparse'를 사용하여 실제로 변환해야하는지 테스트하십시오. – zeFrenchy

+0

어쩌면 변환하지 않고 그냥해야하는지 확인하는 것이고, 느린 부분일까요? – Smash

+0

@DominiqueJacquel 이미'full' 전에'issparse'를하도록 제 코드를 변경했습니다. 약간 성가시다. 그러나 나는 살 것이다. 이것은 대부분 호기심에서 벗어났습니다. – Memming

답변

1

full 작품에 MATLAB 버전 7.13.0.564 (R2011b)을 잘. 따라서이 둔화에 대한 이유없는,

>> tic, for k = 1:100, x = ones(10000,100); end, toc 
Elapsed time is 0.043143 seconds. 

>> A = ones(10000,100); 
>> tic, for k = 1:100, x = full(A); end, toc 
Elapsed time is 0.000081 seconds. 

full가 아닌 스파 스 매트릭스를 호출하고 빠른 실행 : 느린 부분은 실제로 ones(10000, 100)입니다

는 ... 여기에 증거.

+0

하지만 질문에 'tic; k = 1 : 100; x = uint16 (1 (10000,100)); 종료; toc'는 빠릅니다. 어떻게 가능합니까? – shoelzer

+0

이 부분은 언급 한 JIT 최적화 일 가능성이 있지만 잘 모르겠습니다. Go figure ... –

1

면책 조항 : 이것은 무슨 일이 일어나고 있는지에 대한 나의 가장 좋은 추측이지만, Matlab의 후드에서 어떤 일이 일어나는지 확실히 알지 못합니다. 업데이트 : 댓글에서 EitanT은 내 추측이 잘못했을 가능성이 높다고 지적했습니다.

저는 Matlab의 JIT engine이 이러한 경우 중 일부에서 최적화를 수행하고 있지만 전부는 아닙니다라고 생각합니다.

변수가 생성되었지만 사용되지 않은 루프가있는 경우 JIT 엔진은 해당 변수를 반복 작성하는 것을 거듭하지 않습니다. 그것은 단지 그것을 한 번합니다. 이런 건 빨리 될 것입니다 :

% this calls 'ones' once 
for i = 1:100, x = ones(10000,100); end 

하지만 변수를 만든 다음 그것을 사용하는 경우, 그 변수마다 생성 함수에 전달하여 말한다. 이것은 분명히 더 많은 시간이 걸립니다.

% this calls 'ones' every iteration to pass to `full` 
for i = 1:100, x = full(ones(10000,100)); end 
+0

나는 당신의 주장에 동의하지 않습니다. 'i = 1 : 100, x = ones (10000,100); end '는 A = ones (10000, 100)보다 확실히 느립니다. i = 1 : 100이면, x = A; 끝 '. 또한, 제 대답에서 저는'x = full (A)'이 다소 빠르다는 것을 증명합니다. 이것은 당신의 진술과 모순되는데 더 많은 시간이 걸릴 것입니다. –

+0

@EitanT 첫 번째 요지에 동의하고 답변을 업데이트했습니다. 두 번째 점은 'A'가 한 번만 만들어집니다. 나는'full'에 전달할 행렬을 만드는 것이 느린 부분이라고 주장했다. – shoelzer

+0

당신에 따르면, 루프에서'x = full (A)'를 사용하는 것은 단지'x = A'보다 상당히 느릴 것입니다, 그러나 이것은 사실이 아닙니다 ... –

관련 문제