String Variable
การกําหนดค่าตัวแปรนอกจะกําหนดเป็นตัวเลขแล้ว เรายังสามารถกําหนดเป็นตัวหนังสือได้อีก
ด้วย โดยการกําหนดค่าตัวแปรที่เป็นตัวหนังสือหรือที่เรียกว่า string จะต้องใส่ค่าที่เราต้องการกําหนดใน
เครื่องหมาย quotation “'” ดังตัวอย่างเช่น
Str1='Tom';
Str2='Pookie';
การกําหนดค่าตัวแปรเป็น string จะมีประโยชน์ในกรณีที่ต้องส่งค่าตัวแปรที่เป็นตัวหนังสือไป
ให้ function เพื่อใช้ในการประมวลผลหรือแสดงคําสั่งที่ต้องการ
สําหรับการกําหนดตัวแปรให้เป็น matrix โดยมีค่าแต่ละ element เป็น string นั้นมีข้อจํากัดอย่าง
หนึ่งคือทุกตัวแปรจะต้องมีความยาวเท่ากัน ซึ่งข้อจํากัดนี้มาจากว่า matrix ต้องมีจํานวน column ในแต่ละ
row เท่ากัน ซึ่งจากข้อจํากัดนี้ทําให้เราอาจต้องเพิ่ม blank space มาขั้นในตัวแปรที่เป็น string แต่ละตัว
2.2 Matrix Operation
- Dot Product
Dot Product หรือ inner product เป็นการคํานวณหาค่า scalar value ของ vector ที่มีขนาดเท่ากัน ซึ่งถ้า
A และ B เป็น vector ที่มีขนาดเท่ากันจะได้
∑=
= •
N
i
i ib a B A
1
เมื่อ N เป็นจํานวน element ของ A และ B
ตัวอย่างเช่น A = [1 2 3] B = [4 5 6] จะได้ว่าถ้า C = A⋅B จะได้ (1)(4) + (2)(5) + (3)(6) = 4+10+18 =
32
MATLAB จะใช้คําสั่ง
C = dot(A,B)
Basic Operation 28
dot(A,B) คํานวณหา dot product ของ A และ B ถ้า A และ B เป็น matrix dot product จะเป็น row
vector ที่มี element ในแต่ละ column บรรจุค่า dot product ในแต่ละ column ของ A
และ B
ตัวอย่างเช่น
A=[1 2 3];B=[4 5 6];
ดังนั้น
dot(A,B)
ans =
32
การคูณ Matrix
การที่ Matrix A และ B จะคูณกันได้ matrix ตัวแรกจะต้องมีจํานวน column เท่ากับจํานวน row ของ
ตัวที่สอง และผลจะได้ matrix ที่มีขนาดเท่ากับ row ของตัวแรก และ column ของตัวหลัง เช่น A มีขนาด
[m x n] และ B มีขนาด [p x q] AB จะมีค่าก็ต่อเมื่อ n = p และจะได้ matrix ขนาด m x q ดังนั้นโดยทั่วไป
AB ≠ BA หรือไม่มีการสลับที่การคูณของ matrix สําหรับ MATLAB ถ่า C = AB จะใช้
C = A * B
ถ้าจํานวน column A ไม่เท่ากับจํานวน row ของ B MATLAB จะแสดงข้อความบอกความผิดพลาด
- การคูณ Matrix ด้วย Scalar
การคูณ matrix ด้วย scalar นั้นจะเปนการคูณทุก element ของ matrix ด้วยค่าคงที่ เช่น A=[1 2]; จะ
ได
C =2*A
C =
2 4
การบวก-ลบ Matrix
การที่ matrix จะบวก/ลบกันได้ต้องมีขนาดเท่ากัน และการบวก/ลบจะกระทําโดยบวก/ลบแต่ละ
element ของ matrix
A=[1 2 3];
B=[4 5 6];
C=A-B
C =
-3 -3 -3
- การยกกําลัง Matrix
Matrix ที่จะยกกําลังได้ต้องเป็น square matrix เท่านั้น โดย
Basic Operation 29
A2 = AA
MATLAB จะเขียน A2 เปน A^2 ดังนั้น
A^2 จะเทากับ A*A
A^3 จะเทากับ A*A*A
Matrix Polynomial
สําหรับ polynomial function ของ x จะอยู่ในรูป
f x a x a x a x a n
n
n
n ( ) ... = + + + −
−
1
1
1 0
โดย a a n n , ,... −1 เป็นสัมประสิทธิของ polynomial ถ้า x เป็น matrix จะเรียกว่า matrix polynomial โดยกําลัง
ของ matrix ก็จะใช้หลักการของการยกกําลัง matrix สําหรับ MATLAB สามารถจะเขียน polynomial ของ
matrix โดยใช้function polyvalm
polyvalm (a,x) เป็นการหาค่า polynomial ของ matrix x โดยใช้สัมประสิทธิ์ a ซึ่ง x เป็น
square matrix และ a เป็น row vector
สําหรับ operation ของ Matrix ในทางคณิตศาสตร์เบื้องต้นจะมีประมาณเท่าที่กล่าวมาแล้ว แต่สําหรับ
MATLAB จะมี operation ของ Matrix แบบอื่นๆ อีกมากมาย ทั้งที่มีนิยามตามคณิตศาสตร์และไม่มีในนิยาม
แต่สร้างขึ้นมาเพื่อให้สะดวกแก่การใช้งาน โดยเฉพาะการหาร การทํา operation ของ elements ซึ่งจะกล่าว
ในหัวข้ออื่นต่อไป
2.3 Matrix Functions
Matrix Inverse
ถ้า A เป็น square matrix จะได้ว่า Inverse Matrix ของ A นิยมเขียน A-1 จะนิยามโดย
AA A A I − − = = 1 1
เมื่อ I เป็น identity matrix สําหรับ matrix ที่ไม่สามารถหาค่า inverse ของ matrix ได้จะเรียกว่า singular matrix
ส่วน matrix ที่หาค่า inverse ได้ จะเรียก nonsingular matrix การหาค่า inverse matrix ที่มีขนาดใหญ่เป็นเรื่อง
ยากในทางปฏิบัติ โดยเฉพาะการคํานวณตามหลักของพีชคณิต ดังนั้นส่วนใหญ่ในโปรแกรม
คอมพิวเตอร์นิยมใช้วิธีเชิงตัวเลขมากกว่า สําหรับ MATLAB ก็เช่นกันโดยคําสั่งที่ใช้จะใช้คําสั่ง inv
Basic Operation 30
inv(a) เป็นการคํานวณ inverse ของ matrix a ถ้า a เป็น singular matrix หรือเป็น matrix ที่
ไม่มี inverse MATLAB จะแสดงขอความบอกความผิดพลาด
ตัวอย่างเช่น A=[1 4;8 9];
inv(A)
ans =
-0.3913 0.1739
0.3478 -0.0435
- Rank of Matrix
ถ้าแต่ละ row ของ matrix แทนแต่ละสมการในพีชคณิตเชิงเส้น rank ของ matrix คือจํานวนสมการ
ที่ไม่ขึ้นต่อกันของระบบสมการนั้น เช่น
a =(1 2 3
2 4 6)
จะเห็นว่า row ที่ 2 เป็น 2 เท่าของ row แรก ดังนั้น row ทั้งสองจะขึ้นต่อกัน ทําให้ a นี้มี rank เท่ากับ 1
โดยทั่วไปแล้ว matrix ที่มี rank น้อยกว่าจํานวน row จะเป็น singular matrix สําหรับ MATLAB จะหา rank
จากคําสั่ง rank
rank(a) การคํานวณหา rank ของ matrix a
ตัวอย่างเช่น
a=[1 2 3;2 4 6];
rank(a)
ans =
1
- Determinant of Matrix
Determinant ของ square matrix เปนการหาคา scalar ของ matrix คําสั่งการหาคา determinant ของ
square matrix a ใน MATLAB คือ
det(a) หาค่า determinant ของ a
สําหรับ matrix มี determinate เท่ากับศูนย์matrix นั้นจะเป็น singular matrix การหา determinant โดย MATLAB
มีตัวอย่างเช่น
a=[1 2 3; 2 7 6; 5 4 8];
det(a)
ans =
-21
-การหาร Matrix
Basic Operation 31
ความจริงแล้ว matrix ไม่มีคุณสมบัติของการหาร แต่ MATLAB ได้สร้าง function นี้ขึ้นมาเพื่อ
สะดวกในการแก้ ระบบสมการ linear equations พิจารณา
Ax B =
ดังนั้น x A B = −1
ซึ่ง MATLAB จะใช้ สัญลักษณ์ x=A\B
∴ A\B = A-1B
หากพิจารณา
xA = B
จะได x = BA-1
ซึ่ง MATLAB จะใช B/A
ดังนั้น B/A = BA-1
-สําหรับ เครื่องหมาย / ใน MATLAB จะเรียก left matrix division
- สําหรับ เครื่องหมาย \ ใน MATLAB จะเรียก right matrix division
- วิธีเชิงตัวเลขที่ใช้ในการคํานวณหาค่า x MATLAB จะใช้ Gauss elimination numerical
Technique
สําหรับตัวอย่างในกรณีนี้จะอยู่ในหัวข้อการหาค่าคําตอบของระบบสมการเชิงเสน ซึ่งจะกล่าวถึงวิธีการ
นี้อย่างละเอียด
- Matrix Decomposition
โดยทั่วไปแลวเราสามารถจะแยก matrix A ออกเป็นผลคูณของ matrix 2 matrix ซึ่งเรียกว่า
Decomposition หรือ Factorization ของ matrix ในปญหาทางคณิตศาสตร์หลาย ๆ กรณี หากเราแยก matrix
ออกแล้ว จะสามารถลดการคํานวณต่างๆ ให้มีขั้นตอนน้อยลงได้ การ decomposed matrix ที่นิยมทํากันมี 3
วิธีคือ
- LU-decomposition หรือบางครั้งเรียก Triangular Factorization คือการแยก matrix ออกเป็นผล
คูณของสอง matrix โดยแยกเป็น lower triangular matrix และ upper triangular matrix
- Lower Triangular matrix, L, คือ matrix ที่มีค่าของ elements ที่อย่ด้านบนของ main diagonal เป็น
ศูนย์ (มีค่าเฉพาะที่อยู่มากว่า main diagonal) ตัวอย่างเช่น
L =
{1 0 0
4 2 0
5 6 3}
Basic Operation 32
- Upper Triangular matrix, U คือ matrix ที่มีคาของ elements ที่อยู่ด้านล่างของ main diagonal เป็น
ศูนย์ (มีค่าเฉพาะที่อยู่สูงกว่า main diagonal) ตัวอย่างเช่น
U =
{1 2 3
0 4 5
0 0 6}
ดังนั้น สําหรับการแยก A ออกเป็นผลคูณของสอง matrix หรือ
A = LU
สําหรับ MATLAB จะใช้
[L,U]= lu(A) คํานวณหา matrix ที่ได้จากการแยก A ออกเป็น Lower triangular L และ
upper triangular U ซึ่งทําให้ LU = A และ Matrix A จะต้องเป็น Square
Matrix เท่านั้น
ตัวอย่างเช่น
A=[1 3 2;-2 –6 1;2 5 7];
[L,U]=lu(A)
LD =
-0.5000 0 1.0000
1.0000 0 0
-1.0000 1.0000 0
UD =
-2.0000 -6.0000 1.0000
0 -1.0000 8.0000
0 0 2.5000
- LU-decomposition อาจหาคําตอบได้ไม่เหมือนกับการแยกด้วยมือ แต่นั้นไม่สําคัญเนื่องจากคําตอบของ
การหา LU-decomposition ไม่ได้มีคํ าตอบเดียว และในการหาทั้ งสองแบบนี้ได้รวม permutes lower
triangular factor แล้ว
สําหรับในกรณีที่ต้องการทราบ permuted lower triangular factor ด้วยจะใช้คําสั่ง
[L,U,P]= lu(A)
L =
1.0000 0 0
-1.0000 1.0000 0
-0.5000 0 1.0000
U =
-2.0000 -6.0000 1.0000
0 -1.0000 8.0000
0 0 2.5000
P =
0 1 0
0 0 1
1 0 0
Basic Operation 33
และ PA = LU
- QR-Decomposition เป็นอีกวิธีหนึ่งในการแยก matrix ออกเป็น orthonormal matrix Q และ upper
triangular matrix, R (ซึ่งบางครั้งเรียก right hand matrix เพราะมีค่าเฉพาะด้านขวามือของ main diagonal
เท่านั้น) โดย orthogonal matrix คือ matrix ที่มีคุณสมบัติ
I QQT =
หรือ
Q QT − = 1
สําหรับ MATLAB ใช้
[Q,R]= qr(A) คํานวณหา matrix Q และ R ซึ่งทําให้ A = QR โดย Q เป็น orthonormal
และ R เป็น upper triangular matrix โดยที่ A ไม่จําเป็นจะต้องเป็น Square
Matrix
เช่น
A=[1 2 3; 5 8 7];
[Q,R]=qr(A)
Q =
-0.1961 -0.9806
-0.9806 0.1961
R =
-5.0990 -8.2369 -7.4524
0 -0.3922 -1.5689
-Singular Value decomposition (SVD) เป็นการ decomposed matrix ออกเป็นผลคูณของ matrix 3
matrix คือ
A = QSV
โดย Q และ V เป็น orthonormal matrix และ S เป็น diagonal matrix สําหรับ MATLAB ใช้
[Q,S,V]=svd(A) decompose A ออกเป็น A = QSV เมื่อ Q และ V เป็น orthonormal
และ s เป็น diagonal matrix
-สําหรับการ decompose ทั้ง 3 กรณีนั้น ถ้า A มีขนาดเป็น [m x n] จะได้
- U, L และ R มีขนาดเดียวกันกับ A
- Q มีขนาดเป็น m x m
- V มีขนาดเป็น n x n
- S มีขนาดเป็น m x n
Basic Operation 34
ตัวอย่างเช่น
A=[1 4;8 9];
[L,U]=lu(A)
L =
0.1250 1.0000
1.0000 0
U =
8.0000 9.0000
0 2.8750
[Q,R]=qr(A)
Q =
-0.1240 -0.9923
-0.9923 0.1240
R =
-8.0623 -9.4266
0 -2.8528
[Q,S,V] = svd(A)
Q =
0.2966 0.9550
0.9550 -0.2966
S =
12.5963 0
0 1.8259
V =
0.6301 -0.7765
0.7765 0.6301
Array Operation
ในหลายๆ กรณีเรามีความจําเป็นที่จะคูณหรือหารเฉพาะ element ของ matrix เท่านั้น ซึ่งนิยม
เรียก element - by - element operation หรือ array operation ตัวอย่างเช่นพิจารณา
A = [1 2 3 4];
B = [2 4 4 5];
จะพบว่า A * B จะไม่สามารถหาค่าได้ แต่หากเราต้องการ matrix C ซึ่งมีค่าเป็น c ab i i i = หรือ
( ) ( ) ( ) c A B 1 1 1 = * , ( ) ( ) ( ) c A B 2 2 2 = * ,...
เราจะสามารถใช้คําสั่ง array operation ได้โดยใช้ “.” แลวตามด้วย “ * ”
C = A.*B
ทํานองเดียวกัน หากต้องการหาค่า D ซึ่งมี element แต่ละ clement เท่ากับผลหารของแต่ละ element ของ A
หารดวย B ในตําแหนงเดียวกัน จะใช “ . ” แลวตามดวย “ / ” เชน
D = A./B
สวนการยกกําลัง
E = A.^B
Basic Operation 35
จะไดวา E จะมี element แตละตัวเทากับ element นั้นของ A ยกกําลังดวย element ที่ตําแหนงเดียวกันของ B
ตัวอบางเชน
A=[1 2 3 4 5];
B=[4 5 9 10 2];
A.*B
ans =
4 10 27 40 10
B.^A
ans =
4 25 729 10000 32
การใช Array operation สําหรับ matrix จะตองใชไดกับ matrix ที่มีขนาดเทากันเทานั้น
ลําดับการคํานวณ
ขั้นตอนการคํานวณใน MATLAB ก็เชนเดียวกันกับพีชคณิต ทั่วไปคือจะทําตามลําดับดังนี้คือ
(1) คํานวณในวงเล็บกอน โดยเริ่มจากวงเล็บในสุดกอน
(2) ยกกําลัง โดยเริ่มจากซายไปขวา
(2) คูณหรือหาร โดยเริ่มจากซายไปขวา
(3) บวก หรือ ลบ โดยเริ่มจากซายไปขวา
เพื่อใหลําดับการคํานวณเปนไปตามที่ตองการควรใชวงเล็บเขาชวย เพื่อปองกันความผิดพลาดที่อาจ
เกิดขึ้นได
การจัดเรียง Matrix ใหม
ในหลายกรณี เรามีความจําเปนตองจัด matrix ใหอยูในรูปอื่นๆ เพื่อความเหมาะสม เพื่อใชใน
การคํานวณที่เราตองการ ซึ่ง MATLAB มี function ตอไปนี้
rot90(A) จะหมุน matrix A ไป 90° ทวนเข็มนาฬิกา
rot90(A,n) จะหมุน matrix A ไป 90° เปนจํานวน n ครั้ง ในทิศทวนเข็มนาฬิกา
fliplr(A) พลิก Matrix A จากซายไปขวาคือเอา column ซายสุดไปไวขวาสุดแลว
สลับที่กันตอ ๆ ไปจนครบ
flipud(A) พลิก Matrix A จากบนลงลางคือเอา row บนสุดไปไวลางสุดแลวสลับที่
กันตอๆ ไปจนครบ
reshape(A,m,n) จัด matrix A ใหมใหมีขนาดเปน [m x n] โดย element ของ matrix A เดิม
ตองมีจํานวนเทากับ mn ดวย และ MATLAB จะพิจารณาเพิ่มหรือลด
ขนาดไปทีละ column ของ A
Basic Operation 36
diag(x) ถา x เปน matrix จะไดผลเปน vector ที่มี main diagonal ของ x เปน
element ถา x เปน vector จะไดผลเปน matrix ที่มี vector A เปน diagonal
triu(A) สราง square matrix จาก matrix A โดยตัดสวนที่อยูต่ากวา main diagonal
ของ A ใหเปนศูนย
triu(A,k) สราง square matrix จาก matrix A โดยตัดสวนที่ตํากวา diagonal ที่ k ของ
A ใหเปนศูนย
tril(A) สราง square matrix จาก matrix A โดยตัดสวนที่อยูสูงกวา main diagonal
ของ A ใหเปนศูนย
tril(A,k) สราง square matrix จาก matrix A โดยตัดสวนที่อยูสูงกวา diagonal ที่ k
ของ A ใหเปนศูนย
ตัวอยางเชนกําหนดให
A=[1 2 3;0 2 4;3 6 8]
A =
1 2 3
0 2 4
3 6 8
rot90(A)
ans =
3 4 8
2 2 6
1 0 3
tril(A)
ans =
1 0 0
0 2 0
3 6 8
triu(A,2)
ans =
0 0 3
0 0 0
0 0 0
diag(A)
ans =
1
2
8
flipud(A)
ans =
3 6 8
0 2 4
1 2 3
Basic Operation 37
2.4 Multidimensional Arrays
ตามที่กลาวมาแลววาเดิมนั้น MATLAB จะจํากัดตัวแปรอยูในลักษณะ 2 มิติ แตสําหรับ MATLAB
version 5 ขึ้นไปจะสามารถจํากัดตัวแปรใหมีมิติมากกวา 2 ได ยกตัวอยางเชนเรามีตัวแปรที่เปน Matrix 2
มิติดังนี้
x=[1 3 5; 4 2 8]
x =
1 3 5
4 2 8
y=[7 1 4;2 0 1]
y =
7 1 4
2 0 1
z=[4 2 1;3 6 9]
z =
4 2 1
3 6 9
จากนั้นเราตองการที่จะรวมตัวแปรทั้ง 3 นี้ใหเปนตัวแปรเดียวกัน นั่นคือตองมีการสรางมิติที่ 3
ขึ้นมาสําหรับตัวแปรตัวนี้ ตัวแปรที่มี 3 มิตินี้สามารถจิตนาการไดวา เหมือนกับการที่เรานําตัวแปร x, y,
z มาเขียนไวบนกระดาษแตละหนาจากนั้นเย็บกระดาษทั้งสามหนาเขาดวยกัน การที่จะบอกตําแหนง
ของคาใดคาหนึ่งจะตองบอกใหชัดเจนวาอยูที่หนาใด row ใด และ column ใด ซึ่งจะเปนการบอกทั้งสาม
มิตินั่นเอง สวนตัวแปรที่มีมิติมากกวานี้ก็สามารถที่จะสรางไดเชนกัน สําหรับการรวบรวมหรือเรียงตอ
(concatenates) ตัวแปรทั้งสามที่กลาวมาแลวก็สามารถทําไดโดยใชคําสั่ง cat ดังนี้
d=cat(3,x,y,z)
d(:,:,1)=
1 3 5
4 2 8
d(:,:,2)=
7 1 4
2 0 1
d(:,:,3)=
4 2 1
3 6 9
size(d)
ans =
2 3 3
ซึ่งจากเดิมที่ x, y, z มีมิติเปน 2 x 3 เราจะได d มีขนาดเปน 2 x 3 x 3 สําหรับรายระเอียดของการใช cat มี
ดังนี้
Cat(dims,A1,A2,A3,...)
Basic Operation 38
เปนการเรียง matrix A1, A2, A3,... ซึ่งเปน matrix ซึ่งมีขนาดเทากัน
รวบรวมเขาไวดวยกันทั้งหมดจํานวน dims matrix
สําหรับคําสั่งที่ใชกับ Multi-dimensional Array มีดังนี้
ndim(A) จะใหคําตอบเปนจํานวน dimension ของ A
B = permute(A,order) การสลับจัดเรียงตัวแปร A ใหมใหเปน B ซึ่งมี order ตามที่ตองการ
โดย order เปน vector ที่กําหนดขนาดของ B และตัวแปรที่กําหนด
ใหมจะตองมีจํานวน element เทากับตัวแปรเดิม
ipermute(A,order) ยอนกลับคําสั่ง permute(A, order)
shiftdim(A,n) ขามสลับ dimension ของ A ไปจํานวน n
B = squeeze(A) เปนการยาย dimension ที่เทากับ 1 ออกไป ซึ่งจะได B ซึ่งมี element
ทุกตัวเหมือน A แตมิติใดที่เทากับ 1 จะถูกกําจัดออกไป สําหรับ
คําสั่งนี้จะไมมีผลกระทบตอ matrix ดังนั้นหากใชคําสั่งนี้กับ vector
ก็จะไดผลออกมาเปน vector เชนเดิม
ตัวอยางของคําสั่งเหลานี้เชน
x=[1 3 5;4 2 8];
y=[7 1 4;2 0 1];
z=[4 2 1;3 6 9];
d=cat(3,x,y,z);
e = permute(d,[3 1 2])
e(:,:,1) =
1 4
7 2
4 3
e(:,:,2) =
3 2
1 0
2 6
e(:,:,3) =
5 8
4 1
1 9
f = ipermute(e,[3 1 2])
f(:,:,1) =
1 3 5
4 2 8
f(:,:,2) =
7 1 4
2 0 1
f(:,:,3) =
4 2 1
3 6 9
g=shiftdim(d,2)
g(:,:,1) =
1 4
7 2
Basic Operation 39
4 3
g(:,:,2) =
3 2
1 0
2 6
g(:,:,3) =
5 8
4 1
1 9
p=rand(2,1,4,3);
size(p)
ans =
2 1 4 3
p=squeeze(p);
size(p)
ans =
2 4 3
สําหรับการที่จะกําหนดเลือกคาตัวแปรที่ตําแหนงใดก็สามารถจะกําหนดไดโดยบอกตําแหนงที่
เราตองการ เชนตองการทราบคาที่ตําแหนง 1-1-3 ของตัวแปร g ตามตัวอยางขางบนจะใช
g(1,1,3)
ans =
5
2.5 Cell Arrays
สําหรับโครงสรางตัวแปรใหมอีกแบบหนึ่งของ MATLAB 5 ก็คือการที่มี cell array ซึ่งใน version
กอนหนานี้ แตละ element ของ matrix ตองเปนตัวเลขหรือตัวหนังสือเทานั้น สําหรับความหมายของ cell
array ก็คลายกับวาเปนการยอมใหในแตละ element ของ matrix เปน matrix ไดนั่นเอง
- การกําหนด Cell Arrays
การกําหนด cell arrays จะใชวงเล็บปกกา { } ซึ่งสามารถทําได 2 วิธีคือ
- กําหนดแบบ cell index
x(1,1)={[1 2;3 4]};
x(1,2)={5};
x(2,1)={linspace(0,10,10)};
x(2,2)={'Text Only'};
กําหนดแบบ content addressing
x{1,1}=[1 2;3 4];
x{1,2}=5;
x{2,1}=linspace(0,10,10);
x{2,2}='Text Only';
ซึ่งทั้งสองแบบนี้จะใหผลเหมือนกันและสามารถที่จะใชแทนกันได จากตัวอยางขางบนเราได
สราง matrix x ซึ่งมีขนาด 2 x 2 โดยแตละ element จะมี cell ยอยลงไปอีก เชน x(1,1) จะเปน matrix ขนาด 2
x 2 ซอนอยูเปนตน หากเราตองการทราบคาและขนาดของ x ก็สามารถใชคําสั่ง
Basic Operation 40
x
x =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
size(x)
ans =
2 2
และชนิดของ x สามารถทราบไดจาก
class(x)
ans =
cell
นั่นคือ x เปน cell arrays หากตองการทราบคาทั้งหมดที่บรรจุใน x ก็สามารถใชคําสั่ง celldisp ไดดังนี้
celldisp(x)
x{1,1} =
1 2
3 4
x{2,1} =
Columns 1 through 7
0 1.1111 2.2222 3.3333 4.4444 5.5556 6.6667
Columns 8 through 10
7.7778 8.8889 10.0000
x{1,2} =
5
x{2,2} =
Text Only
หรือหากตองการเจาะจง cell ก็สามารถกําหนดไดโดยใชวงเล็บปกกาเชน
x{1,2}
ans =
5
สําหรับการสราง cell array ตามแบบที่เคยสรางใน matrix แบบเดิมก็ยังคงสามารถกระทําได โดย
ใชเครื่องหมายปกกาแทนวงเล็บใหญสวนการแบง column ยังคงใช ; เหมือนเดิม เชน
y={[1 3; 5 6], [2 3; 5 7]; ['TOM';'TON'],[2+i 5+4i]}
y =
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
ในการสราง cell array ที่วางเปลาสามารถทําไดโดยใชคําสั่ง cell เชน
Z=cell(2,2)
z =
[] []
[] []
การรวม เปลี่ยนรูปและกําหนดคา Cell Array
Basic Operation 41
การรวมหรือเปลี่ยนรูป cell array ก็สามารถกระทําไดเหมือนการรวม matrix ปกติที่เราทําผานมา
เชนจากตัวแปรที่กําหนดในตัวอยางที่ผานมาคือ
x
x =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
y
y =
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
หากเราตองการรวมหรือเปลี่ยนรูปก็สามารถทําไดดังนี้
a=[x y]
a =
[2x2 double] [ 5] [2x2 double] [2x2 double]
[1x10 double] 'Text Only' [2x3 char ] [1x2 double]
b=[x;y]
b =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
หากตองการตัด matrix บางสวนก็สามารถใช colon operator ไดเชน
c=b(2:3,1)
c =
[1x10 double]
[2x2 double]
และหากตองการเปลี่ยนรูปก็สามารถใช คําสั่ง reshape ได เชน
c=reshape(b,2,4)
c =
[2x2 double] [2x2 double] [ 5] [2x2 double]
[1x10 double] [2x3 char ] 'Text Only' [1x2 double]
สําหรับการกําหนดคา หรือเขาเปลี่ยนแปลงคาใน cell array เราก็สามารถกระทําได โดย
- ถา cell นั้นเปนตัวแปรตัวเดียวหรือตองการทราบคาทั้งหมดใน cell นั้นก็สามารถกําหนดคา
โดยใชเครื่องหมายปกกาบอกตําแหนงได
- ถา cell นั้นเปน matrix ซอนอยูใหใชเครื่องหมายปกกากําหนดตําแหนง cell แลวตอดวย
วงเล็บกําหนดตําแหนงใน matrix นั้นอีกครั้งหนึ่ง
- ถาหากวาตองการทราบหรือกําหนดคาเปนชวงสามารถทําไดโดยใชคําสั่ง deal
Basic Operation 42
เชนจากตัวอยางขางบนถา
c
c =
[2x2 double] [2x2 double] [ 5] [2x2 double]
[1x10 double] [2x3 char ] 'Text Only' [1x2 double]
c{1,4}
ans =
2 3
5 7
c{1,4}(2,1)
ans =
5
[p q] = deal(c{1,2:3})
p =
1 3
5 6
q =
5
Cell Array และ Character String
สําหรับ character string เดิมนั้นหากจะนํามารวมอยูใน matrix แลวขอที่ควรระวังก็คือ ทุกแถว
จะตองมีจํานวน column เทากันซึ่งในทางปฏิบัติที่เกี่ยวของกับตัวหนังสือแลวการทําเชนนั้นคอนขางที่จะ
ยุงยาก แตในกรณีของ MATLAB 5.x การใช cell arrays จะชวยใหเราสามารถบรรจุ character string ที่มีความ
ยาวตางกันลงไปอยูใน column เดียวกันของ cell ได ตัวอยางเชน
x={'Tom';'Pookie';'Tata';'Nut';'Christina';'Mai'}
x =
'Tom'
'Pookie'
'Tata'
'Nut'
'Christina'
'Mai'
class(x)
ans =
cell
size(x)
ans =
6 1
ซึ่งจะเห็นวาตัวแปร x เปน cell array ที่มี 6 row x 1 column และในแตละ row ไมจําเปนตองมีความ
ยาวเทากัน ซึ่งการปรับปรุงเชนนี้จะทําใหมีความสะดวกในการกรอกขอมูลมากขึ้นกว่าเดิมมาก
edit @ 2007/05/09 17:26:36
การกําหนดค่าตัวแปรนอกจะกําหนดเป็นตัวเลขแล้ว เรายังสามารถกําหนดเป็นตัวหนังสือได้อีก
ด้วย โดยการกําหนดค่าตัวแปรที่เป็นตัวหนังสือหรือที่เรียกว่า string จะต้องใส่ค่าที่เราต้องการกําหนดใน
เครื่องหมาย quotation “'” ดังตัวอย่างเช่น
Str1='Tom';
Str2='Pookie';
การกําหนดค่าตัวแปรเป็น string จะมีประโยชน์ในกรณีที่ต้องส่งค่าตัวแปรที่เป็นตัวหนังสือไป
ให้ function เพื่อใช้ในการประมวลผลหรือแสดงคําสั่งที่ต้องการ
สําหรับการกําหนดตัวแปรให้เป็น matrix โดยมีค่าแต่ละ element เป็น string นั้นมีข้อจํากัดอย่าง
หนึ่งคือทุกตัวแปรจะต้องมีความยาวเท่ากัน ซึ่งข้อจํากัดนี้มาจากว่า matrix ต้องมีจํานวน column ในแต่ละ
row เท่ากัน ซึ่งจากข้อจํากัดนี้ทําให้เราอาจต้องเพิ่ม blank space มาขั้นในตัวแปรที่เป็น string แต่ละตัว
2.2 Matrix Operation
- Dot Product
Dot Product หรือ inner product เป็นการคํานวณหาค่า scalar value ของ vector ที่มีขนาดเท่ากัน ซึ่งถ้า
A และ B เป็น vector ที่มีขนาดเท่ากันจะได้
∑=
= •
N
i
i ib a B A
1
เมื่อ N เป็นจํานวน element ของ A และ B
ตัวอย่างเช่น A = [1 2 3] B = [4 5 6] จะได้ว่าถ้า C = A⋅B จะได้ (1)(4) + (2)(5) + (3)(6) = 4+10+18 =
32
MATLAB จะใช้คําสั่ง
C = dot(A,B)
Basic Operation 28
dot(A,B) คํานวณหา dot product ของ A และ B ถ้า A และ B เป็น matrix dot product จะเป็น row
vector ที่มี element ในแต่ละ column บรรจุค่า dot product ในแต่ละ column ของ A
และ B
ตัวอย่างเช่น
A=[1 2 3];B=[4 5 6];
ดังนั้น
dot(A,B)
ans =
32
การคูณ Matrix
การที่ Matrix A และ B จะคูณกันได้ matrix ตัวแรกจะต้องมีจํานวน column เท่ากับจํานวน row ของ
ตัวที่สอง และผลจะได้ matrix ที่มีขนาดเท่ากับ row ของตัวแรก และ column ของตัวหลัง เช่น A มีขนาด
[m x n] และ B มีขนาด [p x q] AB จะมีค่าก็ต่อเมื่อ n = p และจะได้ matrix ขนาด m x q ดังนั้นโดยทั่วไป
AB ≠ BA หรือไม่มีการสลับที่การคูณของ matrix สําหรับ MATLAB ถ่า C = AB จะใช้
C = A * B
ถ้าจํานวน column A ไม่เท่ากับจํานวน row ของ B MATLAB จะแสดงข้อความบอกความผิดพลาด
- การคูณ Matrix ด้วย Scalar
การคูณ matrix ด้วย scalar นั้นจะเปนการคูณทุก element ของ matrix ด้วยค่าคงที่ เช่น A=[1 2]; จะ
ได
C =2*A
C =
2 4
การบวก-ลบ Matrix
การที่ matrix จะบวก/ลบกันได้ต้องมีขนาดเท่ากัน และการบวก/ลบจะกระทําโดยบวก/ลบแต่ละ
element ของ matrix
A=[1 2 3];
B=[4 5 6];
C=A-B
C =
-3 -3 -3
- การยกกําลัง Matrix
Matrix ที่จะยกกําลังได้ต้องเป็น square matrix เท่านั้น โดย
Basic Operation 29
A2 = AA
MATLAB จะเขียน A2 เปน A^2 ดังนั้น
A^2 จะเทากับ A*A
A^3 จะเทากับ A*A*A
Matrix Polynomial
สําหรับ polynomial function ของ x จะอยู่ในรูป
f x a x a x a x a n
n
n
n ( ) ... = + + + −
−
1
1
1 0
โดย a a n n , ,... −1 เป็นสัมประสิทธิของ polynomial ถ้า x เป็น matrix จะเรียกว่า matrix polynomial โดยกําลัง
ของ matrix ก็จะใช้หลักการของการยกกําลัง matrix สําหรับ MATLAB สามารถจะเขียน polynomial ของ
matrix โดยใช้function polyvalm
polyvalm (a,x) เป็นการหาค่า polynomial ของ matrix x โดยใช้สัมประสิทธิ์ a ซึ่ง x เป็น
square matrix และ a เป็น row vector
สําหรับ operation ของ Matrix ในทางคณิตศาสตร์เบื้องต้นจะมีประมาณเท่าที่กล่าวมาแล้ว แต่สําหรับ
MATLAB จะมี operation ของ Matrix แบบอื่นๆ อีกมากมาย ทั้งที่มีนิยามตามคณิตศาสตร์และไม่มีในนิยาม
แต่สร้างขึ้นมาเพื่อให้สะดวกแก่การใช้งาน โดยเฉพาะการหาร การทํา operation ของ elements ซึ่งจะกล่าว
ในหัวข้ออื่นต่อไป
2.3 Matrix Functions
Matrix Inverse
ถ้า A เป็น square matrix จะได้ว่า Inverse Matrix ของ A นิยมเขียน A-1 จะนิยามโดย
AA A A I − − = = 1 1
เมื่อ I เป็น identity matrix สําหรับ matrix ที่ไม่สามารถหาค่า inverse ของ matrix ได้จะเรียกว่า singular matrix
ส่วน matrix ที่หาค่า inverse ได้ จะเรียก nonsingular matrix การหาค่า inverse matrix ที่มีขนาดใหญ่เป็นเรื่อง
ยากในทางปฏิบัติ โดยเฉพาะการคํานวณตามหลักของพีชคณิต ดังนั้นส่วนใหญ่ในโปรแกรม
คอมพิวเตอร์นิยมใช้วิธีเชิงตัวเลขมากกว่า สําหรับ MATLAB ก็เช่นกันโดยคําสั่งที่ใช้จะใช้คําสั่ง inv
Basic Operation 30
inv(a) เป็นการคํานวณ inverse ของ matrix a ถ้า a เป็น singular matrix หรือเป็น matrix ที่
ไม่มี inverse MATLAB จะแสดงขอความบอกความผิดพลาด
ตัวอย่างเช่น A=[1 4;8 9];
inv(A)
ans =
-0.3913 0.1739
0.3478 -0.0435
- Rank of Matrix
ถ้าแต่ละ row ของ matrix แทนแต่ละสมการในพีชคณิตเชิงเส้น rank ของ matrix คือจํานวนสมการ
ที่ไม่ขึ้นต่อกันของระบบสมการนั้น เช่น
a =(1 2 3
2 4 6)
จะเห็นว่า row ที่ 2 เป็น 2 เท่าของ row แรก ดังนั้น row ทั้งสองจะขึ้นต่อกัน ทําให้ a นี้มี rank เท่ากับ 1
โดยทั่วไปแล้ว matrix ที่มี rank น้อยกว่าจํานวน row จะเป็น singular matrix สําหรับ MATLAB จะหา rank
จากคําสั่ง rank
rank(a) การคํานวณหา rank ของ matrix a
ตัวอย่างเช่น
a=[1 2 3;2 4 6];
rank(a)
ans =
1
- Determinant of Matrix
Determinant ของ square matrix เปนการหาคา scalar ของ matrix คําสั่งการหาคา determinant ของ
square matrix a ใน MATLAB คือ
det(a) หาค่า determinant ของ a
สําหรับ matrix มี determinate เท่ากับศูนย์matrix นั้นจะเป็น singular matrix การหา determinant โดย MATLAB
มีตัวอย่างเช่น
a=[1 2 3; 2 7 6; 5 4 8];
det(a)
ans =
-21
-การหาร Matrix
Basic Operation 31
ความจริงแล้ว matrix ไม่มีคุณสมบัติของการหาร แต่ MATLAB ได้สร้าง function นี้ขึ้นมาเพื่อ
สะดวกในการแก้ ระบบสมการ linear equations พิจารณา
Ax B =
ดังนั้น x A B = −1
ซึ่ง MATLAB จะใช้ สัญลักษณ์ x=A\B
∴ A\B = A-1B
หากพิจารณา
xA = B
จะได x = BA-1
ซึ่ง MATLAB จะใช B/A
ดังนั้น B/A = BA-1
-สําหรับ เครื่องหมาย / ใน MATLAB จะเรียก left matrix division
- สําหรับ เครื่องหมาย \ ใน MATLAB จะเรียก right matrix division
- วิธีเชิงตัวเลขที่ใช้ในการคํานวณหาค่า x MATLAB จะใช้ Gauss elimination numerical
Technique
สําหรับตัวอย่างในกรณีนี้จะอยู่ในหัวข้อการหาค่าคําตอบของระบบสมการเชิงเสน ซึ่งจะกล่าวถึงวิธีการ
นี้อย่างละเอียด
- Matrix Decomposition
โดยทั่วไปแลวเราสามารถจะแยก matrix A ออกเป็นผลคูณของ matrix 2 matrix ซึ่งเรียกว่า
Decomposition หรือ Factorization ของ matrix ในปญหาทางคณิตศาสตร์หลาย ๆ กรณี หากเราแยก matrix
ออกแล้ว จะสามารถลดการคํานวณต่างๆ ให้มีขั้นตอนน้อยลงได้ การ decomposed matrix ที่นิยมทํากันมี 3
วิธีคือ
- LU-decomposition หรือบางครั้งเรียก Triangular Factorization คือการแยก matrix ออกเป็นผล
คูณของสอง matrix โดยแยกเป็น lower triangular matrix และ upper triangular matrix
- Lower Triangular matrix, L, คือ matrix ที่มีค่าของ elements ที่อย่ด้านบนของ main diagonal เป็น
ศูนย์ (มีค่าเฉพาะที่อยู่มากว่า main diagonal) ตัวอย่างเช่น
L =
{1 0 0
4 2 0
5 6 3}
Basic Operation 32
- Upper Triangular matrix, U คือ matrix ที่มีคาของ elements ที่อยู่ด้านล่างของ main diagonal เป็น
ศูนย์ (มีค่าเฉพาะที่อยู่สูงกว่า main diagonal) ตัวอย่างเช่น
U =
{1 2 3
0 4 5
0 0 6}
ดังนั้น สําหรับการแยก A ออกเป็นผลคูณของสอง matrix หรือ
A = LU
สําหรับ MATLAB จะใช้
[L,U]= lu(A) คํานวณหา matrix ที่ได้จากการแยก A ออกเป็น Lower triangular L และ
upper triangular U ซึ่งทําให้ LU = A และ Matrix A จะต้องเป็น Square
Matrix เท่านั้น
ตัวอย่างเช่น
A=[1 3 2;-2 –6 1;2 5 7];
[L,U]=lu(A)
LD =
-0.5000 0 1.0000
1.0000 0 0
-1.0000 1.0000 0
UD =
-2.0000 -6.0000 1.0000
0 -1.0000 8.0000
0 0 2.5000
- LU-decomposition อาจหาคําตอบได้ไม่เหมือนกับการแยกด้วยมือ แต่นั้นไม่สําคัญเนื่องจากคําตอบของ
การหา LU-decomposition ไม่ได้มีคํ าตอบเดียว และในการหาทั้ งสองแบบนี้ได้รวม permutes lower
triangular factor แล้ว
สําหรับในกรณีที่ต้องการทราบ permuted lower triangular factor ด้วยจะใช้คําสั่ง
[L,U,P]= lu(A)
L =
1.0000 0 0
-1.0000 1.0000 0
-0.5000 0 1.0000
U =
-2.0000 -6.0000 1.0000
0 -1.0000 8.0000
0 0 2.5000
P =
0 1 0
0 0 1
1 0 0
Basic Operation 33
และ PA = LU
- QR-Decomposition เป็นอีกวิธีหนึ่งในการแยก matrix ออกเป็น orthonormal matrix Q และ upper
triangular matrix, R (ซึ่งบางครั้งเรียก right hand matrix เพราะมีค่าเฉพาะด้านขวามือของ main diagonal
เท่านั้น) โดย orthogonal matrix คือ matrix ที่มีคุณสมบัติ
I QQT =
หรือ
Q QT − = 1
สําหรับ MATLAB ใช้
[Q,R]= qr(A) คํานวณหา matrix Q และ R ซึ่งทําให้ A = QR โดย Q เป็น orthonormal
และ R เป็น upper triangular matrix โดยที่ A ไม่จําเป็นจะต้องเป็น Square
Matrix
เช่น
A=[1 2 3; 5 8 7];
[Q,R]=qr(A)
Q =
-0.1961 -0.9806
-0.9806 0.1961
R =
-5.0990 -8.2369 -7.4524
0 -0.3922 -1.5689
-Singular Value decomposition (SVD) เป็นการ decomposed matrix ออกเป็นผลคูณของ matrix 3
matrix คือ
A = QSV
โดย Q และ V เป็น orthonormal matrix และ S เป็น diagonal matrix สําหรับ MATLAB ใช้
[Q,S,V]=svd(A) decompose A ออกเป็น A = QSV เมื่อ Q และ V เป็น orthonormal
และ s เป็น diagonal matrix
-สําหรับการ decompose ทั้ง 3 กรณีนั้น ถ้า A มีขนาดเป็น [m x n] จะได้
- U, L และ R มีขนาดเดียวกันกับ A
- Q มีขนาดเป็น m x m
- V มีขนาดเป็น n x n
- S มีขนาดเป็น m x n
Basic Operation 34
ตัวอย่างเช่น
A=[1 4;8 9];
[L,U]=lu(A)
L =
0.1250 1.0000
1.0000 0
U =
8.0000 9.0000
0 2.8750
[Q,R]=qr(A)
Q =
-0.1240 -0.9923
-0.9923 0.1240
R =
-8.0623 -9.4266
0 -2.8528
[Q,S,V] = svd(A)
Q =
0.2966 0.9550
0.9550 -0.2966
S =
12.5963 0
0 1.8259
V =
0.6301 -0.7765
0.7765 0.6301
Array Operation
ในหลายๆ กรณีเรามีความจําเป็นที่จะคูณหรือหารเฉพาะ element ของ matrix เท่านั้น ซึ่งนิยม
เรียก element - by - element operation หรือ array operation ตัวอย่างเช่นพิจารณา
A = [1 2 3 4];
B = [2 4 4 5];
จะพบว่า A * B จะไม่สามารถหาค่าได้ แต่หากเราต้องการ matrix C ซึ่งมีค่าเป็น c ab i i i = หรือ
( ) ( ) ( ) c A B 1 1 1 = * , ( ) ( ) ( ) c A B 2 2 2 = * ,...
เราจะสามารถใช้คําสั่ง array operation ได้โดยใช้ “.” แลวตามด้วย “ * ”
C = A.*B
ทํานองเดียวกัน หากต้องการหาค่า D ซึ่งมี element แต่ละ clement เท่ากับผลหารของแต่ละ element ของ A
หารดวย B ในตําแหนงเดียวกัน จะใช “ . ” แลวตามดวย “ / ” เชน
D = A./B
สวนการยกกําลัง
E = A.^B
Basic Operation 35
จะไดวา E จะมี element แตละตัวเทากับ element นั้นของ A ยกกําลังดวย element ที่ตําแหนงเดียวกันของ B
ตัวอบางเชน
A=[1 2 3 4 5];
B=[4 5 9 10 2];
A.*B
ans =
4 10 27 40 10
B.^A
ans =
4 25 729 10000 32
การใช Array operation สําหรับ matrix จะตองใชไดกับ matrix ที่มีขนาดเทากันเทานั้น
ลําดับการคํานวณ
ขั้นตอนการคํานวณใน MATLAB ก็เชนเดียวกันกับพีชคณิต ทั่วไปคือจะทําตามลําดับดังนี้คือ
(1) คํานวณในวงเล็บกอน โดยเริ่มจากวงเล็บในสุดกอน
(2) ยกกําลัง โดยเริ่มจากซายไปขวา
(2) คูณหรือหาร โดยเริ่มจากซายไปขวา
(3) บวก หรือ ลบ โดยเริ่มจากซายไปขวา
เพื่อใหลําดับการคํานวณเปนไปตามที่ตองการควรใชวงเล็บเขาชวย เพื่อปองกันความผิดพลาดที่อาจ
เกิดขึ้นได
การจัดเรียง Matrix ใหม
ในหลายกรณี เรามีความจําเปนตองจัด matrix ใหอยูในรูปอื่นๆ เพื่อความเหมาะสม เพื่อใชใน
การคํานวณที่เราตองการ ซึ่ง MATLAB มี function ตอไปนี้
rot90(A) จะหมุน matrix A ไป 90° ทวนเข็มนาฬิกา
rot90(A,n) จะหมุน matrix A ไป 90° เปนจํานวน n ครั้ง ในทิศทวนเข็มนาฬิกา
fliplr(A) พลิก Matrix A จากซายไปขวาคือเอา column ซายสุดไปไวขวาสุดแลว
สลับที่กันตอ ๆ ไปจนครบ
flipud(A) พลิก Matrix A จากบนลงลางคือเอา row บนสุดไปไวลางสุดแลวสลับที่
กันตอๆ ไปจนครบ
reshape(A,m,n) จัด matrix A ใหมใหมีขนาดเปน [m x n] โดย element ของ matrix A เดิม
ตองมีจํานวนเทากับ mn ดวย และ MATLAB จะพิจารณาเพิ่มหรือลด
ขนาดไปทีละ column ของ A
Basic Operation 36
diag(x) ถา x เปน matrix จะไดผลเปน vector ที่มี main diagonal ของ x เปน
element ถา x เปน vector จะไดผลเปน matrix ที่มี vector A เปน diagonal
triu(A) สราง square matrix จาก matrix A โดยตัดสวนที่อยูต่ากวา main diagonal
ของ A ใหเปนศูนย
triu(A,k) สราง square matrix จาก matrix A โดยตัดสวนที่ตํากวา diagonal ที่ k ของ
A ใหเปนศูนย
tril(A) สราง square matrix จาก matrix A โดยตัดสวนที่อยูสูงกวา main diagonal
ของ A ใหเปนศูนย
tril(A,k) สราง square matrix จาก matrix A โดยตัดสวนที่อยูสูงกวา diagonal ที่ k
ของ A ใหเปนศูนย
ตัวอยางเชนกําหนดให
A=[1 2 3;0 2 4;3 6 8]
A =
1 2 3
0 2 4
3 6 8
rot90(A)
ans =
3 4 8
2 2 6
1 0 3
tril(A)
ans =
1 0 0
0 2 0
3 6 8
triu(A,2)
ans =
0 0 3
0 0 0
0 0 0
diag(A)
ans =
1
2
8
flipud(A)
ans =
3 6 8
0 2 4
1 2 3
Basic Operation 37
2.4 Multidimensional Arrays
ตามที่กลาวมาแลววาเดิมนั้น MATLAB จะจํากัดตัวแปรอยูในลักษณะ 2 มิติ แตสําหรับ MATLAB
version 5 ขึ้นไปจะสามารถจํากัดตัวแปรใหมีมิติมากกวา 2 ได ยกตัวอยางเชนเรามีตัวแปรที่เปน Matrix 2
มิติดังนี้
x=[1 3 5; 4 2 8]
x =
1 3 5
4 2 8
y=[7 1 4;2 0 1]
y =
7 1 4
2 0 1
z=[4 2 1;3 6 9]
z =
4 2 1
3 6 9
จากนั้นเราตองการที่จะรวมตัวแปรทั้ง 3 นี้ใหเปนตัวแปรเดียวกัน นั่นคือตองมีการสรางมิติที่ 3
ขึ้นมาสําหรับตัวแปรตัวนี้ ตัวแปรที่มี 3 มิตินี้สามารถจิตนาการไดวา เหมือนกับการที่เรานําตัวแปร x, y,
z มาเขียนไวบนกระดาษแตละหนาจากนั้นเย็บกระดาษทั้งสามหนาเขาดวยกัน การที่จะบอกตําแหนง
ของคาใดคาหนึ่งจะตองบอกใหชัดเจนวาอยูที่หนาใด row ใด และ column ใด ซึ่งจะเปนการบอกทั้งสาม
มิตินั่นเอง สวนตัวแปรที่มีมิติมากกวานี้ก็สามารถที่จะสรางไดเชนกัน สําหรับการรวบรวมหรือเรียงตอ
(concatenates) ตัวแปรทั้งสามที่กลาวมาแลวก็สามารถทําไดโดยใชคําสั่ง cat ดังนี้
d=cat(3,x,y,z)
d(:,:,1)=
1 3 5
4 2 8
d(:,:,2)=
7 1 4
2 0 1
d(:,:,3)=
4 2 1
3 6 9
size(d)
ans =
2 3 3
ซึ่งจากเดิมที่ x, y, z มีมิติเปน 2 x 3 เราจะได d มีขนาดเปน 2 x 3 x 3 สําหรับรายระเอียดของการใช cat มี
ดังนี้
Cat(dims,A1,A2,A3,...)
Basic Operation 38
เปนการเรียง matrix A1, A2, A3,... ซึ่งเปน matrix ซึ่งมีขนาดเทากัน
รวบรวมเขาไวดวยกันทั้งหมดจํานวน dims matrix
สําหรับคําสั่งที่ใชกับ Multi-dimensional Array มีดังนี้
ndim(A) จะใหคําตอบเปนจํานวน dimension ของ A
B = permute(A,order) การสลับจัดเรียงตัวแปร A ใหมใหเปน B ซึ่งมี order ตามที่ตองการ
โดย order เปน vector ที่กําหนดขนาดของ B และตัวแปรที่กําหนด
ใหมจะตองมีจํานวน element เทากับตัวแปรเดิม
ipermute(A,order) ยอนกลับคําสั่ง permute(A, order)
shiftdim(A,n) ขามสลับ dimension ของ A ไปจํานวน n
B = squeeze(A) เปนการยาย dimension ที่เทากับ 1 ออกไป ซึ่งจะได B ซึ่งมี element
ทุกตัวเหมือน A แตมิติใดที่เทากับ 1 จะถูกกําจัดออกไป สําหรับ
คําสั่งนี้จะไมมีผลกระทบตอ matrix ดังนั้นหากใชคําสั่งนี้กับ vector
ก็จะไดผลออกมาเปน vector เชนเดิม
ตัวอยางของคําสั่งเหลานี้เชน
x=[1 3 5;4 2 8];
y=[7 1 4;2 0 1];
z=[4 2 1;3 6 9];
d=cat(3,x,y,z);
e = permute(d,[3 1 2])
e(:,:,1) =
1 4
7 2
4 3
e(:,:,2) =
3 2
1 0
2 6
e(:,:,3) =
5 8
4 1
1 9
f = ipermute(e,[3 1 2])
f(:,:,1) =
1 3 5
4 2 8
f(:,:,2) =
7 1 4
2 0 1
f(:,:,3) =
4 2 1
3 6 9
g=shiftdim(d,2)
g(:,:,1) =
1 4
7 2
Basic Operation 39
4 3
g(:,:,2) =
3 2
1 0
2 6
g(:,:,3) =
5 8
4 1
1 9
p=rand(2,1,4,3);
size(p)
ans =
2 1 4 3
p=squeeze(p);
size(p)
ans =
2 4 3
สําหรับการที่จะกําหนดเลือกคาตัวแปรที่ตําแหนงใดก็สามารถจะกําหนดไดโดยบอกตําแหนงที่
เราตองการ เชนตองการทราบคาที่ตําแหนง 1-1-3 ของตัวแปร g ตามตัวอยางขางบนจะใช
g(1,1,3)
ans =
5
2.5 Cell Arrays
สําหรับโครงสรางตัวแปรใหมอีกแบบหนึ่งของ MATLAB 5 ก็คือการที่มี cell array ซึ่งใน version
กอนหนานี้ แตละ element ของ matrix ตองเปนตัวเลขหรือตัวหนังสือเทานั้น สําหรับความหมายของ cell
array ก็คลายกับวาเปนการยอมใหในแตละ element ของ matrix เปน matrix ไดนั่นเอง
- การกําหนด Cell Arrays
การกําหนด cell arrays จะใชวงเล็บปกกา { } ซึ่งสามารถทําได 2 วิธีคือ
- กําหนดแบบ cell index
x(1,1)={[1 2;3 4]};
x(1,2)={5};
x(2,1)={linspace(0,10,10)};
x(2,2)={'Text Only'};
กําหนดแบบ content addressing
x{1,1}=[1 2;3 4];
x{1,2}=5;
x{2,1}=linspace(0,10,10);
x{2,2}='Text Only';
ซึ่งทั้งสองแบบนี้จะใหผลเหมือนกันและสามารถที่จะใชแทนกันได จากตัวอยางขางบนเราได
สราง matrix x ซึ่งมีขนาด 2 x 2 โดยแตละ element จะมี cell ยอยลงไปอีก เชน x(1,1) จะเปน matrix ขนาด 2
x 2 ซอนอยูเปนตน หากเราตองการทราบคาและขนาดของ x ก็สามารถใชคําสั่ง
Basic Operation 40
x
x =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
size(x)
ans =
2 2
และชนิดของ x สามารถทราบไดจาก
class(x)
ans =
cell
นั่นคือ x เปน cell arrays หากตองการทราบคาทั้งหมดที่บรรจุใน x ก็สามารถใชคําสั่ง celldisp ไดดังนี้
celldisp(x)
x{1,1} =
1 2
3 4
x{2,1} =
Columns 1 through 7
0 1.1111 2.2222 3.3333 4.4444 5.5556 6.6667
Columns 8 through 10
7.7778 8.8889 10.0000
x{1,2} =
5
x{2,2} =
Text Only
หรือหากตองการเจาะจง cell ก็สามารถกําหนดไดโดยใชวงเล็บปกกาเชน
x{1,2}
ans =
5
สําหรับการสราง cell array ตามแบบที่เคยสรางใน matrix แบบเดิมก็ยังคงสามารถกระทําได โดย
ใชเครื่องหมายปกกาแทนวงเล็บใหญสวนการแบง column ยังคงใช ; เหมือนเดิม เชน
y={[1 3; 5 6], [2 3; 5 7]; ['TOM';'TON'],[2+i 5+4i]}
y =
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
ในการสราง cell array ที่วางเปลาสามารถทําไดโดยใชคําสั่ง cell เชน
Z=cell(2,2)
z =
[] []
[] []
การรวม เปลี่ยนรูปและกําหนดคา Cell Array
Basic Operation 41
การรวมหรือเปลี่ยนรูป cell array ก็สามารถกระทําไดเหมือนการรวม matrix ปกติที่เราทําผานมา
เชนจากตัวแปรที่กําหนดในตัวอยางที่ผานมาคือ
x
x =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
y
y =
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
หากเราตองการรวมหรือเปลี่ยนรูปก็สามารถทําไดดังนี้
a=[x y]
a =
[2x2 double] [ 5] [2x2 double] [2x2 double]
[1x10 double] 'Text Only' [2x3 char ] [1x2 double]
b=[x;y]
b =
[2x2 double] [ 5]
[1x10 double] 'Text Only'
[2x2 double] [2x2 double]
[2x3 char ] [1x2 double]
หากตองการตัด matrix บางสวนก็สามารถใช colon operator ไดเชน
c=b(2:3,1)
c =
[1x10 double]
[2x2 double]
และหากตองการเปลี่ยนรูปก็สามารถใช คําสั่ง reshape ได เชน
c=reshape(b,2,4)
c =
[2x2 double] [2x2 double] [ 5] [2x2 double]
[1x10 double] [2x3 char ] 'Text Only' [1x2 double]
สําหรับการกําหนดคา หรือเขาเปลี่ยนแปลงคาใน cell array เราก็สามารถกระทําได โดย
- ถา cell นั้นเปนตัวแปรตัวเดียวหรือตองการทราบคาทั้งหมดใน cell นั้นก็สามารถกําหนดคา
โดยใชเครื่องหมายปกกาบอกตําแหนงได
- ถา cell นั้นเปน matrix ซอนอยูใหใชเครื่องหมายปกกากําหนดตําแหนง cell แลวตอดวย
วงเล็บกําหนดตําแหนงใน matrix นั้นอีกครั้งหนึ่ง
- ถาหากวาตองการทราบหรือกําหนดคาเปนชวงสามารถทําไดโดยใชคําสั่ง deal
Basic Operation 42
เชนจากตัวอยางขางบนถา
c
c =
[2x2 double] [2x2 double] [ 5] [2x2 double]
[1x10 double] [2x3 char ] 'Text Only' [1x2 double]
c{1,4}
ans =
2 3
5 7
c{1,4}(2,1)
ans =
5
[p q] = deal(c{1,2:3})
p =
1 3
5 6
q =
5
Cell Array และ Character String
สําหรับ character string เดิมนั้นหากจะนํามารวมอยูใน matrix แลวขอที่ควรระวังก็คือ ทุกแถว
จะตองมีจํานวน column เทากันซึ่งในทางปฏิบัติที่เกี่ยวของกับตัวหนังสือแลวการทําเชนนั้นคอนขางที่จะ
ยุงยาก แตในกรณีของ MATLAB 5.x การใช cell arrays จะชวยใหเราสามารถบรรจุ character string ที่มีความ
ยาวตางกันลงไปอยูใน column เดียวกันของ cell ได ตัวอยางเชน
x={'Tom';'Pookie';'Tata';'Nut';'Christina';'Mai'}
x =
'Tom'
'Pookie'
'Tata'
'Nut'
'Christina'
'Mai'
class(x)
ans =
cell
size(x)
ans =
6 1
ซึ่งจะเห็นวาตัวแปร x เปน cell array ที่มี 6 row x 1 column และในแตละ row ไมจําเปนตองมีความ
ยาวเทากัน ซึ่งการปรับปรุงเชนนี้จะทําใหมีความสะดวกในการกรอกขอมูลมากขึ้นกว่าเดิมมาก
edit @ 2007/05/09 17:26:36
love