วันนี้ผู้เขียนจะมาอธิบายถึงโปรแกรมบวก ลบ คูณ หารเมทริกซ์ที่เป็นส่วนหนึ่งของวิชา Data Structure & Algorithm โดยจุดหลักที่โปรแกรมนี้ใช้คือหัวข้อ recursive คือฟังก์ชั่นที่เรียกใช้ตัวเองซ้ำๆ จะใช้ในการหา determinant ของเมทริกซ์ และการเก็บข้อมูลจะเก็บในรูปแบบของ array ทั้งนี้ผู้เขียนหวังว่าผู้อ่านจะมีความรู้พื้นฐานของการบวก ลบ คูณ หารเมทริกซ์กันมาแล้ว ในที่นี้จะกล่าวถึงการเขียนโปรแกรมในภาษาซี เพื่อใช้หาคำตอบดังกล่าว
รายละเอียดโปรแกรม
- โปรแกรมทำการคิดบวก ลบ คูณ หาร เมทริกซ์จัตุรัสขนาดตั้งแต่ 2×2 ถึง 10×10
- เลือกป้อนข้อมูลได้ 2 แบบ คือ รับไฟล์โดยตรง (พิมพ์ทีละค่า) และแบบรับข้อมูลผ่าน text file ที่ชื่อ Input.txt ซึ่งวิธีนี้เหมาะกับการป้อนข้อมูลเมทริกซ์ที่มีขนาดใหญ่
- ผลลัพธ์ทั้งบวก ลบ คูณ และหารจะมีการแสดงในตัวโปรแกรมและนำผลลัพธ์เก็บเข้า text file ที่ชื่อ Output.txt
- โปรแกรมจะสร้างไฟล์ trace.txt เพื่อแสดงวิธีการหา determinant และ inverse อย่างละเอียด
ตัวอย่างการรับค่าและพิมพ์ค่าใส่ไฟล์
ข้อกำหนดของโปรแกรม
- ขนาดของเมทริกซ์จะต้องเป็นจัตุรัส ขนาดไม่เกิน 10×10 ทั้งนี้หากต้องการให้คำนวนได้มากกว่า 10×10 สามารถปรับขนาด array ที่ได้ทำการจองไว้ (ใช้หน่วยความจำของเครื่องมากขึ้น)
- ค่าจากไฟล์ที่โปรแกรมจะรับข้อมูล ไฟล์ต้องมีชื่อว่า Input.txt กรณีไฟล์ชื่ออื่นต้องทำการแก้ชื่อไฟล์ ในตัวโปรแกรม และไฟล์ต้องอยู่ folder เดียวกันกับตัวโปรแกรม
- การรับข้อมูลทางไฟล์ ภายในไฟล์จะต้องระบุขนาดของเมทริกซ์ก่อน แล้วจึงตามด้วยข้อมูล
- ค่าที่ใช้ในการคำนวนเป็นแบบ float แต่กำหนดให้แสดงผลเป็นทศนิยมเพียง 2 ตำแหน่ง
- ค่าที่ได้จากการคำนวนจะมีการแสดงผลในโปรแกรม และเก็บเข้าสู่ไฟล์ที่ชื่อ Output.txt หากมีไฟล์นี้อยู่แล้ว ไฟล์จะถูกเขียนทับ หากไม่มีไฟล์ชื่อนี้อยู่ โปรแกรมจะทำการสร้างไฟล์ขึ้นมาใหม่ folder เดียวกันกับโปรแกรม ซึ่งผลที่แสดงในไฟล์จะได้แก่ การทวนโจทย์ (Given Matrix), ผลบวก, ลบ, คูณ, determinant ของ B และผลหาร
- โปรแกรมจะแสดงวิธีคิด determinant และ inverse อย่างละเอียด โดยเก็บเข้าสู่ไฟล์ที่ชื่อ trace.txt หากมีไฟล์นี้อยู่แล้ว ไฟล์จะถูกเขียนทับ หากไม่มีไฟล์ชื่อนี้อยู่ โปรแกรมจะทำการสร้างไฟล์ขึ้นมาใหม่ใน folder เดียวกันกับโปรแกรม
ตัวอย่างโปรแกรม
อธิบาย code
โปรแกรมบวก ลบ คูณ หารเมทริกซ์เขียนด้วยภาษาซีมีความยาวทั้งสิ้น 405 บรรทัด ใช้ libraries ทั้งหมด 3 ตัว ได้แก่
- math.h เพราะมีการใช้ absolute ในการคำนวณ
- stdio.h เพราะใช้คำสั่งพื้นฐานอย่าง printf, scanf
- string.h เพราะมีการใช้ sting ใน function trace_matrix
มีตัวแปรแบบ define ที่เป็นตัวแปรคงที่ไม่มีการเปลี่ยนค่าตลอดการทำงาน 4 ตัว ได้แก่
- MAX_SIZE ใช้ในการกำหนดค่า array สูงสุดในเมทริกซ์ ในที่นี้จำกัดไว้ที่ 10 ดังนั้น
เมทริกซ์จะคำนวณได้ขนาดสูงสุดคือ 10 x 10 ถ้าต้องการเพิ่มให้คำนวณได้มากกว่านี้สามารถปรับแก้ได้ที่ตัวแปรนี้ - MAX_ERROR ใช้ในการกำหนดค่าการปัดเศษในฟังก์ชั่น roundoff
- END_WITH_SUCCESS ใช้ในการ return ค่าเมื่อฟังก์ชั่นรันสำเร็จ จะให้ค่าคืนเป็น 0
- END_WITH_ERROR ใช้ในการ return ค่าเมื่อฟังก์ชั่นรันไม่สำเร็จ จะให้ค่าคืนเป็น -1
มีการใช้ global variables ตัวแปรที่ทุกฟังก์ชั่นจะมองเห็นเป็นค่าเดียวกันทั้งหมด 6 ตัวแปร ได้แก่
- dimension เป็นตัวแปรประเภท integer ใช้สำหรับเก็บค่าขนาดของเมทริกซ์ที่ต้องการจะคำนวณ เป็นตัวเลขเดี่ยว เช่น 5 หมายถึงคำนวณเมทริกซ์ขนาด 5 x 5
- matrixA เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า input matrix A
- matrixB เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า input matrix B
- matrixC เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า output matrix C
- *Output เป็นตัวแปรแบบ pointer ที่จะใช้ชี้ไปยังตำแหน่งไฟล์ Output.txt
- *Trace เป็นตัวแปรแบบ pointer ที่จะใช้ชี้ไปยังตำแหน่งไฟล์ Trace.txt
Function
ภายในโปรแกรมประกอบไปด้วยฟังก์ชั่นทั้งหมด 16 ฟังก์ชั่น ดังที่แสดงในภาพด้านล่าง
Function main
Return type: integer
Parameter: ไม่มี
Return: END_WITH_ERROR ซึ่งมีค่าเท่ากับ -1 หรือ END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ฟังก์ชั่นนี้เป็นส่วนหลักในโปรแกรม โดยตัวโปรแกรมจะเริ่มจากฟังก์ชั่นนี้ ขั้นตอนการทำงานคือ เมื่อเริ่มโปรแกรม จะมีการเรียกฟังก์ชั่น read_data เพื่อรับค่า input เข้าสู่โปรแกรม จากนั้นจะทำการตรวจสอบว่าโปรแกรมสามารถเปิดหรือสร้างไฟล์ Output.txt ได้หรือไม่ ถ้าไม่สามารถโปรแกรมจะแสดง Error ว่า “ERROR: Cannot open [Output.txt]” และจบโปรแกรมทันที แต่ถ้าสามารถโปรแกรมจะตรวจสอบต่อว่าสามารถเปิดหรือสร้างไฟล์ Trace.txt ได้หรือไม่ ถ้าไม่สามารถจะแสดง Error ว่า “ERROR: Cannot open [Trace.txt]” และจบโปรแกรม หากสามารถกระทำการกับไฟล์ทั้งสองได้ โปรแกรมจะเริ่มทำการคำนวณ
ขั้นตอนในการคำนวณจะเริ่มจากการเรียกฟังก์ชั่น print_input เพื่อทวนโจทย์หรือทวน input ที่โปรแกรมรับค่าเข้ามาโดยแสดงผลทั้งในหน้าต่างโปรแกรม (console) และในไฟล์ Output.txt และเรียกฟังก์ชั่น plus, minus, multiply, divide หรือบวก ลบ คูณ หาร ตามลำดับ โดยในทุกขั้นตอนจะแสดงผลลัพธ์การคำนวณทั้งในตัวโปรแกรมและในไฟล์ Output.txt ซึ่งสำหรับฟังก์ชั่น divide จะมีการแสดงวิธีคำนวณ determinant และ inverse ใน Trace.txt ด้วย เมื่อจบการคำนวณโปรแกรมจะทำการปิดไฟล์ Output.txt และ Trace.txt เป็นอันจบโปรแกรม
Function roundoff
Return type: float
Parameter: float R
Return: R หรือ 0.0
ฟังก์ชั่นมีการรับค่า float หนึ่งค่าให้ชื่อว่า R และจะมีการตรวจสอบว่า
absolute ของ R > MAX_ERROR ( 10-6 ) หรือไม่ ถ้ามากกว่าให้ส่งค่า R กลับ แต่หากน้อยกว่าให้ส่งค่า 0 กลับไป
ฟังก์ชั่นนี้มีเพื่อปัดเศษเลขเป็น 0 เมื่อตัวเลขทศนิยมนั้นมีค่าน้อยกว่า 10-6 ให้มีค่าเท่ากับ 0 เหตุที่จำเป็นจะต้องมีฟังก์ชั่นนี้เพื่อกันไม่ให้โปรแกรมแสดงผลว่า -0.0 เนื่องมาจากคำนวณได้ตัวเลข -0.00000008 เป็นต้น
Function print_matrix
Return type: integer
Parameter: float matrix[MAX_SIZE] [MAX_SIZE]
Variables: i และ j เป็น integer
Return: END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ฟังก์ชั่นมีการรับค่า Array สองมิติขนาดเท่ากับ MAX_SIZE * MAX_SIZE โดยให้ชื่อว่า matrix และมีการสร้างตัวแปร i และ j เป็น integer และใช้ for loop แสดงค่า matrix ในหน้าจอ และพิมพ์ลงไฟล์ Output.txt เมื่อแสดงผลครบจะส่งค่า END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0 กลับไปเป็นอันจบฟังก์ชั่น
Function readfromuser
Return type: integer
Variables: i และ j เป็น integer
Return: END_WITH_ERROR ซึ่งมีค่าเท่ากับ -1 หรือ END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ฟังก์ชั่นนี้จะทำการรับค่าจาก user โดยการสร้างตัวแปร i และ j แบบ integer เพื่อใช้ในการวนลูปของตัว array ขนาดสองมิติ โดยเริ่มต้นการทำงานจะรับค่าขนาด (dimension) ของเมทริกซ์จาก user จากนั้นทำการตรวจสอบขนาดของเมทริกซ์ว่าตรงกับเงื่อนไขที่ขนาดมากกว่า 1 น้อยกว่าหรือเท่ากับ 10 หรือไม่
- กรณีที่ใช่ วนลูปรับค่าใส่เมทริกซ์ A และ B ตามลำดับ โดยนับจากแถว 1 หลัก 1 ไปจนแถว 1 หลักสุดท้าย และไล่ไปจนจบที่แถวสุดท้ายหลักสุดท้าย
- กรณีที่ไม่ใช่ ตรวจสอบว่าขนาดมีค่าเท่ากับ 1 หรือไม่
- ใช่ แสดงผลแจ้งกลับ “Idiots! Use calculator!!!”
- ไม่ใช่ แสดงผลแจ้งกลับ “An error has occurred. Make sure your dimension is a real number which is less than or equal to 10”
Function readfromfile
Return type: integer
Variables: i และ j เป็น integer ส่วน *Input เป็น pointer ชี้ไปตำแหน่งของไฟล์ Input.txt
Return: END_WITH_ERROR ซึ่งมีค่าเท่ากับ -1 หรือ END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ฟังก์ชั่นนี้ใช้เพื่อรับ input เมทริกซ์จากไฟล์ Input.txt โดยสร้างตัวแปรแบบ pointer ขึ้นมาเพื่อแสดงตำแหน่งของไฟล์ และทำการอ่านค่าในไฟล์ด้วยคำสั่ง fopen ในโหมด r หรือ read จากนั้นทำการอ่านข้อมูลขนาดของเมทริกซ์ แล้วตรวจสอบขนาดของเมทริกซ์และส่งค่ากลับเช่นเดียวกันกับในฟังก์ชั่น readfromuser
ไฟล์ Input.txt จะต้องอยู่ folder เดียวกันกับตัวโปรแกรมภายในไฟล์จะต้องประกอบไปด้วยสามส่วนนั่นก็คือ
- ขนาดของเมทริกซ์ เช่น 2, 3, 7, 10 เป็นต้น
- เมทริกซ์ตัวแรก โดยใส่ให้สอดคล้องกับขนาดของเมทริกซ์ เช่น ถ้าขนาดเป็น 3 นั่นหมายถึงต้องใส่ตัวเลขแบบ float ทั้งหมด 3×3 = 9 ตัว เป็นต้น
- เมทริกซ์ตัวที่สอง โดยใส่ให้สอดคล้องกับขนาดของเมทริกซ์ เช่นเดียวกับเมทริกซ์ตัวแรก
Function read_data
Return type: integer
Variables: choice เป็น integer
ฟังก์ชั่นนี้ใช้สำหรับการให้ user เลือกว่าจะป้อนค่า input ของเมทริกซ์ทั้งสองด้วยวิธีใด
- กรณีป้อน input จากหน้าจอโปรแกรม ให้พิมพ์ 1 แล้วโปรแกรมจะเรียกใช้ฟังก์ชั่น readfromuser
- กรณีป้อน input จากไฟล์ Output.txt ให้พิมพ์ 2 แล้วโปรแกรมจะเรียกใช้ฟังก์ชั่น readfromfile
Function print_input
Return type: integer
Return: END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ใช้สำหรับการทวนค่า input ที่โปรแกรมได้รับมาทั้งจาก user หรือจากไฟล์ Input.txt ซึ่งจะแสดงผลทั้งในตัวโปรแกรมและในไฟล์ Output.txt โดยโปรแกรมจะมีการเรียกใช้ฟังก์ชั่น print_matrix และใส่ parameter เป็น matrixA และ matrixB ตามลำดับ
Function plus
Return type: integer
Variables: i และ j เป็น integer
ฟังก์ชั่นใช้สำหรับการบวกเมทริกซ์โดยจะทำการวนลูปหาผลบวกระหว่าง matrixA และ matrixB จากนั้นนำไปเก็บใน matrixC แล้วจึงแสดงผลผ่านทางโปรแกรม และไฟล์ Output.txt โดยการเรียกฟังก์ชั่น print_matrix และใส่ parameter matrixC ซึ่งเป็นผลลัพธ์ ตัวฟังก์ชั่นไม่มี parameter เพราะตัวแปรทั้งสามเป็นแบบ global variables
Function minus
Return type: integer
Variables: i และ j เป็น integer
ฟังก์ชั่นใช้สำหรับการลบเมทริกซ์โดยจะทำการวนลูปหาผลลบระหว่าง matrixA และ matrixB จากนั้นนำไปเก็บใน matrixC แล้วจึงแสดงผลผ่านทางโปรแกรม และไฟล์ Output.txt โดยการเรียกฟังก์ชั่น print_matrix และใส่ parameter matrixC ซึ่งเป็นผลลัพธ์
Function do_multiply
Return type: integer
Variables: i, j และ k เป็น integer
ฟังก์ชั่นใช้สำหรับการคูณเมทริกซ์โดยจะทำการวนลูปหาผลคูณระหว่าง matrixA และ matrixB จากนั้นนำไปเก็บใน matrixC ซึ่งตัวฟังก์ชั่นไม่มี parameter เพราะตัวแปรทั้งสามเป็นแบบ global variables เช่นเดียวกับฟังก์ชั่น plus และ minus
Function multiply
ฟังก์ชั่นใช้สำหรับสั่งคูณเมทริกซ์และแสดงผลลัพธ์ทั้งทางหน้าจอโปรแกรมและไฟล์ Output.txt โดยการเรียกฟังก์ชั่น print_matrix และใส่ parameter matrixC ซึ่งเป็นผลลัพธ์
Function determinant
ฟังก์ชั่น determinant จะค่อนข้างมีความซับซ้อนมาก แต่การทำงานหลัก ๆ สามารถแบ่งได้ 2 ส่วน ตามหมายเลขที่แสดงในภาพ
- ส่วนของการจัดเรียงหน้าเพื่อความสวยงาม ในส่วนนี้จะมีการใช้ตัวแปร j คือผลลบระหว่างขนาดของเมทริกซ์ใหญ่ (เมทริกซ์โจทย์) กับขนาดเมทริกซ์ที่เป็น parameter ของฟังก์ชั่น เมื่อได้ค่า j ก็จะนำไปเป็นขนาดของ array ประเภท character หรือ string ที่ให้ชื่อว่า Tab และใส่ค่า Tab หรือ \t ลงไปในทุกตัวของ array แล้วจึงทำการเรียกฟังก์ชั่น trace_matrix เพื่อแสดงผลลงไฟล์ Trace.txt
ตัวอย่าง ให้ขนาดเมทริกซ์โจทย์เท่ากับ 4 หรือก็คือ 4×4
Loop | j (ขนาดของ Tab [ ]) | ค่าภายใน Tab |
1 | 4 – 4 = 0 | “” |
2 | 4 – 3 = 1 | “\t” |
3 | 4 – 2 = 2 | “\t\t” |
4 | 4 – 1 = 3 | “\t\t\t” |
หมายเหตุ: ค่า x จะลดลงทีละหนึ่งเพราะในส่วนที่ 2 มีการเรียกใช้ฟังก์ชั่นนี้ซ้ำโดยใส่ค่า parameter x เป็น x – 1
- ส่วนการคำนวณหา determinant
โปรแกรมจะทำการคำนวณด้วยการนำเมทริกซ์ที่เป็นโจทย์ (parameter f) มาทำการตัดแถวตัดหลัก และส่งเมทริกซ์ที่ตัดแล้วไปเป็น parameter f ของฟังก์ชั่น determinant อันใหม่ ซึ่งหมายถึงจะทำงานซ้อนกัน เรียกใช้ตัวเองซ้ำๆ (recursive function) ไปจนกว่าขนาดของเมทริกซ์จะเหลือเพียง 2×2 แล้วจึงแทนสูตรการหา determinant ของเมทริกซ์ 2×2 เมื่อทราบค่าของขนาด 2×2 โปรแกรมจะนำค่าที่ทราบไปแทนค่ากลับเรียงขึ้นไปจนกว่าจะได้ determinant ของเมทริกซ์ที่เป็นโจทย์ ซึ่งในระหว่างคำนวณโปรแกรมจะพิมพ์วิธีการคำนวณทีละขั้นในไฟล์ trace.txt เพื่อให้เข้าใจวิธีคำนวณจัดรูปในส่วนที่หนึ่งเพื่อให้อ่านเข้าใจได้ง่าย
โดยในตอนเริ่มจะพิมพ์ว่า “Find determinant” ซึ่งหมายถึงเป็นการเริ่มต้นการคำนวณหา determinant จากนั้นจะพิมพ์ค่า
เมทริกซ์ที่ต้องการหาให้ชื่อว่า Matrix F
จะสังเกตเห็นคำว่า recursive call นั่นคือเป็นการเรียกใช้ฟังก์ชั่นซ้ำหลังจากผ่านการตัดแถวตัดหลักที่หนึ่งไปเรียบร้อยแล้ว หลังจากได้
เมทริกซ์ขนาด 2×2 ก็ทำการแทนสูตรเพื่อให้ได้ determinant ของ 2×2 ทำการตัดแถวตัดหลัก
เมทริกซ์โจทย์จนครบทุกหลัก (ในตัวอย่างขนาด 3×3 จึงตัดจนถึงแถว 1 หลัก 3) เมื่อได้ค่า determinant ย่อยของทุกเมทริกซ์ที่ตัดแถวตัดหลักแล้ว นำไปคูณกับเลขของเมทริกซ์โจทย์ จากนั้นนำผลลัพธ์ทั้งหมดมาบวกกัน
Function trace_matrix
ฟังก์ชั่นนี้ใช้ในการจัดหน้ากระดาษในไฟล์ trace.txt เมื่อมีการแสดงผล determinant โดยจะรับ string จากฟังก์ชั่น determinant ผ่านทาง pointer และให้ชื่อว่า Tab จากนั้นจะเป็นการพิมพ์ string Tab ซึ่งข้างในประกอบไปด้วย \t เป็นการจัดหน้า แล้วจึงพิมพ์เมทริกซ์ที่ถูกส่งมา (parameter matrix) และส่งค่า 0 กลับเมื่อจบฟังก์ชั่น
Function inverse
ฟังก์ชั่น inverse มีเพื่อใช้ในการหารเมทริกซ์ ทุกขั้นตอนจะมีการพิมพ์ลงใน trace.txt เช่นเดียวกันกับการหา determinant มีการเรียกใช้ฟังก์ชั่น roundoff เพื่อปัดค่าที่น้อยมาก ๆ ออกเพื่อให้แสดงผลไม่ผิดพลาด โดยการทำงานจะแบ่งเป็นส่วน ๆ ดังนี้
- ส่วนสร้างเมทริกซ์เอกลักษณ์ ให้ชื่อว่า B
- ส่วนคำนวณ ให้เมทริกซ์ที่ต้องการจะหา inverse ชื่อว่า matrixC ใช้ roundoff ขั้นตอนที่ 3
- หาแถวที่มีค่ามากที่สุดในหลักนั้น ๆ
- สลับเอาแถวที่หามาได้จากข้อข้างบนขึ้นมาไว้บนสุด
- ใช้การกระทำโดยแถว มีเงื่อนไข 2 ข้อ
- ถ้าแถวและหลักไม่เท่ากัน (ไม่ได้อยู่ในแนวทแยงมุม) ตัวเลขในแถวและหลักที่พิจารณา ลบกับตัวเองที่คูณอยู่กับตัวเลขแถวหลักที่พิจารณาซึ่งหารด้วยตัวเลขที่อยู่ในแนวทแยงมุมของหลักนั้น ๆ ที่พิจารณา กล่าวคือ
A – A*(B/ตัวในแนวทแยง) - ถ้าแถวและหลักเท่ากัน (อยู่ในแนวทแยงมุม) หารทั้งแถวด้วยตัวเอง
- ถ้าแถวและหลักไม่เท่ากัน (ไม่ได้อยู่ในแนวทแยงมุม) ตัวเลขในแถวและหลักที่พิจารณา ลบกับตัวเองที่คูณอยู่กับตัวเลขแถวหลักที่พิจารณาซึ่งหารด้วยตัวเลขที่อยู่ในแนวทแยงมุมของหลักนั้น ๆ ที่พิจารณา กล่าวคือ
แผนผังแสดงตัวอย่างการคิด
ในตัวอย่างนี้เป็นการหา inverse ของเมทริกซ์ขนาด 3×3 โดยเริ่มแรกจะนำเมทริกซ์ที่จะหามาเทียบกับเมทริกซ์เอกลักษณ์ หาแถวที่มากสุด สลับแถว และเข้าเงื่อนไขที่ 2 เพราะเป็นแถว 1 หลัก 1 จึงหารด้วยตัวเอง (หาร 4) ทั้งแถว เมื่อครบถึงขั้นที่ 3 จะกลับไปทำขั้นที่ 1 ใหม่โดยจะเปลี่ยนเป็นหลัก 1 แถว 2
ตัวอย่างจากไฟล์ trace.txt
ทำไปเรื่อย ๆ จนกว่าเมทริกซ์ด้านหน้าจะกลายเป็นเมทริกซ์เอกลักษณ์ และเมทริกซ์ด้านหลังจะกลายเป็น inverse ของเมทริกซ์ที่เราต้องการจะหา
Function trace_matrix2
Return type: integer
Parameter: float B[MAX_SIZE] [MAX_SIZE]
Variables: i และ j เป็น integer
Return: END_WITH_SUCCESS ซึ่งมีค่าเท่ากับ 0
ฟังก์ชั่นนี้มีขึ้นเพื่อใช้ในการปริ้นขั้นตอนการหา inverse เมทริกซ์ โดยจะถูกเรียกใช้งานจากฟังก์ชั่น inverse ภายในตัวฟังก์ชั่นนี้จะมีทั้งการพิมพ์ค่าเมทริกซ์ที่รับเข้ามา และการพิมพ์สัญลักษณ์ | เพื่อใช้ในการกั้นระหว่างเมทริกซ์ B และเมทริกซ์เอกลักษณ์
Function divide
Return type: integer
Variables: float MatrixD [MAX_SIZE] [MAX_SIZE], det
ในการหารเมทริกซ์คือการคูณด้วย inverse เช่น A/B = A*B–1 ซึ่ง B–1 ก็คือ inverse ของ B นั่นเอง ดังนั้นโปรแกรมจะทำการคำนวณหา inverse แต่ก่อนอื่นจะต้องตรวจสอบก่อนว่า determinant มีค่าเท่ากับ 0 หรือไม่โดยการเรียกใช้ฟังก์ชั่น determinant เพราะถ้าเมทริกซ์นั่น ๆ มี determinant = 0 จะไม่สามารถหา inverse ได้ เมื่อตรวจสอบว่าไม่เท่ากับ 0 จึงจะทำการเรียกฟังก์ชั่น inverse เมื่อได้ค่ามาก็เรียกฟังก์ชั่น do_multiply เพื่อทำการคูณ A*B–1 แล้วจึงแสดงผลลัพธ์ทางจอ และไฟล์ Output.txt
แผนผังแสดงการทำงาน
สรุปผลการทำงานของโปรแกรม
ระยะเวลาในการคำนวณของโปรแกรมอย่างคร่าวๆ
ขนาดของเมทริกซ์ | เวลา |
2x2 – 4×4 | น้อยกว่า 1 วินาที |
5x5 – 9×9 | น้อยกว่า 5 วินาที |
10x10 | ประมาณ 40-50 วินาที |
หมายเหตุในแต่ละเครื่องคอมพิวเตอร์อาจมีเวลาในการคำนวณที่แตกต่างกันออกไป และนี่คือค่าโดยเฉลี่ยจากการทดสอบ
ขนาดของไฟล์ที่โปรแกรมสร้างขึ้นหลังการคำนวณ
ขนาดของเมทริกซ์ | ขนาดไฟล์ Output.txt | ขนาดไฟล์ Trace.txt |
2x2 | 1 KB | 2 KB |
3×3 | 1 KB | 5 KB |
4×4 | 2 KB | 16 KB |
5×5 | 3 KB | 53 KB |
6×6 | 4 KB | 230 KB |
7×7 | 5 KB | 1.4 MB |
8×8 | 6 KB | 11 MB |
9×9 | 8 KB | 100 MB |
10×10 | 10 KB | 1 GB |
ข้อเสนอแนะ
โปรแกรมจะทำงานได้โดยไม่มี error หรือข้อผิดพลาดใด ๆ ผู้ใช้ควรทราบว่า
- ค่า input จะต้องอยู่ในเงื่อนไขที่โปรแกรมกำหนด
- ควรใช้งานโปรแกรมในที่ ๆ สามารถสร้างไฟล์ได้ เพราะทุกครั้งหลังจบการคำนวณโปรแกรมจะสร้างไฟล์ txt และ trace.txt ซึ่งควรจะมีพื้นที่อย่าง 1.5 GB หากโปรแกรมไม่สามารถสร้างไฟล์ได้จะขึ้น error และจบโปรแกรมทันที
- ในกรณีที่โปรแกรมไม่ฟ้องในการสร้างไฟล์ แต่ไม่มีไฟล์ผลลัพธ์ ให้ตรวจสอบ anti-virus ว่ามีการจำกัดสิทธิ์การสร้างไฟล์หรือไม่
- หากมีการเรียกใช้ค่าจากไฟล์ txt ชื่อไฟล์ตัวพิมพ์เล็กพิมพ์ใหญ่จะต้องตรง และไฟล์ต้องอยู่ใน folder เดียวกันกับโปรแกรมเท่านั้น
- ไฟล์ .exe ของโปรแกรมเมื่อรัน ใส่ค่า input คำนวณ แล้วอาจปิดโปรแกรมในทันที วิธีแก้ไขคือรันไฟล์ .exe ใน power shell
ประโยชน์ที่ได้จากโปรแกรมนี้
เราทราบกันดีว่า การบวก ลบ คูณ หารเมทริกซ์เป็นพื้นฐานของหลายรายวิชา สามารถนำไปใช้แก้สมการ แก้ปัญหาเชิงฟิสิกส์ได้ ซึ่งโปรแกรมดังกล่าวมีข้อดีที่สามารถดูไฟล์ trace.txt ได้ จึงเหมาะกับผู้ที่เริ่มต้นเรียนวิธีการหา determinant และ inverse ของเมทริกซ์เพราะมีขั้นตอนและวิธีโดยละเอียด ผู้เขียนหวังว่าบทความนี้จะเป็นประโยชน์กับผู้อ่านไม่มากก็น้อย
สุดท้ายนี้หากอ่านแล้วไม่เข้าใจ สามารถดูวิดิโอและไฟล์ soure code ด้านล่างเพื่อศึกษาเพิ่มเติม
ไฟล์ soure code –> https://drive.google.com/open?id=1-zoq8ZUR92pymju5wiS-_9IJCblJYIej