2. เซลล์อาเรย์
เซลล์อาเรย์ (cell array) เป็นอาเรย์แบบพิเศษ ซึ่งลักษณะโครงสร้างเหมือนกันกับอาเรย์ปกติทุกประการ เพียงแต่ว่าในแต่ละตำแหน่งนั้น สามารถเก็บข้อมูลได้ไม่จำกัดรูปแบบ เช่น เก็บตัวเลข เก็บตัวอักษร เก็บอาเรย์ เก็บรูปภาพ หรือแม้กระทั้งเก็บ cell array ตัวอื่นๆ ก็ได้ และไม่ว่าข้อมูลเหล่านั้นจะมีขนาดเป็นเท่าไรก็ตาม เมื่อถูกเก็บไว้ใน cell แล้ว จะนับเป็น 1 หน่วยเท่านั้น ดังนั้น cell array จึงมีความซับซ้อน ด้วยตัวของมันเอง เพราะสามารถเก็บข้อมูลได้ทุกประเภท และไม่มีข้อจำกัดใดๆ เช่น
ถ้าเรามีรูปภาพหลายรูป แต่ละรูปขนาดไม่เท่ากัน เมื่อเราอ่านรูปภาพเหล่านั้นโดยใช้คำสั่ง imread() ขนาดของรูปภาพเหล่านั้นก็จะไม่เท่ากัน ซึ่งโดยปกติแล้ว เราจะไม่สามารถเก็บอาเรย์ที่ขนาดต่างกันเอาไว้ด้วยกันได้ แต่หากใช้ cell array ปัญหานี้จะหมดไปทันที เพราะเมื่อข้อมูลเหล่านั้นถูกเก็บลงใน cell ไม่ว่าข้อมูลนั้นจะมีขนาดเท่าไรก็ตาม จะถูกนับเป็น 1 หน่วยเสมอ ดังนั้นรูปภาพทุกรูป จึงมีขนาด 1 หน่วยเท่ากัน
2.1 การสร้าง cell array
การสร้าง cell array จะเหมือนกับการสร้างอาเรย์ปกติทุกอย่าง ต่างกันก็เพียงแค่เครื่องหมายวงเล็บ ในการสร้างอาเรย์ปกติ เราจะใช้ [ ] แต่การสร้าง cell อาเรย์เราจะใช้ { } ตัวอย่างเช่น
ในตัวอย่างนี้หมายความว่า A เป็น cell อาเรย์ที่มี 4 เซลล์ โดยเซลล์ที่ 1 เก็บค่า 1 เซลล์ที่ 2 เก็บค่า 2 เรียงตามลำดับไปเรื่อยๆ จนถึง 4 ซึ่งตัวเลขเหล่านี้ยังไม่สามารถนำมาคำนวณใดๆ ถ้ายังอยู่ในเซลล์ ดังนั้นเราจึงต้องนำข้อมูลออกมาจากเซลล์ก่อนคำนวณเสมอ
นอกจากนี้เรายังสามารถสร้างเซลล์ได้ด้วยคำสั่ง cell(m,n) โดยที่ m คือจำนวนแถว และ n คือจำนวนคอลัมภ์
นอกจากนี้เรายังสามารถสร้างเซลล์ได้ด้วยคำสั่ง cell(m,n) โดยที่ m คือจำนวนแถว และ n คือจำนวนคอลัมภ์
2.2 การเข้าถึงข้อมูลใน cell อาเรย์
โดยปกติแล้วเราจะใช้ A(m,n) เพื่อเข้าถึงข้อมูลในอาเรย์ในอาเรย์ A ตำแหน่งแถวที่ m คอลัมภ์ที่ n แต่สำหรับเซลล์อาเรย์นั้น สามารถเข้าถึงข้อมูลได้ 2 แบบ และแต่ละแบบจะให้ผลลัพธ์ต่างกัน
- เข้าถึงข้อมูลโดยการดึงเซลล์ทั้งเซลล์ออกมา
การเข้าถึงข้อมูลแบบนี้จะเขียนเหมือนกันกับอาเรย์ปกติทั่วไป คือการใช้ ( ) เพียงแต่ว่าผลลัพธ์ที่ได้นั้น ยังคงเป็นเซลล์เหมือนเดิม ซึ่งเรายังไม่สามารถนำข้อมูลเหล่านี้ไปประมวลผลได้
- เข้าถึงข้อมูลที่อยู่ในเซลล์โดยตรง
การเข้าถึงข้อมูลแบบนี้จะใช้ { } และข้อมูลที่ดึงออกมานั้น จะเป็นประเภทเดียวกันกับข้อมูลที่อยู่ในเซลล์นั้น เช่น ถ้าข้อมูลที่อยู่ในเซลล์นั้นคือตัวเลข ตัวแปรที่ใช้เก็บค่าที่ดึงออกมาก็จะเป็นชนิด double แต่ถ้าข้อมูลที่อยู่ในเซลล์นั้นเป็นตัวอักษร ตัวแปรที่ใช้เก็บค่าก็จะเป็นชนิด char โดยอัตโนมัติ ซึ่งตรงจุดนี้สำคัญมาก เพราะตัวแปรแต่ละชนิดไม่สามารถนำมาคำนวณร่วมกันได้ และหากเราสังเกตุดูให้ดี จะเห็นว่า input ของแต่ละคำสั่งก็จะระบุชนิดของตัวแปรที่ใช้เป็น input อย่างชัดเจน ดังนั้นถึงแม้ว่าเราจะป้อนค่าถูกต้อง แต่หากประเภทของตัวแปรไม่ถูกต้อง โปรแกรมก็จะยัง error อยู่เหมือนเดิม ซึ่งปัญหานี้จะพบบ่อยมาก
ทั้ง 2 แบบก่อนหน้านี้ คือการดึงข้อมูลออกมาจากเซลล์ ซึ่งผู้เขียนสามารถเลือกใช้ได้ทั้ง 2 แบบ ขึ้นอยู่กับวัตถุประสงค์ ว่าต้องการดึงข้อมูลออกมาทำไม ถ้าจะดึงออกมาเพื่อเอาไปคำนวณต่อ จะต้องดึงข้อมูลด้วยวิธีที่ 2 เท่านั้น แต่ถ้าจะดึงข้อมูลออกมาแสดงผลเฉยๆ ดึงด้วยวิธีแรกก็ได้ในตอนนี้เราทราบวิธีการดึงค่าออกมาจากเซลล์อาเรย์แล้ว ต่อไปคือการกำหนดค่าเข้าไปในเซลล์อาเรย์ ซึ่งผมต้องบอกว่า ค่อนข้างซับซ้อนเลยทีเดียว เรามาดูกันทีละอย่างเลยครับ
- กำหนดค่าโดยใช้ ( ) เหมือนกับอาเรย์ปกติ
หากใช้วิธีนี้ ข้อมูลที่กำหนดเข้าไปในเซลล์ จะต้องมีลักษณะเป็นเซลล์เหมือนกันนะครับ ซึ่งถ้าดูจากตัวอย่างด้านล่างจะเห็นว่า หากกำหนดเข้าไปเป็นตัวเลขโดยตรงเหมือนอาเรย์ปกติ โปรแกรมจะฟ้อง error นะครับ แต่หากข้อมูลด้านขวาของเครื่องหมายเท่ากับอยู่ในรูปแบบเซลล์ ก็จะสามารถกำหนดเข้าไปได้ตามปกติ
- กำหนดค่าโดยใช้ { }
การกำหนดค่าแบบนี้ ข้อมูลที่อยู่ฝั่งขวาของเครื่องหมายเท่ากับ จะเป็นประเภทอะไรก็ได้ เช่น ตัวเลข ตัวอักษร หรือ เซลล์ แต่ผลลัพธ์ที่ได้จะต่างกัน เช่น
จากตัวอย่างข้างต้น จะเห็นนะครับว่า ไม่ว่าด้านขวาของเครื่องหมายเท่ากับจะเป็นข้อมูลประเภทอะไรก็สามารถกำหนดเข้าไปไว้ในเซลล์อาเรย์ A ได้ทั้งหมด โดยโปรแกรมไม่มีการแจ้งเตือน error ใดๆ เลย แต่ผลลัพธ์ที่ได้นั้นจะแตกต่างกันไป เพราะประเภทของข้อมูลนั้นจะยังคงอยู่เหมือนเดิม ถึงแม้จะถูกนำไปเก็บไว้ในเซลล์ เช่น
>> A{5} = 12
ตัวเลข 12 นั้นก็จะถูกนำไปเก็บไว้ในเซลล์ตำแหน่งที่ 5 เมื่อเราเข้าถึงข้อมูล โดยใช้วิธี “เข้าถึงข้อมูลที่อยู่ในเซลล์โดยตรง” เราก็จะได้ตัวเลข 12 ออกมา ซึ่งสามารถนำไปคำนวณต่อได้ทันที
>> A{6} = {12}
ตัวอย่างนี้ ด้านขวามือของเครื่องหมายเท่ากับ ไม่ใช่เลข 12 แต่เป็นเซลล์ ซึ่งภายในเซลล์นั้นเก็บตัวเลข 12 เอาไว้ ดังนั้นผลลัพธ์ที่ได้คือ เซลล์นี้จะถูกนำไปเก็บไว้ในตำแหน่งที่ 6 หรือพูดอีกอย่างคือ ในตำแหน่งที่ 6 ของเซลล์อาเรย์ A มีอีกเซลล์หนึ่งอยู่ข้างใน ดังนั้น ถึงแม้เราจะใช้วิธี “เข้าถึงข้อมูลที่อยู่ในเซลล์โดยตรง” ก็ยังไม่สามารถดึงตัวเลข 12 ออกมาได้ในรอบแรก แต่จะต้องทำแบบนี้ 2 รอบ ถึงจะดึงตัวเลข 12 ออกมาได้ เช่น
จะเห็นนะครับว่า คำสั่งทั้ง 2 บรรทัด คือการ “เข้าถึงข้อมูลที่อยู่ในเซลล์โดยตรง” แต่ผลลัพธ์ที่ได้จากการเข้าถึงครั้งแรกนั้น ก็ยังคงเป็นเซลล์อยู่ดี เพราะในเซลล์นั้นเก็บเซลล์เอาไว้ เราจึงต้องเข้าถึงข้อมูลใหม่อีกครั้ง แต่ในครั้งนี้ตำแหน่งของข้อมูลจะไม่ใช่ 6 เหมือนเดิม ส่วนจะเป็นตำแหน่งอะไร เราก็ต้องไปดูว่าข้อมูลที่เราต้องการดึงออกมา มันอยู่ตำแหน่งอะไรในเซลล์นั้น อย่างเช่นในตัวอย่างนี้ ในเซลล์ B มีข้อมูลอยู่ตัวเดียว ดังนั้นเราก็เลยดึงข้อมูลตำแหน่งที่ 1 ออกมา
จากตัวอย่างนี้จะเห็นแล้วนะครับว่า การดึงข้อมูลออกมาจากเซลล์นั้นทำได้หลายวิธี และแต่ละวิธีก็จะได้ผลลัพธ์แตกต่างกันออกไป รวมทั้งเราต้องทราบด้วยว่า ประเภทของข้อมูลที่อยู่ในเซลล์ตำแหน่งที่เราต้องการดึงออกมานั้น เป็นประเภทอะไร เราจึงจะสามารถดึงค่าออกมาได้อย่างถูกต้อง อย่างเช่น ในตัวอย่างข้างต้น ถ้าเราดึงค่าออกมาจาก A{6} แล้วนำไปคำนวณเลย เพราะคิดว่าจะได้ตัวเลข 12 ออกมาแล้ว โปรแกรมก็จะ error ทันที เพราะไม่สามารถคำนวณได้
ตัวอย่าง
จงเขียนโปรแกรมถาม ชื่อ และที่อยู่ของ user โดยให้กรอกข้อมูลตามลำดับดังนี้
ชื่อ, บ้านเลขที่, หมู่, ตำบล, อำเภอ, จังหวัด, รหัสไปรษณีย์
clc;clear;close all; TXT = {'Name','House No.','Moo','Tombon','Amphoe','Changwat','Postal Code'}; L = length(TXT); UD = cell(1); for m=1:L A = [TXT{m} ': ']; B = input(A,'s'); UD{m} = B; end disp('Your data are...'); for m=1:L disp([TXT{m} ': ' UD{m}]); end
ในส่วนแรก คือ ข้อมูลที่ user ป้อนเข้าไปนะครับ ส่วนข้อมูลที่โปรแกรมแสดง จะอยู่หลังบรรทัด "Your data are..." และความพิเศษของโปรแกรมนี้ก็คือ โปรแกรมสามารถวนลูปแสดงคำว่า "Name", "House No." และคำอื่นๆ ออกมาได้ ซึ่งคำเหล่านี้ต่างก็มีความยาวไม่เท่ากัน จึงเป็นไปไม่ได้ที่จะเก็บข้อความเหล่านี้ไว้ในอาเรย์ปกติ เราจึงต้องใช้ cell อาเรย์ เพื่อเก็บข้อมูลแบบนี้
- ตัวแปรธรรมดา (Scalar)
- อาเรย์ 1 มิติ (Vector)
- อารเย์ 2 มิติ (Matrix)
- อาเรย์ 3 มิติ
- Cell อาเรย์
- สตริง (Char อาเรย์)
1. หากต้องรับค่าตัวเลข A และ B จาก user เพื่อนำมาประมวลผล ตัวแปร A และ B ควรจะเป็นประเภทใด
2. หากต้องรับข้อความจาก user 2 ข้อความ เพื่อคำนวณหาว่าข้อความไหนยาวกว่ากัน ควรใช้ตัวแปรประเภทใดเก็บข้อมูล
3. หากต้องรับสมการจาก user เพื่อประมวลผล เช่น '3x-4=0' ควรใช้ตัวแปรประเภทใด
4. หากต้องอ่านภาพทั้งหมดในโฟลเดอร์ ควรใช้ตัวแปรประเภทใดเก็บข้อมูลภาพ
5. หากต้องการ plot สมการ y = tan(x) ควรใช้ตัวแปรประเภทใด เก็บค่า x และ y
6. หากต้องการเขียนโปรแกรมรับ ชื่อ และ คะแนน ของนักเรียน เพื่อนำมาตัดเกรด ควรใช้ตัวแปรประเภทใด
7. หากต้องการอ่านภาพ png จำนวน 1 ภาพ ควรใช้ตัวแปรประเภทใด
8. หากต้องการพอร์ตกราฟ 3 มิติ ต้องใช้ตัวแปรประเภทใด
9. หากต้องเขียนโปรแกรมรับค่า "สเปคของแฟน" จากเพื่อนผู้หญิงในห้อง 10 คน ควรจะใช้ตัวแประเภทใดเก็บข้อมูล
10. ตั้งแต่เริ่มเขียนโปรแกรม MATLAB คุณใช้ตัวแปรประเภทใดมากที่สุด
เพื่อความเข้าใจ ลองตอบคำถามต่อไปนี้ดูนะครับ
ประเภทตัวแปรที่ใช้เก็บข้อมูล สามารถเลือกตอบได้จากประเภทใดประเภทหนึ่งต่อไปนี้- ตัวแปรธรรมดา (Scalar)
- อาเรย์ 1 มิติ (Vector)
- อารเย์ 2 มิติ (Matrix)
- อาเรย์ 3 มิติ
- Cell อาเรย์
- สตริง (Char อาเรย์)
1. หากต้องรับค่าตัวเลข A และ B จาก user เพื่อนำมาประมวลผล ตัวแปร A และ B ควรจะเป็นประเภทใด
2. หากต้องรับข้อความจาก user 2 ข้อความ เพื่อคำนวณหาว่าข้อความไหนยาวกว่ากัน ควรใช้ตัวแปรประเภทใดเก็บข้อมูล
3. หากต้องรับสมการจาก user เพื่อประมวลผล เช่น '3x-4=0' ควรใช้ตัวแปรประเภทใด
4. หากต้องอ่านภาพทั้งหมดในโฟลเดอร์ ควรใช้ตัวแปรประเภทใดเก็บข้อมูลภาพ
5. หากต้องการ plot สมการ y = tan(x) ควรใช้ตัวแปรประเภทใด เก็บค่า x และ y
6. หากต้องการเขียนโปรแกรมรับ ชื่อ และ คะแนน ของนักเรียน เพื่อนำมาตัดเกรด ควรใช้ตัวแปรประเภทใด
7. หากต้องการอ่านภาพ png จำนวน 1 ภาพ ควรใช้ตัวแปรประเภทใด
8. หากต้องการพอร์ตกราฟ 3 มิติ ต้องใช้ตัวแปรประเภทใด
9. หากต้องเขียนโปรแกรมรับค่า "สเปคของแฟน" จากเพื่อนผู้หญิงในห้อง 10 คน ควรจะใช้ตัวแประเภทใดเก็บข้อมูล
10. ตั้งแต่เริ่มเขียนโปรแกรม MATLAB คุณใช้ตัวแปรประเภทใดมากที่สุด
จบหัวข้อที่ 2