Giáo trình Matlab

Nhập ma trận đơn giản

Ma trận có thể nhập cho MATLAB bằng nhiều cách:

- Nhập danh sách rõ ràng các phần tử.

- Phát sinh bằng các lệnh và hàm gắn liền.

- Tạo ra từ siêu tệp (M-file).

- Nạp từ các tệp dữ liệu bên ngoài.

Ngôn ngữ MATLAB không chứa các lệnh khai báo kích thước hoặc khai báo

kiểu. Việc lưu trữ là tự động.

Cách dễ nhất của việc nhập ma trận là nhập danh sách rõ ràng các phần tử.

Danh sách các phần tử cách nhau ký tự trống hoặc dấu phẩy, đặt trong cặp ngoặc

vuông, [ và ], và dùng dấu chấm phẩy( ; ) để biểu hiện kết thúc dòng. Ví dụ, nhập

lệnh

A = [ 1 2 3; 4 5 6; 7 8 9 ]

kết quả xuất là

A =

1 2 3

4 5 6

7 8 9

Ma trận A được lưu để sử dụng về sau .

pdf 102 trang kimcuc 8600
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Matlab", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Giáo trình Matlab

Giáo trình Matlab
Giới thiệu 1 
Phan Thanh Tao - 2004 
GIỚI THIỆU 
 Matlab là một phần mềm toán học của hãng Mathworks để tính toán trên các 
số và có tính trực quan rất cao. 
 Matlab đã qua nhiều phiên bản, giáo trình này giới thiệu phiên bản 7.0 
(release 14). 
 Matlab là viết tắt của Matrix Laboratory. Matlab làm việc chủ yếu với các ma 
trận. Ma trận cỡ mxn là bảng số chữ nhật gồm mxn số được sắp xếp thành m hàng 
và n cột. Trường hợp m=1 hoặc n=1 thì ma trận trở thành vectơ dòng hoặc cột; 
trường hợp m=n=1 thì ma trận trở thành một đại lượng vô hướng. Nói chung, 
Matlab có thể làm việc với nhiều kiểu dữ liệu khác nhau. Với xâu chữ (chuỗi ký 
tự) Matlab cũng xem là một dãy các ký tự hay là dãy mã số của các ký tự. 
 Matlab dùng để giải quyết các bài toán về giải tích số, xử lý tín hiệu số, xử lý 
đồ họa,  mà không phải lập trình cổ điển. 
 Hiện nay, Matlab có đến hàng ngàn lệnh và hàm tiện ích. Ngoài các hàm cài 
sẵn trong chính ngôn ngữ, Matlab còn có các lệnh và hàm ứng dụng chuyên biệt 
trong các Toolbox, để mở rộng môi trường Matlab nhằm giải quyết các bài toán 
thuộc các phạm trù riêng. Các Toolbox khá quan trọng và tiện ích cho người dùng 
như toán sơ cấp, xử lý tín hiệu số, xử lý ảnh, xử lý âm thanh, ma trận thưa, logic 
mờ, 
 Người dùng cũng có thể tạo nên các hàm phục vụ cho chuyên môn của mình, 
lưu vào tệp M-file để dùng về sau. 
 Cần tính toán bằng công thức thì có thể dùng Toolbox SYMBOLIC. Để có 
được f=’cos(x)’ bằng cách lấy đạo hàm của g=’sin(x)’ thì dùng lệnh 
f=diff(‘sin(x)’). Ngược lại để có g là tích phân bất định của f thì dùng lệnh 
g=int(f). 
 Matlab còn có giao diện đồ họa khá đẹp mắt và dể sử dụng. Người dùng có 
thể tính toán và tạo nên các hình ảnh đồ họa 2, 3 chiều cho trình ứng dụng của 
mình. Với các hình ảnh, nếu không chỉ định vè canh trục, phối màu thì Matlab 
thực hiện tự động một cách khá phù hợp. 
 Vì tính mạnh mẽ để trợ giúp giải nhanh các bài toán kỹ thuật, chúng tôi cố 
gắng biên soạn tài liệu này để phục vụ một ít kiến thức cơ bản cho bạn đọc. Tuy 
nhiên, trên cơ sở đó bạn đọc có thể tự khai thác thêm các thành phần dùng riêng 
cho minh trong các Toolbox và Simulink. 
 Lần đầu xuất bản nên không thể tránh khỏi thiếu sót. Rất mong ý kiến đóng 
góp quý báu của bạn đọc. 
 Đà Nẵng, ngày 20/02/2004 
 Tác giả 
 Phan Thanh Tao
Giới thiệu 2 
Phan Thanh Tao - 2004 
Hướng dẫn cài đặt MATLAB 7.0 
 Bạn hãy đưa đĩa CD vào ổ đĩa, chương trình autorun sẽ chạy và trên màn hình 
xuất hiện 
Giới thiệu 3 
Phan Thanh Tao - 2004 
 Ấn nút Next để tiếp tục. 
 Xuất hiện màn hình yêu cầu nhập thông tin cá nhân và mật khẩu bản quyền. 
Giới thiệu 4 
Phan Thanh Tao - 2004 
 Bạn gọi chương trình My Computer để mở đĩa CD và chạy chương trình 
\crack\keygen.exe để phát sinh mã mật khẩu. 
Ấn Ctrl+C để chép mật khẩu sang Clipboard. Rồi đóng cửa số này lại. 
Giới thiệu 5 
Phan Thanh Tao - 2004 
 Quay lại cửa sổ cài đặt. 
 Vào ô (PLP) ấn Ctrl+V để dán mã mật khẩu vào. 
Ấn nút Next để tiếp tục. 
Giới thiệu 6 
Phan Thanh Tao - 2004 
Đánh dấu Yes để đồng ý về bản quyền, rồi ấn nút Next để tiếp tục. 
Để cài đặt đầy đủ, đánh dấu Custom và ấn nút Next để tiếp tục. 
Giới thiệu 7 
Phan Thanh Tao - 2004 
Ấn nút Next để tiếp tục. 
Nếu cài đặt lần đầu trên máy thì chưa có thư mục MATLAB7, hỏi có chấp 
nhận tạo thư mục mới. Ấn Yes để tiếp tục. 
Giới thiệu 8 
Phan Thanh Tao - 2004 
Ấn nút Next để tiếp tục. 
Ấn nút Install để bắt đầu cài đặt. 
Giới thiệu 9 
Phan Thanh Tao - 2004 
Xem hướng dẫn cài thêm sau này. Ấn nút Next để tiếp tục. 
Ấn nút Finish để hoàn thành việc cài đặt. 
Giới thiệu 10 
Phan Thanh Tao - 2004 
 Bắt đầu vào môi trường MATLAB. Bạn nên chạy các chương trình mẫu để xem 
bằng cách ấn nút Demos hoặc nhập lệnh Demo ở dòng lệnh, sau dấu nhắc >>.
Chương 1. Các khái niệm cơ bản 11 
Phan Thanh Tao - 2004 
Chương 1. CÁC KHÁI NIỆM CƠ BẢN 
MATLAB chỉ làm việc chủ yếu với các loại đối tượng là ma trận số có thể là 
số phức. Trong trường hợp đặc biệt, có thể là ma trận cấp 1 là các vô hướng, và 
các ma trận dòng hoặc ma trận cột là các vectơ. 
Hãy bắt đầu với cách nhập ma trận cho MATLAB. 
1.1. Nhập ma trận đơn giản 
Ma trận có thể nhập cho MATLAB bằng nhiều cách: 
 - Nhập danh sách rõ ràng các phần tử. 
 - Phát sinh bằng các lệnh và hàm gắn liền. 
 - Tạo ra từ siêu tệp (M-file). 
 - Nạp từ các tệp dữ liệu bên ngoài. 
Ngôn ngữ MATLAB không chứa các lệnh khai báo kích thước hoặc khai báo 
kiểu. Việc lưu trữ là tự động. 
Cách dễ nhất của việc nhập ma trận là nhập danh sách rõ ràng các phần tử. 
Danh sách các phần tử cách nhau ký tự trống hoặc dấu phẩy, đặt trong cặp ngoặc 
vuông, [ và ], và dùng dấu chấm phẩy( ; ) để biểu hiện kết thúc dòng. Ví dụ, nhập 
lệnh 
 A = [ 1 2 3; 4 5 6; 7 8 9 ] 
kết quả xuất là 
 A = 
 1 2 3 
 4 5 6 
 7 8 9 
Ma trận A được lưu để sử dụng về sau . 
Ma trận lớn có thể được tách ra thành nhiều dòng, sang dòng thay cho dấu 
chấm phẩy. Mặc dù ít cần ma trận kích thước này, nhưng ma trận trên cũng có thể 
tách ra thành 3 dòng nhập như sau 
 A = [ 1 2 3 
 4 5 6 
 7 8 9 ] 
Chương 1. Các khái niệm cơ bản 12 
Phan Thanh Tao - 2004 
Các ma trận có thể nhập từ tệp với tên mở rộng là ".m" . Nếu tệp có tên là 
gena.m chứa ba dòng văn bản 
 A = [ 1 2 3 
 4 5 6 
 7 8 9 ] 
thì lệnh gena đọc tệp và phát sinh ra ma trận A. 
Lệnh load có thể đọc các ma trận phát sinh từ các phần khác trước đó của 
MATLAB hoặc các ma trận ở dạng ASCII xuất từ các chương trình khác. Sẽ biết 
thêm sau này. 
1.2. Các phần tử của ma trận 
Các phần tử của ma trận có thể là biểu thức MATLAB bất kỳ; ví dụ, lệnh 
 x = [ -1.3 sqrt(3) (1+2+3)*4/5 ] 
kết quả là 
 x = 
 -1.3000 1.7321 4.8000 
Các phần tử riêng biệt của ma trận có thể được tham chiếu với các chỉ số bên 
trong cặp ngoặc đơn, ( và ). Tiếp ví dụ trên, lệnh 
 x(5) = abs(x(1)) 
cho ra 
 x = 
 -1.3000 1.7321 4.8000 0.0000 1.3000 
Lưu ý rằng kích thước của x được tự động tăng để phù hợp với các phần tử 
mới, và các phần tử trong khoảng không xác định được đặt giá trị không. 
 Ma trận lớn có thể được xây dựng bằng cách dùng các ma trận nhỏ như các 
phần tử. Ví dụ, có thể đưa thêm một dòng khác vào ma trận A với lệnh 
 r = [ 10 11 12 ]; 
 A = [ A ; r ] 
kết quả là 
 A = 
 1 2 3 
 4 5 6 
 7 8 9 
 10 11 12 
Chương 1. Các khái niệm cơ bản 13 
Phan Thanh Tao - 2004 
Các ma trận nhỏ có thể được trích ra từ các ma trận lớn bằng cách dùng dấu hai 
chấm, : . Ví dụ, lệnh 
 A = A(1:3,:); 
lấy ba dòng đầu và tất cả các cột của ma trận A hiện thời để đưa ma trận A về giá 
trị ban đầu. Sẽ biết thêm về dấu hai chấm sau này. 
1.3. Câu lệnh và biến 
MATLAB là ngôn ngữ biểu thức. Các biểu thức được đánh vào bởi người 
dùng, được thông dịch và ước lượng bởi hệ MATLAB. Các lệnh MATLAB 
thường có dạng: 
 variable = expression 
hoặc đơn giản 
 expression 
variable: tên biến, 
expression: biểu thức. 
Các biểu thức được cấu thành từ các toán tử và các ký tự đặc biệt khác, từ các 
hàm, và từ các tên biến. Việc ước lượng các biểu thức cho ra một ma trận, sau đó 
hiển thị trên màn hình và gán vào biến để sử dụng về sau. Nếu tên biến và dấu = bị 
bỏ qua thì một biến có tên là ans, viết tắt chữ "answer" ( trả lời ), được tự động 
tạo ra. Ví dụ, đánh vào 
 1900/81 
cho ra ans = 
 23.4568 
Một câu lệnh được kết thúc bình thường với ký tự sang dòng hay phím 
. Tuy nhiên, nếu ký tự cuối cùng của câu lệnh là dấu chấm phẩy thì việc 
in ra kết quả được hủy, nhưng lệnh vẫn được thực hiện. Điều này là hữu ích trong 
các siêu tệp M-file ( biết thêm sau này) và trong trường hợp kết quả đủ lớn không 
cần quan tâm từng số. Ví dụ, lệnh 
 p = conv(r,r); 
tích chập các số trong r với chính chúng nhưng không hiển thị kết quả. 
Chương 1. Các khái niệm cơ bản 14 
Phan Thanh Tao - 2004 
Nếu biểu thức quá phức tạp để câu lệnh không thể đặt gọn trên một dòng thì có 
thể dùng dấu tĩnh lược (...) tiếp theo là ký tự sang dòng để biểu hiện câu lệnh được 
tiếp tục trên dòng tiếp theo. Ví dụ 
 s = 1 - 1/2 + 1/3 - 1/4 + 1/5 - 1/6 + 1/7 ... 
 - 1/8 + 1/9 - 1/10 + 1/11 - 1/12; 
tính tổng riêng của chuỗi điều hòa, gán tổng vào biến s, nhưng không in ra gì cả. 
Các ký tự trống quanh các dấu +, - là tùy chọn nhưng được đưa vào đây để dễ đọc. 
Các tên biến, tên hàm được định dạng bằng một chữ viết, tiếp theo là số bất 
kỳ các chữ viết và chữ số ( hoặc dấu nối ). Chỉ có 19 ký tự đầu được nhớ. 
MATLAB là ngôn ngữ nhạy cảm; nó thường phân biệt chữ hoa/chữ thường, 
bởi vậy a và A không phải là tên của cùng một biến. Tất cả các tên hàm phải là 
chữ thường; lệnh inv(A) sẽ lấy ngịch đảo của ma trận A, nhưng lệnh INV(A) tham 
chiếu đến một hàm không được định nghĩa: Tuy nhiên, lệnh casesen làm cho 
MATLAB không phân biệt chữ hoa/chữ thường. Trong chế độ này INV(a) là lấy 
ma trận đảo của nó. 
1.4. Cách lấy thông tin vùng làm việc 
Các lệnh trong các ví dụ cho đến bây giờ tạo ra các biến được lưu trong vùng 
làm việc của MATLAB. Thực hiện lệnh 
 who 
liệt kê các biến trong vùng làm việc: 
 your variables are: 
 A ans p r s x 
 leaving 291636 bytes of memory free 
ở đây trình bày 6 biến phát sinh bởi các ví dụ, kể cả biến ans. Để biết thêm chi tiết 
về kích thước của mỗi biến hiện thời, dùng lệnh whos, cũng với ví dụ, cho ra 
 Name size total Complex 
 A 3 by 3 9 No 
 ans 1 by 1 1 No 
 p 1 by 5 5 No 
 r 1 by 3 3 No 
 s 1 by 1 1 No 
 x 1 by 5 5 No 
Chương 1. Các khái niệm cơ bản 15 
Phan Thanh Tao - 2004 
 Grand total is (24*8) = 192 bytes, 
 leaving 291636 bytes of memory free. 
Mỗi phần tử của ma trận thực đòi hỏi 8 byte bộ nhớ, bởi vậy ma trận A cấp 3 
dùng 72 byte và tất cả các biến dùng tổng cọng 192 byte. Tổng số không gian bộ 
nhớ tự do còn lại phụ thuộc vào từng loại máy khác nhau. 
Biến ans cùng với một biến không liệt kê eps có ý nghĩa đặc biệt với 
MATLAB. Chúng là các biến cố định không thể xóa. 
Biến eps (epsilon) dùng để xác định những giá trị gần kỳ dị (suy biến) và hạng 
ma trận. Giá trị khởi tạo của nó là khoảng cách từ 1.0 đến số thập phân lớn nhất 
tiếp theo. Đối với kỹ thuật số học IEEE (Institute of Electrical and Electronic 
Engineers) dùng trên các máy cá nhân và các máy trạm, thì 
 eps = 2-52 
khoảng 2.22 x 10-16. eps có thể được đặt lại với giá trị khác, kể cả giá trị 0. 
1.5. Số và biểu thức số 
Các số dùng ký pháp thập phân qui ước với dấu chấm và dấu trừ đứng trước là 
tùy chọn. Có thể đưa vào cuối dạng khoa học ( lũy thừa 10 ). Sau đây là vài ví dụ 
về các số hợp pháp: 
 3 -99 0.0001 
 9.6397238 1.6040E-10 6.022252e23 
Trên các máy dùng kỹ thuật số học chấm động IEEE thì độ chính xác tương 
đối của các số là eps, khoảng 16 chữ số có nghĩa. Miền giá trị khoảng 10-308 đến 
10308. 
Các biểu thức có thể được tạo ra bằng cách dùng các phép toán số học thông 
thường và các qui tắc ưu tiên: 
+ cộng 
- trừ 
* nhân 
/ chia phải 
\ chia trái 
^ lũy thừa 
Chương 1. Các khái niệm cơ bản 16 
Phan Thanh Tao - 2004 
Các phép toán trên ma trận để cho tiện có hai ký hiệu cho phép chia. Các biểu 
thức vô hướng 1/4 và 4\1 có cùng giá trị số, chính là 0.25. Các cặp ngoặc đơn 
được dùng theo cách thông thường để xen vào việc ưu tiên của các phép toán số 
học. 
Hầu hết các hàm toán sơ cấp thông thường trên các tính toán khoa học là các 
hàm cài sẵn của MATLAB, như abs, sqrt, log, và sin, ... Có thể thêm vào các 
hàm một cách dễ dàng với các siêu tệp M-file. Phần sau có một danh sách khá đầy 
đủ các hàm. 
Một số các hàm cài sẵn đơn giản trả về các giá trị đặc biệt thường dùng. Hàm 
pi trả về số π, chương trình tính trước, đó là 4*atan(1). Một cách gọi khác để phát 
sinh số π là 
 imag(log(-1)) 
Hàm inf, viết tắt chữ infinity ( vô định ), được thấy trên rất ít hệ tính toán hoặc 
ngôn ngữ lập trình. Trên một số máy, nó được tạo ra bởi kỹ thuật số học IEEE cài 
trong bộ đồng xử lý toán học (coprocessor). Trên các máy khác, phần mềm chấm 
động được đưa vào để mô phỏng đồng xử lý toán học. Một cách để phát sinh giá 
trị trả về bởi hàm inf là 
 s = 1/0 
kết quả là s = 
 ∞ 
 Warning: Divide by zero. 
Trên các máy với kỹ thuật số học IEEE, việc chia cho số không không dẫn đến 
điều kiện lỗi hoặc kết thúc hoạt động. Cho ra một thông báo khuyến cáo và một 
giá trị đặc biệt có thể xử lý trong việc tính toán sau đó. 
Biến NaN là một số IEEE quan hệ với hàm inf, nhưng có các đặc tính khác. 
Nó là viết tắt chữ "Not a Number" ( không phải là một số ) và được cho ra bởi các 
việc tính toán như inf/inf hoặc 0/0. 
1.6. Số phức và ma trận phức 
Số phức được dùng trong tất cả các phép toán và các hàm của MATLAB. Số 
phức được nhập bằng các hàm đặc biệt là i và j. Vài người có thể dùng 
 z = 3 + 4*i 
trong khi người khác lại thích dùng 
Chương 1. Các khái niệm cơ bản 17 
Phan Thanh Tao - 2004 
 z = 3 + 4*j 
Một ví dụ khác là 
 w = r*exp(i*theta) 
Có ít nhất hai cách thuận tiện để nhập ma trận phức. Chúng được minh họa bởi 
các lệnh 
 A = [ 1 2; 3 4 ] + i*[ 5 6; 7 8 ] 
và 
 A = [ 1+5*i 2+6*i; 3+7*i 4+8*i ] 
cho ra cùng kết quả. Khi các số phức được nhập như các phần tử của ma trận bên 
trong cặp ngoặc vuông, thì điều quan trọng là tránh mọi khoảng trống, vì một biểu 
thức như 1 + 5*i với ký tự trống quanh dấu + biểu hiện hai số riêng biệt. 
( Giống như thế cho số thực; một ký tự trống trước phần mũ trong 1.23 e-4 gây 
ra lỗi ). 
Tên hàm cài sẵn có thể dùng như tên biến; trong trường hợp này hàm gốc trở 
nên không dùng được bên trong vùng làm việc hiện thời (hoặc hàm M-file cục bộ ) 
cho đến khi biến bị xóa. Nếu dùng i và j là tên các biến, và đè lên các giá trị này, 
thì một đơn vị phức mới được phát sinh và sử dụng theo cách thông thường: 
 ii = sqrt(-1) 
 z = 3 + 4*ii 
1.7. Dạng thức xuất 
Kết quả của mọi lệnh gán của MATLAB được hiển thị trên màn hình, gán cho 
biến chỉ định hoặc cho ans nếu không cho biến. Dạng thức hiển thị số có thể điều 
khiển bằng lệnh format. Lệnh format chỉ ảnh hưởng đến cách hiển thị ma trận 
chứ không ảnh hưởng đến việc tính toán và lưu chúng ( MATLAB thực hiện tất cả 
các tính toán theo độ chính xác kép "double" ). 
Nếu tất cả các phần tử của ma trận đúng là số nguyên thì ma trận được hiển thị 
theo dạng không có phần thập phân. Ví dụ, 
 x = [ -1 0 1 ] 
kết quả luôn là x = 
 -1 0 1 
Chương 1. Các khái niệm cơ bản 18 
Phan Thanh Tao - 2004 
Nếu ít nhất một phần tử của ma trận không là số nguyên thì có một số cách có 
thể hiển thị. Dạng ngầm định, gọi là dạng short, trình bày khoảng 5 chữ số có 
nghĩa. Các dạng khác trình bày nhiều chữ số hơn hoặc dùng dạng khoa học. Ví dụ, 
giả sử 
 x = [ 4/3 1.2345e-6 ] 
Các dạng thức, và kết quả xuất cho vectơ này, là: 
 Dạng thức short 
 1.3333 0.0000 
 Dạng thức short e 
 1.3333E+000 1.2345E-006 
 Dạng thức long 
 1.333333333333338 0.000001234500000 
 Dạng thức long e 
 1.333333333333338E+000 1.234500000000003E-006 
 Dạng thức hex 
 3FF555555555555 3EB4B6231AFBD271 
 Dạng thức + 
 + + 
Đối với các dạng long thì chữ số cuối cùng có thể xuất hiện không đúng, 
nhưng việc xuất ra đúng là một biểu hiện độ chính xác của số nhị phân lưu trong 
máy. 
Với các dạng short và long, nếu phần tử lớn nhất của ma trận lớn hơn 1000 
hoặc nhỏ hơn 0.001 thì một thừa số chung được áp dụng cho toàn bộ ma trận khi 
hiển thị nó. Ví dụ, lệnh 
 x = 1.e20*x 
nhân x cho 1020 và kết quả hiển thị 
 x  ... của mỗi cột. 
 [m,n] = size(x); 
 if m== 1 
 m = n; % xử lý vectơ dòng. 
 end 
 y = sum(x)/m; 
Tệp này định nghĩa một hàm mới tên là mean. Hàm mới mean được dùng như 
mọi hàm MATLAB khác. Ví dụ, nếu Z là một vectơ gồm các số từ 1 đến 99, 
 Z = 1:99; 
giá trị trung bình tìm thấy bằng cách đánh vào 
 mean(Z) 
kết quả là ans = 
 50 
Hãy xét vài chi tiết của mean.m: 
• Dòng thứ nhất khai báo tên hàm, các đối số nhập, và các đối số xuất. 
Không có dòng này thì tệp sẽ là tệp nguyên bản thay vì tệp hàm. 
• Dấu % biểu hiện phần còn lại của dòng là lời chú thích và được bỏ qua. 
Chương 11. Siêu tệp M-File 92 
Phan Thanh Tao - 2004 
• Vài dòng đầu cung cấp tư liệu M-file và được hiển thị nếu đánh vào 
help mean. 
• Các biến m, n, và y là cục bộ của mean và sẽ không còn trong vùng làm 
việc khi mean thực hiện xong. (Hoặc nếu trước đó đã có 
thì không bị thay đổi.) 
• Không cần phải đặt các số nguyên từ 1 đến 99 vào biến x. Thực ra, dùng 
mean với biến tên là Z. Vectơ Z chứa các số nguyên từ 1 đến 99 được 
truyền hoặc sao chép vào mean ở đây nó trở thành một biến cục bộ tên 
là x. 
Một phiên bản có một ít phức tạp hơn của mean gọi là stat tính độ lệch chuẩn: 
 function [mean, stdev] = stat(x) 
 [m,n] = size(x); 
 if m==1 
 m = n; % xử lý vectơ dòng 
 end 
 mean = sum(x)/m; 
 stdev = sqrt(sum(x.^2)/ m - mean.^); 
stat minh họa cho khả năng trả về nhiều đối số xuất. 
Một hàm tính hạng ma trận dùng nhiều đối số nhập: 
 function r = rank(y,tol) 
 % hạng của một ma trận 
 s = svd(x); 
 if (nargin == 1) 
 tol = max(size(x)) * s(1) * eps; 
 end 
 r = sum(s>tol); 
Chương 11. Siêu tệp M-File 93 
Phan Thanh Tao - 2004 
Ví dụ này minh họa cách dùng biến thường xuyên nargin để tìm số đối số 
nhập. Biến nargout, mặc dù không được dùng ở đây nhưng chứa số đối số xuất. 
Vài gợi ý trợ giúp : 
Khi một tệp M-hàm được gọi lần đầu thì được biên dịch và đưa vào bộ nhớ. 
Sau đó có thể sử dụng cho các lần gọi sau mà không biên dịch lại. Nó còn trong bộ 
nhớ trừ khi không đủ bộ nhớ, trong trường hợp này có thể bị xóa tự động. 
Lệnh what trình bày danh sách thư mục các tệp M-file có thể sử dụng trong 
thư mục hiện hành, lệnh type liệt các tệp M-file, và ! dùng để gọi trình soạn thảo, 
cho phép tạo ra hoặc sửa đổi tệp M-file. 
Nói chung, nếu nhập tên nào đó cho MATLAB, ví dụ đánh vào whoopie, thì 
MATLAB thông dịch qua các bước sau: 
 [1] Tìm xem whoopie có phải là một biến. 
 [2] Kiểm tra whoopie có phải là hàm cài sẵn. 
 [3] Tìm trong thư mục hiện hành có không một tệp có tên whopie.m. 
 [4] Tìm trong các thư mục chỉ định bởi biến môi trường 
MATLABPATH có không một tệp có tên whoopie.m. ( Xem phần giới thiệu 
cách cài đặt để học cách đặt biến môi trường MATLABPATH ) 
Do đó đầu tiên MATLAB thử dùng whoopie như một biến, nếu có, trước khi 
dùng whoopie như một hàm. 
11.3. Các lệnh Echo, input, pause, keyboard 
Thông thường, khi thực hiện M-file, các lệnh trong tệp không được hiển thị 
trên màn hình. Lệnh echo làm cho tệp M-file được thấy khi thực hiện, điều này 
hữu ích cho việc gỡ rối hoặc làm mẫu. Xem phần tham khảo để biết thêm chi tiết. 
Hàm input nhận dữ liệu nhập từ người dùng. Lệnh 
 n = input('Có bao nhiêu quả táo') 
cho người dùng câu văn bản nhắc, đợi người dùng nhập số hoặc biểu thức từ bàn 
phím. Một cách dùng input là xây dựng M-file điều khiển menu. Công cụ demo 
là một ví dụ cho trường hợp này. 
Chương 11. Siêu tệp M-File 94 
Phan Thanh Tao - 2004 
Tương tự input, nhưng mạnh hơn, là hàm keyboard. Hàm này gọi bàn phím 
như một nguyên bản. Đặt trong các tệp M-file, thì đặc tính này giúp ích cho việc 
gỡ rối, hoặc cho việc thay đổi các biến trong thời gian thi hành. 
Lệnh pause tạo ra thủ tục dừng và chờ người dùng ấn phím bất kỳ trước khi 
tiếp tục. Lệnh pause(n) tạm dừng n giây trước khi tiếp tục. 
Cũng có thể định nghĩa các biến toàn cục, mặc dù chúng tôi không khuyên như 
thế. Xem phần tham khảo nếu có ý muốn. 
11.4. Xâu chữ và macro xâu chữ 
Các xâu chữ văn bản được nhập vào MATLAB trong cặp nháy đơn. Ví dụ, 
 s = 'Hello' 
kết quả là 
 s = 
 Hello 
Xâu chữ được lưu trong một vectơ, mỗi phần tử một ký tự. Trong trường hợp 
này, lệnh 
 size(s) 
 ans = 
1 5 
biểu hiện rằng s có 5 phần tử. Các ký tự được lưu giá trị ASCII của chúng và hàm 
abs trình bày giá trị này, 
 abs(s) 
 ans = 
 72 101 108 108 111 
Hàm setstr đặt các vectơ để hiển thị như văn bản thay vì trình bày các giá trị 
ASCII. Cũng hữu ích là lệnh disp đơn giản hiển thị văn bản có trong biến, và các 
hàm isstr và strcmp dò tìm và so sánh các xâu chữ tương ứng. 
Các biến văn bản có thể nối lại thành xâu chữ lớn bằng cách dùng cặp ngoặc 
vuông: 
Chương 11. Siêu tệp M-File 95 
Phan Thanh Tao - 2004 
 s = [s, 'World'] 
 s = 
 Hello World 
Các giá trị số được chuyển sang các xâu chữ bằng các hàm sprintf, num2str, 
và int2str. Các giá trị số sau khi chuyển sang xâu chữ thường được nối vào xâu 
chữ lớn để đặt tiêu đề cho hình vẽ có giá trị số: 
 f = 70; c =(f-32)/1.8; 
 title(['Nhiệt độ trong phòng là ',num2str(c),' độ C']) 
eval là hàm làm việc với các biến xâu chữ để cài đặt một công cụ macro văn 
bản khá mạnh mẽ. eval(t) làm cho văn bản chứa trong t được ước lượng. Nếu 
STRING là văn bản nguồn cho nhiều biểu thức hoặc câu lệnh của MATLAB thì 
 t ='STRING'; 
mã hóa văn bản trong t. Đánh vào t in văn bản và eval(t) làm cho văn bản được 
thông dịch, hoặc là một lệnh hoặc là một nhân tử trong biểu thức. Ví dụ 
 t = '1/(i+j-1)'; 
 for i = 1:n 
 for j = 1:n 
 a(i,j) = eval(t); 
 end 
 end 
phát sinh ma trân Hilbert cấp n. Một ví dụ khác trình bày văn bản đánh chỉ số, 
 S = ['x = 3 ' 
 'y = 4 ' 
 'z = sqrt(x*x+y*y) ']; 
 for k = 1:3 
 eval(S(k,:)); 
Chương 11. Siêu tệp M-File 96 
Phan Thanh Tao - 2004 
 end 
Các xâu chữ tạo thành các dòng của ma trận A cần phải có cùng độ dài. Sau 
đây là ví dụ cuối cùng trình bày cách eval có thể dùng lệnh load để nạp 10 tệp dữ 
liệu được đánh số liên tục: 
 fname = 'mydata'; 
 for i = 1:10 
 eval(['load ',fname,int2str(i)] 
 end 
Công cụ macro văn bản được ứng dụng hữu hiệu trong việc truyền tên hàm cho 
các tệp M-hàm. Để lấy ví dụ, xem tệp funm.m trong MATLAB TOOLBOX. 
11.5. Chương trình bên ngoài 
Có thể, và thương hữu ích, để tạo ra các chương trình độc lập bên ngoài riêng 
của mình hoạt động như các hàm MATLAB mới. Điều này có thể thực hiện bằng 
cách viết các tệp M-file để 
 [1] Lưu các biến trên đĩa, 
[2] Chạy các chương trình bên ngoài (đọc các tệp dữ liệu, xử lý chúng, 
và ghi kết quả trở lại đĩa), và 
 [3] Nạp các tệp đã xử lý ngược về vùng làm việc. 
Ví dụ, sau đây là một M-hàm giả định để tìm lời giải phương trình Garfield 
dùng chương trình GAREQN bên ngoài 
 function y = garfield(a,b,q,r) 
 save gardata a b q r 
 !gareqn 
 load gardata 
Nó yêu cầu đã viết một chương trình tên là GAREQN (bằng Fortran hoặc 
ngôn ngữ nào đó) để đọc tệp tên là gardata.mat, xử lý nó, và đặt kết quả trở ra tệp 
đó. Các chương trình con tiện ích mô tả trong phần sau có thể dùng để đọc và ghi 
các tệp MAT. 
Chương 11. Siêu tệp M-File 97 
Phan Thanh Tao - 2004 
Công cụ này là một trong các lựa chọn để "liên kết chương trình riêng" vào 
MATLAB. Một lựa chọn khác là dùng công cụ tệp MEX - một kỹ thuật nhờ đó có 
thể liên kết vật lý chương trình có đối tượng mới vào MATLAB. Xem phần đặc tả 
máy để thấy công cụ này có thể dùng cho máy mình không. 
11.6. Vấn đề về tốc độ và bộ nhớ 
Các thao tác về vectơ và ma trận gắn liền của MATLAB thực hiện nhanh hơn 
các thao tác được dịch của nó. Điều này có nghĩa là để nhận tốc độ nhanh nhất 
ngoài MATLAB phải cố gắng vectơ hóa thuật toán trong tệp M-file. Bất kỳ đâu 
có thể được, các vòng lặp for và while nên chuyển sang các phép toán về vectơ 
hoặc ma trận. Ví dụ, một cách lấy sin của 1000 số từ 1 đến 10: 
 i = 0; 
 for t = 0:.01:10 
 i = i+1; 
 y(i) = sin(t); 
 end 
Một phiên bản vectơ hóa của cùng chương trình này là: 
 t = 0:.01:10; 
 y = sin(t); 
Trên một máy, ví dụ thứ nhất chạy hết 15 giây, trong khi ví dụ thứ hai chỉ tốn 
0.6 giây, nhanh gấp 25 lần. Không phải luôn luôn tối ưu được các chương trình 
phức tạp, nhưng khi tốc độ là quan trọng thì nên tìm cách vectơ hóa thuật toán. 
Nếu không thể vectơ hóa mảnh chương trình, thì đây là một cách để làm cho 
vòng lặp for chạy nhanh hơn: định vị trước mọi vectơ có kết quả xuất được lưu. Ví 
dụ, việc đưa vào câu lệnh thứ nhất ở đây , dùng hàm zeros, làm cho vòng lặp for 
thực hiện nhanh đáng kể: 
 y = zeros(1,100); 
 for i = 1:100 
 y(i) = det(x^i); 
 end 
Chương 11. Siêu tệp M-File 98 
Phan Thanh Tao - 2004 
Lý do là, nếu không định vị trước, thì MATLAB phải tăng kích thước của 
vectơ y lên 1 qua mỗi lần lặp. Nếu vectơ được định vị trước thì bước này được 
khử đi và việc thực hiện được nhanh hơn. 
Đối với công việc thực hiện với các ma trận lớn trên các máy có bộ nhớ hạn 
chế, thì ý đồ định vị trước có một tiện lợi thứ hai: là sử dụng bộ nhớ hiệu lực hơn 
và giúp kiểm tra có chạy tràn bộ nhớ không. Nó trợ giúp vì bộ nhớ có khuynh 
hướng bị phân mảnh, bởi vậy có thể có nhiều vùng nhớ tự do, nhưng không đủ 
không gian liên tục để giữ một biến lớn. Việc định vị trước giúp thu gọn sự phân 
mảnh. 
Trong vấn đề về bộ nhớ, nếu lệnh who hiển thị tổng số bộ nhớ tự do còn lại, thì 
có vài điều về số này có lẽ nên cẩn thận. Nếu xóa một biến trong vùng làm việc, 
thì con số hiển thị bởi lệnh who thường không tăng lên, trừ khi nó là biến "cao 
nhất" trong vùng làm việc. 
Con số này biểu hiện thực sự tổng bộ nhớ tự do liên tục và chưa dùng. Việc 
xóa biến cao nhất làm cho bộ nhớ lớn hơn, nhưng xóa biến dưới biến cao nhất 
không có hiệu lực. Về mặt ứng dụng, toàn bộ ý nghĩa này là có thể có nhiều vùng 
nhớ tự do hơn lệnh who biểu hiện. 
Các máy tính với bộ nhớ ảo không hiển thị tổng số vùng nhớ tự do còn lại vì 
không có các giới hạn phải chấp nhận của MATLAB hay của phần cứng. 
Có một cách tối ưu mà MATLAB thực hiện giúp để biết khi viết M-file. Các 
đối số gọi hàm M-file không sao chép sang vùng làm việc cục bộ của hàm trừ khi 
xen vào nội dung của đối số vào bên trong M-hàm. Điều này có nghĩa là không có 
không tốn bộ nhớ cho việc truyền các biến lớn vào các hàm M-file. 
*******************
Chương 12. Về tệp trên đĩa 99 
Phan Thanh Tao - 2004 
Chương 12. VỀ TỆP TRÊN ĐĨA 
load và save là các lệnh của MATLAB để lưu vào hoặc lấy ra từ đĩa nội dung 
của vùng làm việc. Các lệnh khác quan hệ đến tệp giúp cho việc quản lý đĩa, cho 
phép các chương trình bên ngoài chạy, và cung cấp khả năng nhập/xuất dữ liệu. 
12.1. Thao tác về tệp 
Các lệnh dir, type, delete, và chdir cài đặt tập hợp các lệnh về hệ điều hành 
chung để thao tác về tệp. Sau đây là bảng biểu hiện các lệnh này sắp xếp với các 
hệ điều hành khác, có lẽ ngưới dùng làm quen với một trong chúng: 
MATLAB MS-DOS UNIX VAX/VMS
dir dir is dir 
type type cat type 
delete del rm delete 
chdir chdir cd set default 
Với hầu hết các lệnh này, đường dẫn, ký tự đại diện, và tên ổ đĩa dùng theo 
cách thông thường. 
Lệnh type khác với lệnh type thông thường ở một điểm đặc biệt; nếu không 
cho kiểu tệp thì ngầm định là .m. Điều này thuận tiện cho việc hay dùng nhất của 
lệnh type là để liệt kê các tệp M-file trên màn hình. 
Lệnh diary tạo ra nhật ký cho công việc của MATLAB trên đĩa (tuy nhiên 
không lưu các hình ảnh ). Kết quả là tệp văn bản ASCII phù hợp với việc đưa vào 
các bản báo cáo và các tài liệu khác dùng trình xử lý từ bất kỳ. 
Để biết thêm chi tiết về các lệnh này, xem phần tham khảo hoặc dùng công cụ 
trợ giúp nóng help. 
12.2. Chạy chương trình bên ngoài 
Ký tự chấm than, ! , là ký tự thoát và biểu hiện phần còn lại của dòng nhập là 
lệnh của hệ điều hành. Điều này hoàn toàn có ích cho việc gọi các trình tiện ích 
hoặc chạy các chương trình khác mà không ra khỏi MATLAB. Ví dụ 
 !f77 simpleprog 
gọi trình biên dịch Fortran và 
Chương 12. Về tệp trên đĩa 100 
Phan Thanh Tao - 2004 
 !edt darwin.m 
gọi trình soạn thảo edt cho một tệp có tên là darwin.m. Sau khi chương trình này 
chạy xong, quyền điều khiển trả về cho MATLAB. 
Cách xử lý đúng đắn về ! tùy thuộc vào từng loại máy cụ thể. Xem phần đặc tả 
máy để biết thêm thông tin. 
12.3. Nhập và xuất dữ liệu 
Dữ liệu từ các chương trình khác và bên ngoài có thể đưa vào MATLAB bằng 
nhiều cách. Tương tự, dữ liệu MATLAB có thể xuất ra bên ngoài. Cũng có thể có 
các chương trình thao tác dữ liệu trực tiếp trong các tệp MAT, dạng tệp 
MATLAB sử dụng. 
Cách tốt nhất phụ thuộc vào số lượng dữ liệu đang có, dữ liệu có ở dạng máy 
có thể đọc được không, dạng gì, v.v... Sau đây là một số lựa chọn; hãy chọn một 
để tương thích. 
 [1] Nhập như một danh sách rõ ràng các phần tử. Nếu ít dữ liệu, nhỏ 
hơn 10x15 phần tử, thì dễ dàng nhập trực tiếp dữ liệu vào bằng cặp ngoặc vuông, [ 
và ]. Phưong pháp này bất tiện đối với dữ liệu lớn vì không thể sửa dữ liệu nhập 
nếu bị lỗi. 
 [2] Tạo trong một M-file. Dùng trình soạn thảo văn bản để tạo ra một 
nguyên bản M-file chứa danh sách rõ ràng các phần tử. Cách này là tốt khi dữ liệu 
chưa ở dạng máy có thể đọc được và phải đánh chúng vào. Cơ bản là giống cách 1, 
có thuận tiện là cho phép dùng trình soạn thảo để thay đổi dữ liệu hoặc sửa lỗi. 
Sau đó có thể chạy lại M-file để nhập lại dữ liệu. 
 [3] Nạp từ một tệp ASCII phẳng. Nếu dữ liệu được lưu ở dạng ASCII, 
với các dòng có độ dài cố định kết thúc bằng ký tự sang dòng,và các khoảng trống 
ngăn cách các số, thì tệp như thế được gọi là tệp phẳng.(Tệp ASCII phẳng có thể 
được soạn bằng trình soạn thảo văn bản thông thường.) Các tệp phẳng có thể được 
đọc trực tiếp vào MATLAB bằng lệnh load. Kết quả được đặt vào một biến có tên 
là tên tệp. 
 [4] Viết một chương trình bằng Fortran hoặc C để dịch dữ liệu sang 
dạng MAT-file. 
Vài cách đưa dữ liệu ra bên ngoài là: 
 [1] Với các ma trận nhỏ, dùng lệnh diary để tạo ra một tệp nhật ký, rồi 
sau đó liệt kê các biến trong tệp này. Có thể dùng soạn thảo văn bản để thao tác 
trên tệp nhật ký sau này. Việc xuất dữ liệu của lệnh diary dùng trong suốt thời 
Chương 12. Về tệp trên đĩa 101 
Phan Thanh Tao - 2004 
gian làm việc của MATLAB, nó có ích cho việc đưa dữ liệu vào tài liệu và các 
bản báo cáo. 
 [2] Lưu vào một biến bằng lệnh save, với lựa chọn /ascii. Ví dụ, 
 A rand(4,3); 
 save temp.dat A/ascii 
tạo ra một tệp ASCII tên là temp.dat chứa nội dung: 
 0.2113 0.8096 0.4832 
 0.0824 0.8474 0.6135 
 0.7599 0.4524 0.2749 
 0.0087 0.8075 0.8807 
 [3] Viết một chương trình bằng Fortran hoặc C để dịch tệp MAT sang 
dạng đặc biệt riêng của mình. 
Có thể muốn có các chương trình bên ngoài đọc hoặc ghi dữ liệu trực tiếp vào 
tệp MAT đã dùng các lệnh load và save. Dạng thức của tệp MAT được trình bày 
dưới lệnh load trong phần tham khảo. 
Nếu chương trình viết bằng Fortran hoặc C, thì có vài phục vụ cung cấp trong 
MATLAB TOOLBOX giúp giao diện chương trình với các tệp MAT: 
 savemat.for Ghi tệp MAT. 
 loadmat.for Đọc tệp MAT. 
 testls1.for Ví dụ sử dụng savemat và loadmat. 
 testls2.for Ví dụ khác sử dụng savemat và loadmat. 
 loadmat.c Nạp ma trận từ tệp MAT. 
 savemat.c Lưu ma trận vào tệp MAT. 
 testls.c Ví dụ dùng loadmat.c và savemat.c. 
Việc cài đặt các phiên bản Fortran của các phục vụ này có thể khác nhau theo 
từng loại máy. 
*******************

File đính kèm:

  • pdfgiao_trinh_matlab.pdf