본문 바로가기
Major/Programming

효율적인 Matlab programming

by 알 수 없는 사용자 2009. 8. 26.
반응형

1. 역행렬

A = B*C; 의 경우

C = B \ A; 또는 C = inv(B)*A;

2가지의 계산 법이 있다.

'\'을 이용한 연산은 inverse를 계산하지 않고  Gauss Elimination 사용하여 해를 구하기 때문에

'inv()' 함수를 이용하여 곱하는 것보다 빠른 계산 시간을 가진다.


2. 초기화

for i = 1:5
    t(i) = i*i;
end

위와 같은 예문에서  t라는 배열은 for 문이 돌아갈 때마다 동적으로 메모리 할당이 된다. 즉, for문이 돌아갈 때마다 매번 메모리 할당하고 값을 집어넣는 과정이 반복되기 때문에 수행시간이 오래 걸린다.

따라서 이와 같이 loop안에 있는 배열은 꼭 초기화를 시켜 미리 메모리를 잡아주는 것이 좋다. 아래와 같이 사용하면 됨

N= 5;
t = zeros(1,N);
for i = 1:N
    t(i) = i*i;
end


3. Matrix size > 4,000x4,000

행렬 크기가 4,000x4,000 보다 큰 경우 generailzed minimum residual method (GMRES)와 같은 iterative procedure를 사용하는 것이 효율적이다.

gmres function


4. sparse matrix (희소행렬)

행렬의 원소에 0을 많이 포함하는 경우 full matrix (전행렬; 일반적인 행렬 표현식)으로 계산하는 것 보다 sparse matrix로 계산하는 것이 memory size도 작게 잡아 먹고 계산도 빠르게 수행할 수 있다.
한번 희소행렬 연산을 시작하면 계속적으로 희소행렬이 생성된다. 대개의 경우에 특별히 연산자가 희소성을 파괴하지 않는 이상 희소행렬과 전행렬의 연산결과는 희소행렬로 나타난다.

full(X) ... 행렬 X를 full matrix 형태로 바꿔줌
sparse(X) ... 실제로 행렬 X가 어느 정도 sparse matrix인가와는 무관하게 행렬 X의 원소들 중 그 값이 0인 것들을 모두 제거하여 sparse matrix 형태로 바꿔줌

5. complex number(복소수)
복소수의 허수항을 의미하는 i (또는 j)의 경우 matlab에서 i와 j를 둘다 사용할 수 있다.
 1+2j와 복소수로 사용되는 경우 별 문제는 없지만 
허수항으로만 사용되는 -i*k*r과 같은 경우
1i로 대체하여 사용하는 경우 가장 빠른 계산시간을 가진다.
(프로그래밍할 때 i나 j는 변수로 사용하지 않는 경우 버그를 일으키지 않는데 가장 중요하다.)
반응형

댓글