บทความ

กำลังแสดงโพสต์จาก 2018

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า

รูปภาพ
ทุกคนคงทราบอยู่แล้วว่าวิธีการหาค่าเฉลี่ยคือ เอาค่าทั้งหมดมาบวกกัน แล้วหารด้วยจำนวนทั้งหมด ดังสมการนี้ 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) โ

การใช้งาน Try-Catch จัดการกับ error

รูปภาพ
วิธีการจัดการกับ Error ง่ายๆ อีกวิธีก็คือการใช้ Try-Catch นั่นเองครับ คำสั่ง try-catch ทำหน้าที่ "ละเลย errror" ครับ ผมให้นิยามแบบนี้ละกัน 5555+ คือหากเป็นโค้ดโปรแกรมปกติ เมื่อเกิด error ขึ้น โปรแกรมจะหยุดทำงานทันที แต่หากเราใช้ try-catch โปรแกรมก็จะ "ละเลย" หรือ "ไม่สนใจ" error นั้น แล้วทำงานต่อไป เหมือนไม่มีอะไรเกิดขึ้น มาดูตัวอย่างกันดีกว่าครับ % ------------------------ MATLAB Programing -------------------------% % Example: How to use try-catch % % Create by: Kritthanit % % Create date: 20-12-2018 % % Blog: https://loglike.blogspot.com % % Fanpage: https://www.facebook.com/Matlab-Programing-194695677296190 % % --------------------------------------------------------------------% clc ; clear ; close all ; try % normal process S = load ( 'test01.txt' ) ;

ว่าด้วยเรื่องของ ERROR

รูปภาพ
ในบทความก่อนหน้านี้ ผมได้อธิบายวิธีการดู error ใน MATLAB ไปแล้วนะครับ แต่ในการเขียนโปรแกรมระดับสูงนั้น error ไม่ได้มีแค่เท่าที่ตาเห็นนะครับ ซึ่งการแก้ไขก็จะยากขึ้นไปอีก ดังนั้นในบททความนี้ เราจะมาดูกันครับว่า error มันมีกี่ประเภท อะไรบ้าง ประเภทของ error ประเภทแรก เรียกว่า Compile error คือ error ที่เกิดตอนเวลาคอมไพล์โปรแกรม ซึ่งเกิดจากเราเขียนโค้ดไม่ถูกนั่นแหละครับ ก็แก้ด้วยการกลับไปเขียนให้ถูกซะ ประเภทที่สอง เรียกว่า Runtime error คือ error ที่เกิดตอนรันโปรแกรม บางคนอาจจะสงสัยว่า ถ้าคอมไพล์แล้วไม่ error โปรแกรมก็น่าจะถูกต้องแล้วหนิ ทำไมเวลารันถึงมี error อยู่อีกละ? ดังนั้นเราจะมาดูกันครับว่าถ้าโค้ดไม่ผิด ทำไมรันแล้วถึง error ได้ละ Runtime error มีแบบไหนบ้าง? 1. โปรแกรมทำงานได้ปกติ (คำนวณผลลัพธ์ออกมาได้) แต่คำตอบผิด เป็นเคสที่เกิดขึ้นบ่อยมากครับ (และคนที่เขียนก็ไม่รู้ตัวด้วยว่าผิด) ปัญหานี้เกิดจาก "มื่อใหม่" ที่ไม่เข้าใจความหมายของ "คำสั่ง" ดีพอ แล้วก็นำไปใช้แบบผิดๆ เช่น >> A = B.*C; >> D = B*C; หลายๆ คนไม่เข้าใจว่าการใช้ ดอท-คูณ (.*

โปรแกรม Error แก้ยังไง?

รูปภาพ
ถามมาบ่อยมากกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกกก สำหรับคำถามนี้ ซึ่งทุกคนมักจะมาแนวนี้...."พี่ค่ะ ช่วยดูโปรแกรมให้หน่อยค่ะ มัน error" แล้วส่งก็ส่งรูปแบบนี้มาให้ผมดู ซึ่งมันไม่ได้ช่วยอะไรเลย เพราะอะไรรู้ไหมครับ? เพราะว่าส่วนข้อความที่มันแจ้งเตือน error มันมองไม่เห็นเลย แล้วข้อความแจ้งเตือน error นี่มันอยู่ตรงไหนละ? หลายๆ คนอาจจะยังไม่รู้ คำตอบคือ มันอยู่ใน Command window ครับ (ในรูปคือส่วนที่อยู่ตรงกลาง ด้านล่าง) เวลาเราเขียนโปรแกรมแล้วมี error อะไรก็ตาม มันจะมีข้อความแจ้งเตือน error แสดงที่หน้า command window เสมอ ซึ่งโปรแกรม MATLAB มันแจ้งเตือนได้ละเอียดมากๆ ถึงขั้นที่ว่า error ในไฟล์อะไร บรรทัดไหน error เพราะอะไร คือ แค่อ่านดูนิดเดียวก็จะรู้แล้วว่าต้องแก้ตรงไหน แต่....ทุกคนก็มักจะอ้างว่า "อ่านภาษาอังกฤษไม่ออก" ทั้งๆ ที่ทุกวันนี้ก็มี google translate ให้ใช้ละ ไม่ต้องไปเปิด dictionary เหมือนสมัยก่อนละ เราลองมาดูกันเต็มๆ นะครับว่าข้อความ error ที่แจ้งเตือนใน command window มันบอกอะไรเรา ซึ่งสิ่งที่เราต้องดูก็คือ error ตัวที่อยู่บนสุด ในข้อความที่มันแ

Syntax Highligh วิธีการแสดงโค้ดในหน้าเว็บ

รูปภาพ
Syntax Highlight คืออะไร? ก็คือการแสดงโค้ดโปรแกรม ให้มันดูต่างจากตัวหนังสือ หรือข้อความธรรมดาที่เราเขียนบนเว็บนั่นแหละครับ ถ้าใครอ่านบนทความอื่นๆ ของผม ก็จะเห็นส่วนที่เป็นโค้ด ซึ่งต่างจากส่วนข้อความธรรมดาอย่างชัดเจน นั่แหละครับคือ Syntax Highlight การทำ Syntax Highlight ทำได้หลายวิธีครับ ส่วนมากก็จะเป็นการใช้งาน javascript ฟรีต่างๆ ที่ปล่อยให้ใช้กัน ซึ่งมันจะมีปัญหาอยู่อย่างหนึ่งคือ มันจะทำให้หน้าเว็บเราโหลดช้าลง และวันดีคืนดี เกิดผู้ให้บริการเขาปิดบริการไปละ Syntax Highlight ทั้งหมดที่เราทำไว้ ก็เจ้งสิครับ หาไปหามา เลยมาเจอเว็บนี้ครับ ตอบโจทย์ได้ดีเลยทีเดียว แถมใช้งานง่ายมาก https://tohtml.com/matlab/ ผลลัพธ์ที่ได้ จะเป็นโค้ด HTML ที่ฝังลงไปในหน้าเว็บเลยครับ ไม่จำเป็นต้องไปเพิ่ม javascript ให้ยุ่งยาก ซึ่งหมายความว่าโค้ดชุดนี้จะอยู่บนหน้าเว็บเราตลอดไป ไม่หายไปไหนแน่นอน วิธีการใช้งานก็ง่ายมากครับ copy โค้ดของเรามาวางในช่อง Source code แล้วคลิกที่ปุ่ม Highlight จากนั้นคลิกปุ่ม Copy to clipboard เพื่อ copy HTML code แล้วเอามาวางในหน้าเว็บของเรา แค่นี้ก็เสร็จเรียบร้อยครับ

MATLAB OCR 7-Segment Part5

รูปภาพ
Step 4 เชื่อมต่อ 7 Segment ก็ตามชื่อนั่นแหละครับ ตัวเลข 7 Segment 1 ตัว จะมีส่วนประกอบอยู่ 7 ส่วน เรียงลำดับจาก A ถึง F ตามนี้ครับ ซึ่งเราจะเห็นว่าแต่ละส่วนนั้น มันไม่ได้เชื่อมต่อกันเลย (ถ้ามันเชื่อมต่อกันแล้วจะเรียกเป็นส่วนได้ไงเนอะ ฮ่าๆๆ) ซึ่งตรงจุดนี้แหละครับ ที่มันทำให้เกิดปัญหา เพราะว่าโปรแกรมมันจะไม่รู้ว่า ทั้ง 7 ส่วนนี้มันคือตัวเลขตัวเดียวกันนะ เพราะไม่ใช่ว่าตัวเลขทุกตัวจะมองเห็นครบ 7 ส่วนเสมอ เช่น เลข 1 แสดงด้วย 2 ส่วนเท่านั้น คือ B กับ C ดังนั้นเราจะมาทำให้แต่ละส่วนมันเชื่อมต่อกัน โดยใช้วิธีการทาง image processing ที่เรียกว่า "dilate" ซึ่งจะทำให้ภาพขยายตัวออกตามแนวโครงสร้างของมันครับ แต่ปัญหาคือ แล้วเราจะขยายมันออกไปเท่าไรละ? ถ้าเราจะให้โปรแกรมทำงานได้ถูกต้องกับภาพนี้ภาพเดียว มันก็ไม่เป็นปัญหาหรอกครับ เราก็แค่ค่อยๆ ลองปรับไปเรื่อยๆ จนเห็นมันเชื่อมต่อกันหมด แค่นั้นก็พอละ แต่ถ้าเราจะให้โปรแกรมของเรามันทำงานได้กับทุกภาพ เราก็ต้องให้โปรแกรมมันคำนวณเอง ว่าจะปรับขยายไปเท่าไร ซึ่งในจุดนี้ เราจะใช้คำสั่ง bwlabel เข้ามาช่วยนับครับ โดยคำสั่ง bwlabel จะคืนค่

MATLAB OCR 7-Segment Part4

รูปภาพ
Step 3 นับจำนวนตัวเลขในภาพ ถ้าใครใช้กล้อง step นี้ก็ถือเป็นการ calibate กล้องไปในตัวด้วยครับ ถ้าเราปรับกล้องได้ตรงดีแล้ว จำนวนตัวเลขที่โปรแกรมนับได้ ก็จะต้องเท่ากับจำนวนตัวเลขที่เราเห็นครับ ในขั้นตอนนี้ผมจะแยกโค้ดชุดนี้ไปเขียนไว้อีกไฟล์หนึ่งนะครับ โดยจะเขียนในรูปแบบของฟังก์ชัน เพื่อให้สะดวกต่อการเรียกใช้งาน วิธีการก็ง่ายๆ ครับ แค่ new m-file ขึ้นมาใหม่ แล้วก็วางโค้ดชุดนี้ลงไป function num = allnum ( bw ) ax = sum ( bw ) ; ay = sum ( bw , 2 ) ; bwx = ax > 0 ; bwy = ay > 0 ; [ lbx , ngx ] = bwlabel ( bwx ) ; [ lby , ngy ] = bwlabel ( bwy ) ; num = ngx * ngy ; end เสร็จแล้วก็บันทึกเลยครับ ข้อควรระวัง ห้ามบันทึกไฟล์เป็นชื่ออื่นนะครับ ต้องบันทึกเป็นชื่อเดียวกับชื่อฟังก์ชันเท่านั้น ซึ่งในที่นี่ก็คือฟังก์ชัน allnum โดยไฟล์นี้ต้องบันทึกไว้ในโฟลเดอร์เดียวกันกับโปรแกรมหลักนะครับ คราวนี้ เราก็เรียกใช้งานฟังก์ชันนี้ในโปรแกรมหลักของเราได้แล้วครับ %check how many number nb = allnum ( xbw ) ; ตัวแปร nb ก็คือ จำนวนตัวเลขที่อยู่ในภาพ เราก็ลองเช็คดูนะครับว่า

MATLAB OCR 7-Segment Part3

รูปภาพ
Step 2 ลบขอบภาพ หากรูปภาพที่คุณใช้ หลังจากแปลงเป็นภาพไบนารี่แล้ว มันมีขอบสีขาวติดตัวมาด้วย เราก็จำเป็นต้องลบมันออกก่อนนะครับ ก่อนที่จะทำ step ถัดไปได้ แต่ถ้าใครไม่มีขอบสีขาวติดมาด้วย ก็ข้าม step นี้ได้เลย ส่วนภาพที่ผมใช้ในตัวอย่างนี้ พอแปลงเป็นภาพไบนารี่แล้ว มันจะมีขอบสีขาวติดมาด้วยแบบนี้นะครับ ดังนั้นเราต้องลบมันออกก่อนครับ โดยใช้คำสั่ง ต่อไปนี้ %delte edge bw ( 1 , : ) = true ; bw ( end , : ) = true ; bw ( : , 1 ) = true ; bw ( : , end ) = true ; [ lb , ng ] = bwlabel ( bw ) ; delbw = lb = = 1 ; xbw = bw - delbw ; หลังจากนั้น ลองใช้คำสั่ง imshow(xbw) ขึ้นมาดูครับ เราก็จะเห็นว่าขอบสีขาวหายไปแล้ว ถ้าทำแล้วได้อย่างในรูปนี้ (ขอบสีขาวหายไปหมดแล้ว) ก็ถือว่าใช้ได้ครับ ไปขั้นตอนต่อไปได้เลย << Part2 Part4 >>

MATLAB OCR 7-Segment Part2

รูปภาพ
Step 1 อ่านภาพและแปลงเป็นไบนารี่ (ขาว-ดำ) ภาพที่ใช้ในตัวอย่างนี้ คือ ภาพนี้นะครับ ถ้าใครจะเอาภาพนี้ไปใช้เป็นตัวอย่าง ก็คลิกขวาแล้วเลือก "บันทึกภาพ" ได้เลยครับ 7segment.png มาเริ่มเขียนโปรแกรมกันเลยครับ clc ; clear ; close all ; pic = imread ( '7segment.png' ) ; bw = im2bw ( pic , 0.1 ) ; เนื่องจากเป็นการเริ่มเขียนโปรแกรมขึ้นมาใหม่ ผมมักจะแนะนำให้ใส่โค้ด clc;clear;close all; ไว้บรรทัดบนสุดเสมอนะครับ เพื่อทำการเคลียร์หน้าจอ command window (clc) และเคลียร์ข้อมูลตัวแปรใน workspace (clear) สุดท้ายคือปิดหน้า figure ทั้งหมดที่เปิดอยู่ (close all) ซึ่งในการใช้งานจริง การเคลียร์ข้อมูลก่อนรันแบบนี้จะมีประโยชน์มากครับ เพราะว่า... 1. เราไม่ต้องสับสนกับตัวแปรเก่า หรือตัวแปรจากโปรแกรมอื่นๆ เช่น ถ้าเราไม่ลบข้อมูลตัวแปรในโปรแกรมก่อนหน้านี้ ซึ่งอาจมีตัวแปร pic เหมือนกัน แต่มันเก็บข้อมูลคนละรูป แล้วในโปรแกรมนี้เราดันลืมเขียนตัวแปร pic ให้อ่านภาพใหม่ โปรแกรมเราก็จะยังทำงานได้นะครับ เพราะมันเจอตัวแปร pic ของโปรแกรมเก่า แต่ผลที่ได้คือโปรแกรมทำงานผิดพลาด 2

MATLAB OCR 7-Segment Part1

รูปภาพ
 7-Segment OCR ( Optical character recognition)  แปลเป็นไทยง่ายๆ ก็คือการรู้จำตัวเลข และตัวอักษรนั่นแหละครับ  ซึ่งโดยปกติแล้วตัวเลข จะรู้จำง่ายกว่าตัวอักษรอยู่แล้ว และความแม่นยำก็สูงด้วย เพราะตัวเลขมีแค่ 10 รูปแบบเท่านั้น (ก็คือเลข 0 - 9) ดังนั้นโดยปกติแล้ว การรู้จำตัวเลข จึงไม่ค่อยมักมีปัญหาอะไร ยกเว้นแต่....   เจ้าตัวปัญหานี่เลยครับ 7 - Segment แล้วทำไมเจ้าตัวเลขแบบนี้ถึงมีปัญหาละ? ก็เพราะว่ามันแบ่งออกเป็น 7 ส่วนนี่แหละครับ มันเลยมีปัญหา ลองจินตนาการถึงเวลาที่เราเขียนตัวเลขดูนะครับ ตัวเลขทุกตัวจะถูกเขียนโดยไม่ยกปากกา และเส้นทุกเส้นจะเชื่อมต่อกันทั้งหมด ทำให้เวลาเขียนโปรแกรม เราสามารถกำหนดได้ง่ายๆ ว่าเส้นขีดๆ แต่ละชุด คือตัวเลข 1 ตัว แต่ 7-Segment มันดันมี 7 ส่วน และแต่ละส่วนก็ไม่เชื่อมต่อกันอีก แล้วก็ใช่ว่ามันจะแสดงออกมาครบ 7 ส่วนทุกครั้ง อย่างเช่น เลข 1 มันก็แสดงออกมาแค่ 2 ส่วน เลข 7 แสดงออกมาแค่ 3 ส่วน ดังนั้นๆ เราจึงไม่สามารถกำหนดเงื่อนไขแบบเดิมได้อีก เพราะตัวเลขแต่ละตัวมันมีหลายขีด ไม่ได้มีขีดเดียวเหมือนเดิมแล้ว  แล้วเราจะแก้ปัญหานี้ยังไงละ? จริงๆ แล้ววิธี

Hello world - สวัสดีชาวโลก

รูปภาพ
Hello world - สวัสดีชาวโลก  วันนี้วันที่ 13 ธันวาคม 2018 เป็นวันแรกที่ผมเริ่มใช้ blog ด้วยเหตุผลที่ว่า ผมต้องการจะเผยแพร่บทความเกี่ยวกับการเขียนโปรแกรม MATLAB จากเพจของผมเอง แต่ดูๆ แล้วผมเห็นว่าแฟนเพจมันไม่เหมาะสำหรับใช้เก็บบทความ ก็เลยมองหาทางเลือกอื่น ตอนแรกก็มองๆ ดูพวก google web สร้างง่าย และมีเครื่องมือให้เยอะดี แต่ติดปัญหาตรงที่ว่า ผมเคยใช้มันแล้วนี่แหละ ก็เลยอยากหาอะไรลองเล่นใหม่ๆ บ้าง สุดท้ายก็มาลงเอยที่ blog นี่แหละครับ เริ่มต้นมา พูดซะแบบว่า blog นี้จะมีแต่สาระเต็มที่ จริงๆ แล้วไม่ใช่เลยนะครับ ฮ่าๆๆๆ โดยส่วนตัวแล้วผมชอบทำตัวไร้สาระมากกว่า ชอบอ่านนิยาย อ่านการ์ตูน ดูแอนนิเมะ ดูหนัง ฟังเพลงบ้าง อะไรทำนองนั้น ส่วนการเขียนโปรแกรมนั้นทำเป็นงานอดิเรก ตอนว่างๆ หรือตอนที่ขี้เกียจเท่านั้นครับ (ฮ่าๆๆๆ) ดังนั้นใครที่เข้ามาเยี่ยมชม blog ของผม ก็อย่าคาดหวังอะไรมากนะครับ สาระอาจจะหายากนิดนึง เพราะส่วนมากผมมักจะชอบเขียนสาระไว้ในเรื่องไร้สาระครับ งงไหม ฮ่าๆๆๆ ก็เรื่องที่มีสาระมันน่าเบื่อไง ขนาดผมเป็นคนเขียนเองยังเบื่อเลย ก็เลยต้องเอามันไปผสมกับเรื่องไร้สาระ จะได้อ่านง่ายๆ ข

ความเห็น