사실 R보다는 빠르지만 Matlab도 Loop에서는 C++에 비해 속도가 너무 느리다.
해서 가장 먼저 검토해야 할 것이 Parallel computing 인데, CPU를 모두 동시에 가동하는 방법으로 i7의 경우 8개의 CPU가 있으므로 대략 8배 (실은 6배?) 정도가 빠르다. 근데 Matlab의 경우 Parallel Tool Box를 설치해야 한다.
두번째 대안이 벡터화인데 loop을 사용하지 않는 방법이다. 나도 사실 R에 대한 경험이 더 많기 때문에 매트랩에 대하 기초가 부실한 편인데, 매트랩카페에 가입해서 나의 고민에 대한 질문을 하고 답을 얻었다. 역시 함수를 많이 알아야 한다.
http://cafe.naver.com/mathworks/9040
B = 1000;
PRICE = rand(500,2000);
[N,nb] = size(PRICE);
% bootdata= IDX;
bsdata = randi(N,N,B); % random으로 만듬
Model = zeros(B,nb);
Model1 = zeros(B,nb);
%% code 1
tic
for i = 1:nb;
One = PRICE(:,i);
mBar = mean(One(bsdata));
Model(:,i) = mBar;
end
toc;
%% code2
tic
% make convolution kernel
x = 1 : N;
H = zeros(size(bsdata));
for ii = 1 : B
T = bsdata(:,ii);
H(:,ii) = histc(T,x)./N; % index에 해당하는 average filter
end
H = flipud(H); % conv2 함수는 kernel이 180도 회전하여 적용된다.
% loop마다 filter를 다르게(B) 적용
for ii = 1 : B;
h = H(:,ii);
Model1(ii,:) = conv2(PRICE,h,'valid');
end
toc;