Secara tradisional untuk menghitung mean dan standard deviasi dengan loop biasa, biasanya dilakukan dengan cara seperti berikut
Untuk Mean:
clc; clear all; x = randi(12,4000,60); [a,b] = size(x); mean = 0; tic; sd = 0; for i=1:a, for j=1:b mean = mean + x(i,j); end end mean = mean/(a * b ); disp(mean); disp(toc);Untuk SD
tic; SD = 0; for i=1:a for j=1:b SD = SD + (x(i,j) - mean )^2; end end SD = SD / (a * b); SD = sqrt(SD); disp(SD); disp(toc);Untuk menghemat space dan waktu eksekusi maka bisa dilakukan dengan cara yang kedua, yakni
Untuk mean
tic; mean = sum(sum(x(:,:))); mean = mean/(a *b); disp(mean); disp(toc);Untuk SD
tic; SD = sum(sum((x(:,:)-mean).^2)); SD = SD / (a * b); SD = sqrt(SD); disp(SD); disp(toc);Sebenarnya jika Anda eksekusi potongan script di atas, maka untuk SD dan mean itu waktu eksekusinya tidak jauh berbeda antara cara yang pertama dengan cara yang kedua. Karena interpreter MATLAB sendiri sudah melakukan JIT (just in time compilation). Namun yang saya tekankan dalam post kali ini adalah bagaimana cara meningkatkan performa MATLAB dengan mengganti sebanyak mungkin loop dengan vektorisasi pada indeks. Artinya dengan memahami bagaimana transformasi dari cara yang pertama menuju cara yang kedua pada potongan script di atas, Anda dapat menerapkannya pada kasus-kasus lainnya yang lebih kompleks. Karena MATLAB sendiri adalah bahasa interpreter, yang akan sangat boros waktu ketimbang bahasa yang dikompilasi secara langsung semacam bahasa C++. Namun MATLAB kita gunakan karena itu memberikan waktu development yang lebih singkat. Logikanya lebih mahal menggaji seorang programmer ketimbang membeli sebuah hardware.
Adapun keseluruhan script jika digabungkan adalah
% test SD dan mean dengan MATLAB clc; clear all; x = randi(12,4000,700); [a,b] = size(x); mean = 0; tic; sd = 0; for i=1:a, for j=1:b mean = mean + x(i,j); end end mean = mean/(a * b ); disp(mean); disp(toc); tic; SD = 0; for i=1:a for j=1:b SD = SD + (x(i,j) - mean )^2; end end SD = SD / (a * b); SD = sqrt(SD); disp(SD); disp(toc); tic; mean = sum(sum(x(:,:))); mean = mean/(a *b); disp(mean); disp(toc); tic; SD = sum(sum((x(:,:)-mean).^2)); SD = SD / (a * b); SD = sqrt(SD); disp(SD); disp(toc);
No comments:
Post a Comment