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 .
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ớ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:
giao_trinh_matlab.pdf

