2017-10-21 9 views
0

matlab에서 코딩 중이며 matlab이 "for"루프와 잘 작동하지 않기 때문에 가능한 빨리 처리 할 수 ​​있어야합니다. 다음은 "for"를 다루는 코드의 일부입니다.회 돌이를 회피하는 행렬 계산

for i = 1:size(U,1) 
    for j=1:size(U,2)   
     v(i,j) = U(mod(i+1-1,size(U,1))+1,j) + U(i,mod(j+1-1,size(U,2))+1) ... 
       + U(mod(i-1-1,size(U,1))+1,j) + U(i,mod(j-1-1,size(U,2))+1) - 4*U(i,j); 
    end 
end 

내 매트릭스에는주기적인 경계 조건이 있기 때문에 "mod"기능을 사용하고 있습니다. 이 코드는 matlab의 "del2"함수와 실제로 비슷하지만 matlab 버전은주기적인 경계 조건과 함께 작동하지 않습니다. meshgrid를 사용

+3

"for"루프와 잘 맞지 않는다는 것을 설명해주십시오. –

+0

@BradDay "for"루프를 너무 많이 사용하면 다른 언어로 같은 코드를 작성하면 시뮬레이션 런타임이 늘어날 수 있습니다 C++과 같은 프로그래밍은 더 빠를 것입니다. 어쨌든, "for"와 같은 루프 구조의 대안을 찾고 있는데, 그게 ... – aaa

+0

흠. 라플라시안에 대해 U (i, j)의 이웃을 볼 필요가 있기 때문에 반복 과정없이이 방법을 수행 할 수있는 방법은 없습니다. MATLAB이 코드를 너무 느리게 실행하는 경우 제안 할 수있는 유일한 방법은 [parfor] (https://www.mathworks.com/help/distcomp/parfor.html)와 함께 병렬 for 루프를 사용하는 것입니다. –

답변

0

벡터화 버전 :

[n,m] = meshgrid(1:size(U,2),1:size(U,1)); 
v = U(sub2ind(size(U),mod(m,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n,size(U,2))+1)) ... 
    + U(sub2ind(size(U),mod(m-2,size(U,1))+1,n)) + U(sub2ind(size(U),m,mod(n-2,size(U,2))+1)) - 4.*U; 

또한 preallocating memory에 의해 (크기의 여러 개의 주문에 의한 것) 루프 속도를 높일 수 있습니다. 이 경우 루프 바로 앞에

v = zeros(size(U)); 

을 넣으십시오.