2013-06-20 3 views
5

주어진 코드에서 어떻게 병목 현상을 처리 할 수 ​​있는지 알고 싶습니다. MATLAB 행렬에서 원소를 찾는 효율적인 방법

%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6 
Z = points(:,3) 
listZ = (Z >= a & Z < b); % Bottleneck 
np = sum(listZ); % For later usage 
slice = points(listZ,:); 

현재 N ~ 10^6, np ~ 1000number of calls to this part of code = 1000를 들어, 병목 문은 내 코드의 나머지 부분에 비해 시간의 큰 덩어리 인, 총 약 10 초하고있다.

Profiling Results

만 인덱싱 문에 대한 샘플 코드를 좀 더 스크린 샷

@EitanT의 요청에 따라하는 것은

Profiling for sample code Profiling for sample code

+1

당신은 확실 해요 병목 현상 (프로파일 링 결과를 보여줄 수 있습니까?) 그리고 어쨌든'num_calls'은 무엇입니까? –

+0

@EitanT 예이 문서는 MATLAB 프로파일 러 자체를 통해 검사했으며이 문장은 참으로 병목 현상입니다 – OrangeRind

+0

@EitanT 프로파일 링 결과를 추가했습니다 – OrangeRind

답변

8

:

Z = rand(1e6,3); 
a=0.5; b=0.6; 
c=(a+b)/2; 
d=abs(a-b)/2; 
tic 
for k=1:100, 
    listZ1 = (Z >= a & Z < b); % Bottleneck 
end 
toc 

tic 
for k=1:100, 
    listZ2 = (abs(Z-c)<d); 
end 
toc 

isequal(listZ1, listZ2) 

반환

Elapsed time is 5.567460 seconds. 
Elapsed time is 0.625646 seconds. 

ans = 

    1 
+1

아! 그것은 내가 [과거에 물어 본 것]을 생각 나게합니다 (http://stackoverflow.com/questions/12137233/matlab-performance-comparison-slower-than-arithmetic). 사실, 이것이 이것이가는 길이라고 생각합니다. –

+0

좋은 소식입니다! 실제 프로그램에서 코드의 나머지 부분이 복잡하기 때문에 어쩌면 약간의 크기가 줄어들지 만 더 많은 것을 할 수 있다고 생각합니다. – OrangeRind

+2

[최근 C 프로그래밍 관련 질문] (http://stackoverflow.com/a/17095534/1165522)에 대한 대답을 참조하십시오. – horchler

1

같은 일을보십시오 :

for i = 1:1000 
    x = (a >= 0.5); 
    x = (x < 0.6); 
end 

나는 그것이보다 빠르다는 것을 발견했다 :

01 약 4 초에 의해 23,516,
for i = 1:1000 
    x = (a >= 0.5 & a < 0.6); 
end 

는 :

Elapsed time is 0.985001 seconds. (first one) 
Elapsed time is 4.888243 seconds. (second one) 

나는 당신의 둔화에 대한 이유는 요소 현명한 & 작업입니다 생각합니다. 최악의 경우 가정

+0

질문을 더 자세히 읽으십시오. :) – OrangeRind

+0

너는 지금 무슨 뜻인지 안다. – KronoS

+0

@OrangeRind 업데이트 된 답변을 확인하십시오. – KronoS

3

:

  • 요소가 많다는 & 단락하지 않습니다를 내부적으로
  • 비교 식 단일 스레드 당신이 2*1e6*1e3 = 2e9 비교를하고있는

를 ~ 10 초입니다 . 이는 초당 ~ 2 억 회의 비교 (~ 200 MFLOPS)입니다.

일부 1.7 GFLops on a single core을 수행 할 수 있다고 생각하면 실제로는 다소 저조한 것으로 보입니다.

Windows 7을 사용하고 있습니까? 그렇다면 전원 설정을 확인 했습니까? 모바일 프로세서를 사용하고 있으므로 기본적으로 저전력 소모 방식이 효과적 일 것으로 기대됩니다. 이것은 창문이 처리 속도를 축소 할 수있게 해주므로 ... 확인하십시오.

그 외 ... 나는 실마리가 없습니다. 한쪽 평등 당신이 일방적 인 비교로 재구성 할 수 있습니다 중요하지 않습니다 그것은 빠른 진도의 한 순서를 얻는 경우

+0

좋은 점은 그곳에 있습니다. -하지만 전력 계획에 대해 확신했습니다 - 그리고 계산 중에는 터보 부스트가 또한 단일 스레드를 실행하기 때문에 시작됩니다. geekbench를 통해 CPU 처리량을 확인하고 알려주도록하겠습니다. – OrangeRind

관련 문제