프로파일 러를 실행하면 시간이 많이 걸리는 코드가 vdist
이라는 것을 알 수 있습니다. 지구를 타원체로 생각하는 지구상의 두 지점 사이의 거리를 측정하는 프로그램입니다. 코드는 표준으로 보입니다. 어디서 어떻게 개선 될 수 있는지 알 수 없습니다. 초기 의견은 이미 벡터화되었다고 말합니다. MEX 파일로 사용할 수있는 다른 언어로 된 파일이 있습니까? 내가 원하는 건 시간 효율성면에서 개선이다. 다음은 Matlab FEX의 코드에 대한 링크입니다.벡터화 된 Matlab 함수 최적화
109 for i=1:polySize
110 % find the two vectors needed
11755 111 if i~=1
0.02 11503 112 if i<polySize
0.02 11251 113 p0=Polygon(i,:); p1=Polygon(i-1,:); p2=Polygon(i+1,:);
252 114 else
252 115 p0=Polygon(i,:); p1=Polygon(i-1,:); p2=Polygon(1,:); %special case for i=polySize
252 116 end
252 117 else
252 118 p0=Polygon(i,:); p1=Polygon(polySize,:); p2=Polygon(i+1,:); %special case for i=1
252 119 end
0.02 11755 120 Vector1=(p0-p1); Vector2=(p0-p2);
0.06 11755 121 if ~(isequal(Vector1,Vector2) || isequal(Vector1,ZeroVec) || isequal(Vector2,ZeroVec));
122 %determine normals and normalise and
0.17 11755 123 NV1=rotateVector(Vector1, pi./2); NV2=rotateVector(Vector2, -pi./2);
0.21 11755 124 NormV1=normaliseVector(NV1); NormV2=normaliseVector(NV2);
125 %determine rotation by means of the atan2 (because sign matters!)
11755 126 totalRotation = vectorAngle(NormV2, NormV1); % Bestimme den Winkel totalRotation zwischen den normierten Vektoren
11755 127 if totalRotation<10
11755 128 totalRotation=totalRotation*50;
11755 129 end
0.01 11755 130 for res=1:6
0.07 70530 131 U_neu=p0+NV1;
17.01 70530 132 [pos,a12] = vdist(p0(:,2),p0(:,1),U_neu(:,2),U_neu(:,1));
0.02 70530 133 a12=a12+1/6.*res*totalRotation;
70530 134 ddist=1852*safety_distance;
4.88 70530 135 [lat2,lon2] = vreckon(p0(:,2),p0(:,1),ddist, a12);
0.15 70530 136 extendedPoly(f,:)=[lon2,lat2];f=f+1;
< 0.01 70530 137 end
11755 138 end
11755 139 end
병목 역할되는 함수 내 선이 무엇입니까? 또한이 함수를 호출하는 방법의 예를 보여줄 수 있습니까? 루프 내에서 스칼라를 사용하여 호출하는 경우 벡터화 된 코드의 이점을 얻을 수 없습니다. – slayton
벡터화 된 입력을 제공했는지 확인하십시오.이 알고리즘의 일반적인 성능을 향상시키기는 쉽지 않을 것입니다. 그러나 사용하지 않는 부분을 잘라낼 수 있습니까? –
@ slayton- 나는 위의 호출 루프를 포함시켰다. 병목 현상이 발생하는 한, 몇 줄의 줄이 아니라 모든 시간이 걸리지 만 그 종류는 분산되어 있습니다. 예, 일부 줄은 다른 줄보다 시간이 오래 걸리지 만 줄의 가장 높은 줄은 전체 기능의 10 %입니다. – Vikram