การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า
ทุกคนคงทราบอยู่แล้วว่าวิธีการหาค่าเฉลี่ยคือ เอาค่าทั้งหมดมาบวกกัน แล้วหารด้วยจำนวนทั้งหมด
ดังสมการนี้
ผลรัน
คราวนี้โปรแกรมเราก็กิน RAM น้อยลงเยอะเลยครับ
ดังสมการนี้
Avr = sum(X)/length(X)
แต่ในทางปฎิบัติ เราสามารถเก็บค่าได้จำกัด เพราะว่าในขณะที่โปรแกรมกำลังทำงานอยู่ ข้อมูลในตัวแปรทุกตัวจะถูกเก็บเอาไว้ที่ RAM ซึ่งคอมทุกเครื่องมี RAM จำนวนจำกัด ดังนั้นหากเราเก็บข้อมูลไว้ในตัวแปรเยอะเกินไป ก็จะทำให้พื้นที่ RAM ไม่พอใช้งาน ซึ่งจะทำให้คอมพิวเตอร์ค้างได้
ถ้าเราไม่เก็บข้อมูลทุกตัวเอาไว้ แล้วเราจะคำนวณค่าเฉลี่ยได้ยังไงล่ะ?
หลายๆ คนอาจจะกำลังคิดว่าน่าจะคำนวณแบบนี้
ค่าเฉลี่ย = (ค่าใหม่ + ค่าเก่า)/2
อย่างเช่น ค่าเฉลี่ยระหว่าง 1 กับ 2
ค่าเฉลี่ย = (2 + 1)/2 = 1.5
คำตอบก็ถูกต้อง วิธีนี้น่าจะใช้ได้นะ แต่มันใช้ได้จริงรึเปล่า เราลองมาทดสอบกับตัวอย่างอื่นดู เช่น
ค่าเฉลี่ยระหว่าง 1 , 2 และ 3
AV1 = (1+2)/2 = 1.5
AV2 = (AV1+3)/2 = 2.25
จะเห็นว่าผลลัพธ์ไม่ถูกต้อง เพราะ
AV = (1+2+3)/3 = 2
ดังนั้นวิธีการแบบนี้จึงใช้ไม่ได้
แล้ววิธีการที่ถูกต้องควรจะทำยังไงละ มาดูกันเลยครับ
AV = AV - (AV/N)
AV = AV + (X/N)
โดยที่
AV คือ ค่าเฉลี่ย
X คือ ค่าใหม่ที่จะบวกเพิ่ม
N คือ จำนวนข้อมูลทั้งหมด (รวม X ด้วย)
ลองมาดูตัวอย่างโค้ดกันเลยครับ
% ------------------------- MATLAB Programing ------------------------% % Example: How to calculate average without keep value % % Create by: Kritthanit % % Create date: 22-12-2018 % % Blog: https://loglike.blogspot.com % % Fanpage: https://www.facebook.com/Matlab-Programing-194695677296190 % % --------------------------------------------------------------------% clc;clear;close all; x = 1:100; av1 = sum(x)/length(x); disp('True average') disp(av1) av2 = x(1); for m=2:100 av2 = (av2+x(m))/2; end disp('Incorrect method') disp(av2) av3 = x(1); for m=2:100 av3 = (av3 - (av3/m)); av3 = (av3 + (x(m)/m)); end disp('Correct method') disp(av3)
ผลรัน
คราวนี้โปรแกรมเราก็กิน RAM น้อยลงเยอะเลยครับ