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 คือจำนวนคอลัมภ์

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 คุณใช้ตัวแปรประเภทใดมากที่สุด



จบหัวข้อที่ 2

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

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

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