Friday, November 21, 2014

Cara menghitung Nilai Rata-Rata dan Standard Deviasi dengan MATLAB

Berikut ini saya akan berikan contoh bagaimana menghitung nilai rata-rata (mean) dan standard deviasi dengan MATLAB secara efisien. Rumus untuk mean dan standard deviasi berturut-turut diberikan oleh persaman
12
2

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: