Giáo trình Matlab
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 ]
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 ... 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