lec 11. code optimization
TRANSCRIPT
MATLAB Programming
Vectorization
반복문 대신 벡터 또는 행렬 연산으로 계산하는 방법
• 프로그램 처리 속도 향상됨
각종 행렬 연산을 위해 제공되는 함수들을 최대한 사용
• find 함수 등
n = 100for i = 1:n
A(i) = B(i) + C(i);end
n = 100;A(1:n) = B(1:n) + C(1:n);
2
MATLAB Programming
Vectorization
Vectorized Code와 그렇지 않은 코드의 속도 비교
• 예를 들어 𝑓𝑓 𝑥𝑥 = 𝐴𝐴 sin( ⁄𝑥𝑥 2𝜋𝜋) 를 𝑥𝑥 = 0~2𝜋𝜋 까지 계산
% no vectorization
n = 100000;A = 5;f = zeros(1,100);
tic;t = linspace(0, 2*pi, n);for i = 1:n
f(i) = A * sin(t(i)/(2*pi));endtoc;
Elapsed time is 0.027193 seconds.
% vectorization
n = 100000;A = 5;
tic;t = linspace(0, 2*pi, n);f = A * sin(t/(2*pi));toc;
Elapsed time is 0.004632 seconds.
3
MATLAB Programming
Quiz
10만개의 3차원 포인트와 주어진 한 포인트 간의 유클리디언 거리를
계산하여, 가장 가까운 거리를 갖는 포인트를 찾는 코드를 반복문 (for
문)을 사용하여 작성하고, 다른 하나는 vectorized code로 작성하여
속도를 비교해 봅시다.
• 힌트:
– Vectorized Code의 경우,
• 주어진 한 포인트를 repmat 함수를 사용하여 10만 x 3 행렬 rQ로 만들고, 10만개 포인트와
rQ의 행렬 뺄셈 등을 이용하여 계산
4
MATLAB Programming
Quiz
10만개의 3차원 포인트와 주어진 한 포인트 간의 유클리디언 거리를
계산하여, 가장 가까운 거리를 갖는 포인트를 찾는 코드를 반복문 (for
문)을 사용하여 작성하고, 다른 하나는 vectorized code로 작성하여
속도를 비교해 봅시다.
% no vectorization
N = 100000;D = 3;PTs = rand(N, D);Q = rand(1, D);
tic;
% 이곳에코드를작성하세요.
toc;
% vectorization
N = 100000;D = 3;PTs = rand(N, D);Q = rand(1, D);
tic;
rQ = repmat(Q, N, 1);
% 이곳에코드를작성하세요.
toc;
5
MATLAB Programming
Quiz Sol.
10만개의 3차원 포인트와 주어진 한 포인트 간의 유클리디언 거리를 계산하여,
가장 가까운 거리를 갖는 포인트를 찾는 코드를 반복문 (for 문)을 사용하여
작성하고, 다른 하나는 vectorized code로 작성하여 속도를 비교해 봅시다.
% no vectorization
N = 100000;D = 3;PTs = rand(N, D);Q = rand(1, D);
tic;
D2 = zeros(N,1);for i=1:N
PT = PTs(i,:);D2(i) = sqrt(sum((Q-PT).^2));
end
[VAL2, IDX2] = min(D2)
toc;
% vectorization
N = 100000;D = 3;PTs = rand(N, D);Q = rand(1, D);
tic;
rQ = repmat(Q, N, 1);D = sqrt(sum((rQ-PTs).^2, 2));[VAL1, IDX1] = min(D)
toc;
6
MATLAB Programming
find 함수 사용 시 속도
행렬에서 특정 조건을 만족하는 원소들을 찾기 위해 find 함수를 쓰는
경우와 쓰지 않는 경우의 속도 비교
% find를쓰지않는경우
N = 1000;m = rand(N);
idx = [];
tic;
for i=1:N^2if (m(i) < 0.2)
idx = [idx i];end
end
toc;
Elapsed time is 2.242514 seconds.
% find를쓰는경우
n = 1000;A = 5;
tic;
idx = find(m < 0.2);
toc;
Elapsed time is 0.002795 seconds.
7