โปรแกรม + – * / matrix ใครว่ายาก!!!

วันนี้ผู้เขียนจะมาอธิบายถึงโปรแกรมบวก ลบ คูณ หารเมทริกซ์ที่เป็นส่วนหนึ่งของวิชา Data Structure & Algorithm โดยจุดหลักที่โปรแกรมนี้ใช้คือหัวข้อ recursive คือฟังก์ชั่นที่เรียกใช้ตัวเองซ้ำๆ จะใช้ในการหา determinant ของเมทริกซ์ และการเก็บข้อมูลจะเก็บในรูปแบบของ array ทั้งนี้ผู้เขียนหวังว่าผู้อ่านจะมีความรู้พื้นฐานของการบวก ลบ คูณ หารเมทริกซ์กันมาแล้ว ในที่นี้จะกล่าวถึงการเขียนโปรแกรมในภาษาซี เพื่อใช้หาคำตอบดังกล่าว

รายละเอียดโปรแกรม

  1. โปรแกรมทำการคิดบวก ลบ คูณ หาร เมทริกซ์จัตุรัสขนาดตั้งแต่ 2×2 ถึง 10×10
  2. เลือกป้อนข้อมูลได้ 2 แบบ คือ รับไฟล์โดยตรง (พิมพ์ทีละค่า) และแบบรับข้อมูลผ่าน text file ที่ชื่อ Input.txt ซึ่งวิธีนี้เหมาะกับการป้อนข้อมูลเมทริกซ์ที่มีขนาดใหญ่
  3. ผลลัพธ์ทั้งบวก ลบ คูณ และหารจะมีการแสดงในตัวโปรแกรมและนำผลลัพธ์เก็บเข้า text file ที่ชื่อ Output.txt
  4. โปรแกรมจะสร้างไฟล์ trace.txt เพื่อแสดงวิธีการหา determinant และ inverse อย่างละเอียด

ตัวอย่างการรับค่าและพิมพ์ค่าใส่ไฟล์

 

ข้อกำหนดของโปรแกรม

  1. ขนาดของเมทริกซ์จะต้องเป็นจัตุรัส ขนาดไม่เกิน 10×10 ทั้งนี้หากต้องการให้คำนวนได้มากกว่า 10×10 สามารถปรับขนาด array ที่ได้ทำการจองไว้ (ใช้หน่วยความจำของเครื่องมากขึ้น)
  2. ค่าจากไฟล์ที่โปรแกรมจะรับข้อมูล ไฟล์ต้องมีชื่อว่า Input.txt กรณีไฟล์ชื่ออื่นต้องทำการแก้ชื่อไฟล์ ในตัวโปรแกรม และไฟล์ต้องอยู่ folder เดียวกันกับตัวโปรแกรม
  3. การรับข้อมูลทางไฟล์ ภายในไฟล์จะต้องระบุขนาดของเมทริกซ์ก่อน แล้วจึงตามด้วยข้อมูล

  1. ค่าที่ใช้ในการคำนวนเป็นแบบ float แต่กำหนดให้แสดงผลเป็นทศนิยมเพียง 2 ตำแหน่ง
  2. ค่าที่ได้จากการคำนวนจะมีการแสดงผลในโปรแกรม และเก็บเข้าสู่ไฟล์ที่ชื่อ Output.txt หากมีไฟล์นี้อยู่แล้ว ไฟล์จะถูกเขียนทับ หากไม่มีไฟล์ชื่อนี้อยู่ โปรแกรมจะทำการสร้างไฟล์ขึ้นมาใหม่ folder เดียวกันกับโปรแกรม ซึ่งผลที่แสดงในไฟล์จะได้แก่ การทวนโจทย์ (Given Matrix), ผลบวก, ลบ, คูณ, determinant ของ B และผลหาร
  3. โปรแกรมจะแสดงวิธีคิด determinant และ inverse อย่างละเอียด โดยเก็บเข้าสู่ไฟล์ที่ชื่อ trace.txt หากมีไฟล์นี้อยู่แล้ว ไฟล์จะถูกเขียนทับ หากไม่มีไฟล์ชื่อนี้อยู่ โปรแกรมจะทำการสร้างไฟล์ขึ้นมาใหม่ใน folder เดียวกันกับโปรแกรม

 ตัวอย่างโปรแกรม

อธิบาย code

โปรแกรมบวก ลบ คูณ หารเมทริกซ์เขียนด้วยภาษาซีมีความยาวทั้งสิ้น 405 บรรทัด ใช้ libraries ทั้งหมด 3 ตัว ได้แก่

  1. math.h เพราะมีการใช้ absolute ในการคำนวณ
  2. stdio.h เพราะใช้คำสั่งพื้นฐานอย่าง printf, scanf
  3. string.h เพราะมีการใช้ sting ใน function trace_matrix

มีตัวแปรแบบ define ที่เป็นตัวแปรคงที่ไม่มีการเปลี่ยนค่าตลอดการทำงาน 4 ตัว ได้แก่

  1. MAX_SIZE ใช้ในการกำหนดค่า array สูงสุดในเมทริกซ์ ในที่นี้จำกัดไว้ที่ 10 ดังนั้น
    เมทริกซ์จะคำนวณได้ขนาดสูงสุดคือ 10 x 10 ถ้าต้องการเพิ่มให้คำนวณได้มากกว่านี้สามารถปรับแก้ได้ที่ตัวแปรนี้
  2. MAX_ERROR ใช้ในการกำหนดค่าการปัดเศษในฟังก์ชั่น roundoff
  3. END_WITH_SUCCESS ใช้ในการ return ค่าเมื่อฟังก์ชั่นรันสำเร็จ จะให้ค่าคืนเป็น 0
  4. END_WITH_ERROR ใช้ในการ return ค่าเมื่อฟังก์ชั่นรันไม่สำเร็จ จะให้ค่าคืนเป็น -1

มีการใช้ global variables ตัวแปรที่ทุกฟังก์ชั่นจะมองเห็นเป็นค่าเดียวกันทั้งหมด 6 ตัวแปร ได้แก่

  1. dimension เป็นตัวแปรประเภท integer ใช้สำหรับเก็บค่าขนาดของเมทริกซ์ที่ต้องการจะคำนวณ เป็นตัวเลขเดี่ยว เช่น 5 หมายถึงคำนวณเมทริกซ์ขนาด 5 x 5
  2. matrixA เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า input matrix A
  3. matrixB เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า input matrix B
  4. matrixC เป็นตัวแปรแบบ array สองมิติ ประเภท float ใช้ในการเก็บค่า output matrix C
  5. *Output เป็นตัวแปรแบบ pointer ที่จะใช้ชี้ไปยังตำแหน่งไฟล์ Output.txt
  6. *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 หรือไม่
    1. ใช่ แสดงผลแจ้งกลับ Idiots! Use calculator!!!”
    2. ไม่ใช่ แสดงผลแจ้งกลับ 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 เดียวกันกับตัวโปรแกรมภายในไฟล์จะต้องประกอบไปด้วยสามส่วนนั่นก็คือ

  1. ขนาดของเมทริกซ์ เช่น 2, 3, 7, 10 เป็นต้น
  2. เมทริกซ์ตัวแรก โดยใส่ให้สอดคล้องกับขนาดของเมทริกซ์ เช่น ถ้าขนาดเป็น 3 นั่นหมายถึงต้องใส่ตัวเลขแบบ float ทั้งหมด 3×3 = 9 ตัว เป็นต้น
  3. เมทริกซ์ตัวที่สอง โดยใส่ให้สอดคล้องกับขนาดของเมทริกซ์ เช่นเดียวกับเมทริกซ์ตัวแรก

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 ส่วน ตามหมายเลขที่แสดงในภาพ

  1. ส่วนของการจัดเรียงหน้าเพื่อความสวยงาม ในส่วนนี้จะมีการใช้ตัวแปร 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 เป็น x1

  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 เพื่อปัดค่าที่น้อยมาก ๆ ออกเพื่อให้แสดงผลไม่ผิดพลาด โดยการทำงานจะแบ่งเป็นส่วน ๆ ดังนี้

  1. ส่วนสร้างเมทริกซ์เอกลักษณ์ ให้ชื่อว่า B
  2. ส่วนคำนวณ ให้เมทริกซ์ที่ต้องการจะหา 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*B1 ซึ่ง B1 ก็คือ inverse ของ B นั่นเอง ดังนั้นโปรแกรมจะทำการคำนวณหา inverse แต่ก่อนอื่นจะต้องตรวจสอบก่อนว่า determinant มีค่าเท่ากับ 0 หรือไม่โดยการเรียกใช้ฟังก์ชั่น determinant เพราะถ้าเมทริกซ์นั่น ๆ มี determinant = 0 จะไม่สามารถหา inverse ได้ เมื่อตรวจสอบว่าไม่เท่ากับ 0 จึงจะทำการเรียกฟังก์ชั่น inverse เมื่อได้ค่ามาก็เรียกฟังก์ชั่น do_multiply เพื่อทำการคูณ A*B1 แล้วจึงแสดงผลลัพธ์ทางจอ และไฟล์ 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 หรือข้อผิดพลาดใด ๆ ผู้ใช้ควรทราบว่า

  1. ค่า input จะต้องอยู่ในเงื่อนไขที่โปรแกรมกำหนด
  2. ควรใช้งานโปรแกรมในที่ ๆ สามารถสร้างไฟล์ได้ เพราะทุกครั้งหลังจบการคำนวณโปรแกรมจะสร้างไฟล์ txt และ trace.txt ซึ่งควรจะมีพื้นที่อย่าง 1.5 GB หากโปรแกรมไม่สามารถสร้างไฟล์ได้จะขึ้น error และจบโปรแกรมทันที
  3. ในกรณีที่โปรแกรมไม่ฟ้องในการสร้างไฟล์ แต่ไม่มีไฟล์ผลลัพธ์ ให้ตรวจสอบ anti-virus ว่ามีการจำกัดสิทธิ์การสร้างไฟล์หรือไม่
  4. หากมีการเรียกใช้ค่าจากไฟล์ txt ชื่อไฟล์ตัวพิมพ์เล็กพิมพ์ใหญ่จะต้องตรง และไฟล์ต้องอยู่ใน folder เดียวกันกับโปรแกรมเท่านั้น
  5. ไฟล์ .exe ของโปรแกรมเมื่อรัน ใส่ค่า input คำนวณ แล้วอาจปิดโปรแกรมในทันที วิธีแก้ไขคือรันไฟล์ .exe ใน power shell

ประโยชน์ที่ได้จากโปรแกรมนี้

เราทราบกันดีว่า การบวก ลบ คูณ หารเมทริกซ์เป็นพื้นฐานของหลายรายวิชา สามารถนำไปใช้แก้สมการ แก้ปัญหาเชิงฟิสิกส์ได้ ซึ่งโปรแกรมดังกล่าวมีข้อดีที่สามารถดูไฟล์ trace.txt ได้ จึงเหมาะกับผู้ที่เริ่มต้นเรียนวิธีการหา determinant และ inverse ของเมทริกซ์เพราะมีขั้นตอนและวิธีโดยละเอียด ผู้เขียนหวังว่าบทความนี้จะเป็นประโยชน์กับผู้อ่านไม่มากก็น้อย

สุดท้ายนี้หากอ่านแล้วไม่เข้าใจ สามารถดูวิดิโอและไฟล์ soure code ด้านล่างเพื่อศึกษาเพิ่มเติม
ไฟล์ soure code –> https://drive.google.com/open?id=1-zoq8ZUR92pymju5wiS-_9IJCblJYIej

part 1/3
YouTube Preview Image

part 2/3
YouTube Preview Image

part 3/3
YouTube Preview Image

  •  
  •  
  •  
  •  
  •  
  •  
PANDHITTAYA NOIKORN on sabyoutube
PANDHITTAYA NOIKORN
at GlurGeek.Com
นางสาวปัณฑิตญา น้อยกร รหัส 1590900435
นักศึกษาคณะวิศวกรรมศาสตร์ สาขาวิชาคอมพิวเตอร์
มหาวิทยาลัยกรุงเทพ

Leave a Reply