2012-12-06 7 views
-2

내 컴퓨터에 Matlab R2012a가 설치되어 있고 친구 컴퓨터에 Matlab R2009a (멀티 스레드)가 설치되어 있습니다. 내 컴퓨터에는 2GB의 RAM이있는 반면 128GB의 프로세서는 더 좋은 이유 때문에 친구의 컴퓨터에서 코드를 실행하기로 결정했습니다.R2012a에서 작동하는 동일한 MATLAB 코드 R2009a

원격 데스크톱 연결 프로그램으로 컴퓨터에 연결하고 dropbox에서 내 코드와 데이터 세트를 다운로드하고 코드를 실행했습니다. 그러나 시간이 지났지 만 코드 실행은 끝나지 않았습니다. (내 컴퓨터에서 약 20 분이 걸렸으므로 내 친구 시스템이 내 것보다 훨씬 낫다고 생각하면 20 분이 지나야합니다.) 그런 다음 몇 시간 더 기다렸지만 실행이 완료되지 않았습니다. 어디에 문제가

그런 다음, 이해, 나는 손으로 단계별로 코드 단계를 평가하고 다음 루프의 실행을 완료 할 수있는 것으로 나타났습니다 : 그것은 그냥 간단한 루프

l=1; 
for n=1:max_t 
    for m=1:t(1,n).numberofPoints 
     x_t(l)=t(1,n).matrix(m,1); 
     y_t(l)=t(1,n).matrix(m,2); 
     z_t(l)=t(1,n).matrix(m,3); 
     l=l+1; 
    end 
end 
minx = min(x_t(:)); 
miny = min(y_t(:)); 
minz = min(z_t(:)); 

을 내 최소 점을 x, y, z 좌표로 구하십시오. (이 루프에 문제가 없다고 확신합니다. 내 컴퓨터에서 성공적으로 작동합니다.) 구조체의 최대 및 최소 점을 얻기 위해 루프가 필요하지 않지만 MATLAB을 처음 사용하고 많이 알지 못합니다. 그러므로 그것은 나에게 가장 쉬운 선택처럼 보였다.

내 친구가 내 컴퓨터를 사용할 수 있어야합니다. 숫양이 그 이상의 과정을 수행하기에 충분하지 않기 때문입니다. 따라서이 문제를 해결해야합니다.

동일한 코드가 내 컴퓨터에서 작동하지만 내 친구 컴퓨터에서는 작동하지 않는 이유는 무엇일까요?

+0

정확히 "다음 루프를 완료하지 못했습니다"라는 의미입니까? – carlosdc

+0

@carlosdc for 루프의 실행을 완료하지 않습니까? – Xentius

+0

Amadeus : 갑자기 시작 되나요? 그것은 시작되지 않습니까? 진전이 있니? 얼마나 진행 되었습니까? 오류와 함께 실패합니까? 그것은 내부 루프를 한 번 끝내는가? – carlosdc

답변

5

Matlab R2011a는 growing arrays in a loop 일 때 극적인 성능 향상을 가져 왔으며, R2012a가 그러한 점을 훨씬 개선했다고 생각합니다.

따라서 R2009에서는 사전에 x_t을 할당하지 않으므로 루프를 실행하는 데 시간이 오래 걸립니다.

가 여기에 내가 단순히 사전 할당 고칠 것뿐만 아니라 코드를 향상시킬 수있는 다른 방법은 다음과 같습니다

l=1; 

%# preallocate with NaN, so that the values don't interfere with 
%# taking the minimum later 
lMax = sum([t(1,1:max_t).numberofPoints)]); 
[x_t,y_t,z_t] = deal(NaN(lMax,1)); 

for n=1:max_t 
    for m=1:t(1,n).numberofPoints 
     x_t(l)=t(1,n).matrix(m,1); 
     y_t(l)=t(1,n).matrix(m,2); 
     z_t(l)=t(1,n).matrix(m,3); 
     l=l+1; 
    end 
end 
minx = min(x_t(:)); 
miny = min(y_t(:)); 
minz = min(z_t(:)); 
+0

하지만 두 컴퓨터에서 똑같은 작업을 수행합니다. 그가 자신의 컴퓨터에 미리 할당하지 못한 것은 괜찮 았습니다. 그것은 비효율을 설명 할 것이지만 두 기계의 차이는 아닙니다. – duffymo

+0

@duffymo 그는 초기화되지 않은 배열에서 너무 천천히 움직이지 않는 것을 개발 중입니다. – carlosdc

+0

그래서 두 개의 서로 다른 버전의 Matlab이 설치되어 있다고 가정하고 계십니까? 그것이 사실이라면, 그것은 중요한 차이입니다. 그럴 경우 동의합니다. 나는 그것이 원래의 게시물에서 말한 것을 보지 못했다. 내가 놓치지 않는 한 CPU와 RAM의 차이점만을 언급했다. – duffymo

1

친구의 컴퓨터에서 실행되지 않는 이유를 알 수 없습니다. 프로세서와 RAM 외에도 뭔가 다른 점이 분명합니다.

왜 누군가가 코드를 작성했는지 궁금합니다. 데이터를 벡터에로드하는 두 개의 루프가 있으며 x, y 및 z의 최소값을 찾습니다. 왜 값을 반복하면서 min 값을 찾지 않습니까? min 통화를 할 필요가 없습니다.

저는 Matlab에 익숙하지 않은데, 왜 이렇게 매트릭스를 복사해야하는지 궁금합니다. 행렬은 벡터 또는 배열로 생각할 수 있습니다. 데이터를 복제 할 필요없이 x, y, z 열에서 min을 검색 할 수 없었습니까?

+0

네가 맞다.하지만 내 질문에 "나는 구조체의 최대 점과 최소 점을 얻기 위해 루프가 필요하지 않다는 것을 알고 있지만 MATLAB을 처음 접했을 때 많이 알지 못한다. 그러므로 가장 쉬운 옵션처럼 보였다. 나를." 최소 또는 최대를 직접 적용 할 수 없기 때문에 배열을 복사했습니다. 어쨌든, 나는 최대 값과 최소값을 얻는보다 효율적인 해결책을 찾으려고했다. 하지만 내가 이해할 수 없었던 이유와 왜 내 컴퓨터에서 작동하는 코드가 내 친구의 컴퓨터에서 작동하지 않는지 흥미로운 이유가 궁금합니다. – Xentius

+0

네, 쉽게 min과 max를 얻을 수 있습니다. 아니요, 친구의 컴퓨터가 왜 그렇게하지 않을지 알기에 충분한 정보를 제공하지 않았습니다. 투표를 종료합니다. – duffymo

1

작성한 코드는 여러 가지 이유로 느립니다 ... x_t과 친구를 미리 할당하지 않고 대신 루프에서 성장시킵니다. 그리고 결국 당신은 그들과 아무 것도하지 않고 그들의 최대치를 계산합니다 ...

나는 duffymo에 동의합니다. 왜 전체를 두 번에 대한 루프를 제거하고 쓰기되지

minx = min([t(1,:).matrix(:,1)]) 

또는

minx = min(cellfun(@(x)min(x(:)), {t(1,:).matrix(:,1)}, 'uni',0)); 

또는 경우에 작동하는 도구의 다른 순열?

+0

'minx = min (cellfun (@ (x) min (x (:)) {트랙 (1, :) 행렬 (:, 1)}, 'uni', 0)); 이 유형의 다중 레벨 색인화에 스칼라 색인이 필요합니다. "minx = min ([tracks (1, :) matrix (: 1)] 이 유형의 다중 레벨 색인화에는 스칼라 색인이 필요합니다.' – Xentius

+1

@Amadeus : "또는 귀하의 경우에 적합한 도구의 다른 순열" –

+0

@Amadeus : 예를 들어, http://stackoverflow.com/questions/13575523/matlab-finding-max-of-a-struct를 참조하십시오./13578810 # comment18875467_13578810 –

0

당신이 몇 가지 매우 기본적인 문제 해결 능력, 디버깅 코드를 개발까지를 (따라서 코드 및 프로그래밍을 작성 장군님)은 매우 힘들고 고통스럽고 즐겁지 않을 것입니다. 11시 30 분에 대해 묻고 있습니다.

얼마나 진행됩니까? 실행을 중지하면 (즉, Ctrl-C를 누르십시오) l 값은 무엇입니까?

l 값이 1 인 경우, 이상하게 발현되는 Matlab 라이센스에 몇 가지 문제가있을 수 있습니다. 그 일을 해보십시오.

천천히 진행하고 있습니까? 실행을 중지하면 size(x_t)은 무엇입니까?

size(x_t)이 l (또는 l에 가까울 경우) 배열을 초기화하지 않았습니다. 아마 Jonas의 우수한 답변을 살펴 봐야 할 것입니다.

솔직히 나는이 질문을 너무 현지화 된 것으로 끝내기로 이미 결정했습니다. 아마도 문제를 해결하고 문제를 해결하기 위해 수행 한 작업을 강조하는 방식으로 문제를 해결해야합니다 (친구와 그의 컴퓨터 및 RAM을 강조하는 것 이외에).