2014-11-17 2 views
3

1D 배열 인 메쉬 파일을 가지고있는 오픈 소스 코드를 작업 중입니다. Matlab에서 MESHGRID를 통해 메쉬를 만든 다음 FOR 루프를 사용하여 데이터 열을 쌓아서 파일을 만듭니다. FOR 반복 때문에 매우 오랜 시간이 걸립니다. 아무도 내 프로세스 속도를 향상시킬이 문제에 대한 더 나은 알고리즘을 제안 할 수 있습니다. 사전Meshgrid Matlab에서 하나의 열 배열 만들기

clear all; 
clc; 
close all; 

th = (0:0.5:360)*pi/180; 
r = 0:0.2:1; 
z = 5:.01:15; 
[TH,R,Z] = meshgrid(th,r,z); 
[X,Y,Z1] = pol2cart(TH,R,Z); 




L1 = length(X(:,1,1)) 
L2 = length(Y(1,:,1)) 
L3 = length(Z1(1,1,:)) 

T = 1; 

for i = 1:1:L1 

    for j = 1:1:L2 

     for k = 1:1:L3 

     M(T,1) = X(i,j,k) ; 
     M(T,2) = Y(i,j,k) ; 
     M(T,3) = Z1(i,j,k) ; 
     T = T+1 

     end 


    end 

end 



    dlmwrite('hpts.in',M,'precision','%2.2f','delimiter',' ','-append'); 
+1

은 첫 번째 단계로 'M'을 사전 할당합니다. 또한 M (:, 1) = X (:)라고 추가로 확인할 수 있습니다. – Arpi

답변

0

에 감사 그냥 아닌가요 : 기술적으로 동일한 결과를 얻을 수 있지만

M = [X(:), Y(:), Z1(:)] 

, 당신은 matlab에 첫째 경우 세 번째 차원에 따라 계산하고와 (:) 기술은 열 주요 예입니다 먼저 치수 1을 따라 가야하므로 치수를 재정렬해야하므로 permute(:) 또는 reshape을 사용하십시오. reshape하면 익명 함수를 사용하여 물건을 neaten 수 있습니다

columize = @(A)reshape(permute(A, [3,2,1]), [],1,1) 
M = [columize(X), columize(Y), columize(Z1)] 
0

pol2cart.m으로 해킹을하고이 코드를 사용하여 원하는 결과를 달성하기 위해 meshgrid의 사용자 정의 버전을 사용 -

%// Inputs 
th = (0:0.5:360)*pi/180; 
r = 0:0.2:1; 
z = 5:.01:15; 

%// Start processing 
Mcol1 = cos(th)'*r;      %//' 
Mcol1 = repmat(Mcol1(:).',numel(z),1); %//' 

Mcol2 = sin(th)'*r;      %//' 
Mcol2 = repmat(Mcol2(:).',numel(z),1); %//' 

M = [Mcol1(:) Mcol2(:) repmat(z(:),numel(r)*numel(th),1)]; 

dlmwrite('hpts.in',M,'precision','%2.2f','delimiter',' ','-append'); 

이 될 것으로 보인다을 6x 내 시스템에 M을 미리 할당하여 얻은 코드보다 빠릅니다.

또한 변수에 th의 조옮김을 저장하고 이러한 조옮김 값 - cos(th)'sin(th)'을 사용하는 두 위치에서 사용할 수 있으므로 더 빠르게해야합니다.