Bắt đầu với MATLAB

MATLAB là một ngôn ngữlập trình bậc cao với môi trường tương tác cho phép tính toán, xửlý đồthị/hình ảnh, mô phỏng đơn giản với nhiều công cụhỗtrợsẵn có từthưviện Toolsvà Functions. Trong nhiều trường hợp, do cho phép làm việc bằng các phép toán xây dựng cho mảng và ma trận nên MATLAB tỏra ưu thếhơn các ngôn ngữtruyền thống khác nhưC/C++ hay Java™. Bên cạnh đó, ngôn ngữvà các cú pháp lệnh của MATLAB được nhiều người đánh giá là dễhiểu và thân thiện với người dùng. Hiện nay MATLAB là một trong những ngôn ngữlập trình được ứng dụng rộng rãi nhất trong nhiều lĩnh vực như: signal processing and communications, image and video processing, control systems, test and measurement, computational finance, and computational biology.

pdf22 trang | Chia sẻ: lylyngoc | Lượt xem: 1766 | Lượt tải: 2download
Bạn đang xem trước 20 trang tài liệu Bắt đầu với MATLAB, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Bắt đầu với MATLAB Soạn dịch từ sonnc@vnu.edu.vn Mục lục Giới thiệu về MATLAB ..................................................................................................................................... 1 Ngôn ngữ của công nghệ tính toán ............................................................................................................ 1 Các tính năng cơ bản .................................................................................................................................. 1 Các thành phần của cửa sổ chương trình ........................................................................................................... 2 Ma trận và Mảng ................................................................................................................................................ 4 Tạo mảng ................................................................................................................................................... 4 Các phép toán với ma trận và mảng ........................................................................................................... 4 Ghép nối ma trận ........................................................................................................................................ 6 Số phức ...................................................................................................................................................... 7 Chỉ số của mảng ................................................................................................................................................. 8 Các biến và Workspace .................................................................................................................................... 10 Chuỗi kí tự ....................................................................................................................................................... 11 Function ........................................................................................................................................................... 12 Vẽ hình 2-D và 3-D.......................................................................................................................................... 13 Vẽ hình 2-D.............................................................................................................................................. 13 Vẽ hình 3-D.............................................................................................................................................. 15 Vẽ đồ thị con ............................................................................................................................................ 16 Script ................................................................................................................................................................ 17 Ví dụ về Script ......................................................................................................................................... 17 Vòng lặp và các câu lệnh có điều kiện ..................................................................................................... 18 Địa chỉ của Script ..................................................................................................................................... 19 Help .................................................................................................................................................................. 21 1 Giới thiệu về MATLAB Ngôn ngữ của công nghệ tính toán MATLAB là một ngôn ngữ lập trình bậc cao với môi trường tương tác cho phép tính toán, xử lý đồ thị/hình ảnh, mô phỏng đơn giản với nhiều công cụ hỗ trợ sẵn có từ thư viện Tools và Functions. Trong nhiều trường hợp, do cho phép làm việc bằng các phép toán xây dựng cho mảng và ma trận nên MATLAB tỏ ra ưu thế hơn các ngôn ngữ truyền thống khác như C/C++ hay Java™. Bên cạnh đó, ngôn ngữ và các cú pháp lệnh của MATLAB được nhiều người đánh giá là dễ hiểu và thân thiện với người dùng. Hiện nay MATLAB là một trong những ngôn ngữ lập trình được ứng dụng rộng rãi nhất trong nhiều lĩnh vực như: signal processing and communications, image and video processing, control systems, test and measurement, computational finance, and computational biology. Các tính năng cơ bản • Ngôn ngữ lập trình bậc cao cho tính toán sô và các xử lý đồ thị/hình ảnh và xây dựng ứng dụng. • Môi trường tương tác cho công việc phân tích, thiết kế và giải quyết vấn đề. • Các hàm toán học xây dựng sẵn cho các lĩnh vực: đại số, thống kê, lọc nhiễu, tối ưu, tích phân số, giải phương trình vi phân đạo hàm riêng… • Các công cụ vẽ đồ thị và xử lí hình ảnh xây dựng sẵn. • Các công cụ cải thiện hiệu năng tính toán và tiết kiệm thời gian tính toán. • Các hàm liên kết với các thuật toán của các ngôn ngữ khác như C, Java, .NET, and Microsoft® Excel® 2 Các thành phần của cửa sổ chương trình Khi khởi động chương trình, màn hình mặc định của MATLAB sẽ như hình dưới. Màn hình chính bao gồm các thành phần sau • Current Folder — Thư mục làm việc hiện tại. MATLAB chỉ thực thi các .M file đặt trong Folder này. • Command Window — Cho phép nhập và thực hiện các dòng lệnh, đồng thời hiển thị kết quả. • Workspace — Không gian dữ liệu chứa các biến được tạo ra hay import từ các file. • Command History — Lịch sử lệnh, cho phép xem lại hoặc thực hiện lại các lệnh đã thực hiện trong Command Window. Quá trình làm việc với MATLAB là quá trình tạo các biến và gọi các hàm. Ví dụ, tạo biến a bằng cách nhập: a = 1 MATLAB sẽ tạo ra biến a trong Workspace và hiển thị kết quả câu lệnh trong Command Window. a = 1 Tạo thêm các biến khác. b = 2 b = 2 3 c = a + b c = 3 d = cos(a) d = 0.5403 Khi không có biến đầu ra nào được chỉ định, MATLAB sẽ sử dụng biến ans, dạng ngắn gọn của ‘answer’, để lưu trữ kết quả tính toán. sin(a) ans = 0.8415 Nếu một câu lệnh được kết thúc bằng dấu chấm phẩy (;), MATLAB sẽ vẫn thực hiện câu lệnh nhưng không hiển thị kết quả tính toán ra Command Window. e = a*b; Có thể gọi lại các câu lệnh đã thực hiện bằng các phím mũi tên lên xuống ↑ và ↓. Nhấn các phím lên xuống tại các dòng lệnh mới hoặc sau khi nhập một số kí tự đầu tiên của câu lệnh. Ví dụ, để gọi lại câu lệnh b=2, nhập b, sau đó nhấn phím ↓. 4 Ma trận và Mảng MATLAB là viết tắt ngắn gọn của ‘matrix laboratory”. Trong khi các ngôn ngữ lập trình khác đa số làm việc với các con số tại một thời điểm, thì MATLAB được thiết kế để làm việc chủ yếu với các ma trận và mảng. Đây có thể coi là một ưu điểm của MATLAB so với các ngôn ngữ khác Tất cả các biến của MATLAB thuộc mọi kiểu dữ liệu đều là có thể là các mảng nhiều chiều. Ma trận là một mảng một chiều, thường sử dụng trong các tính toán đại số. Tạo mảng Để tạo mảng là một vecto hàng chứa 4 phần tử, ngăn cách các phần tử bởi dấu phẩy (,) hoặc phím cách. a = [1 2 3 4] trả lại a = 1 2 3 4 Để tạo ma trận chứ nhiều hàng, ngăn cách các hàng bởi dấu chấm phẩy (;) a = [1 2 3; 4 5 6; 7 8 10] a = 1 2 3 4 5 6 7 8 10 Một cách khác để tạo các ma trận là sử dụng các hàm lệnh sẵn có trong thư viện của MATLAB, như ones, zeros, rand…Ví dụ, tạo một ma trận 1 x 5 gồm các phần tử 0 z = zeros(1,5) z = 0 0 0 0 0 Các phép toán với ma trận và mảng MATLAB cho phép tính toán với tất cả các phần tử của ma trận chỉ bằng một phép toán hoặc hàm lệnh. a + 10 ans = 11 12 13 5 14 15 16 17 18 20 sin(a) ans = 0.8415 0.9093 0.1411 -0.7568 -0.9589 -0.2794 0.6570 0.9894 -0.5440 Để tính ma trận chuyển vị, dùng kí hiệu (‘): a' ans = 1 4 7 2 5 8 3 6 10 Phép nhân ma trận được thực hiện bằng toán tử *. Ví dụ, để kiểm tra tích của một ma trận với ma trận nghịch đảo của nó bằng ma trận đơn vị: p = a*inv(a) p = 1.0000 0 -0.0000 0 1.0000 0 0 0 1.0000 Với các giá trị số dạng số thực, MATLAB cho phép lựa chọn các dạng format khác nhau để hiển thị các giá trị sau dấu thập phân. Ví dụ, dạng format long: format long p = a*inv(a) p = 1.000000000000000 0 -0.000000000000000 6 0 1.000000000000000 0 0 0 0.999999999999998 Trở lại thiết lập hiển thị rút gọn bằng câu lệnh format short Chú ý rằng lệnh format chỉ ảnh hưởng đến việc hiển thị và làm tròn kết quả, chứ không tác động đến giá trị kết quả được lưu Các phép toán nhân, chia, lũy thừa từng phần tử được thực hiện bằng các toán tử (.*), (./), (.^). Ví dụ: p = a.*a p = 1 4 9 16 25 36 49 64 100 a.^3 ans = 1 8 27 64 125 216 343 512 1000 Ghép nối ma trận Ghép nối là quá trình nối các mảng để thu được mảng có kích thước lớn hơn. Thực tế, trong các phần trước ta đã tạo ra các mảng bằng cách ghép nối các phần tử của mảng đó. Cặp ngoặc vuông [] chính là toán tử ghép nối. A = [a,a] A = 1 2 3 1 2 3 4 5 6 4 5 6 7 8 10 7 8 10 7 Ghép các mảng sử dụng dấu phẩy (,) là nối ngang, các màng được nối ngang phải có cùng số dòng. Tương tự, ghép các mảng sử dụng dấu (;) là nối dọc, các mảng được nối dọc phải có cùng số cột. A = [a; a] A = 1 2 3 4 5 6 7 8 10 1 2 3 4 5 6 7 8 10 Số phức Số phức là số có hai phần thực và ảo. Phần ảo đơn vị là căn bậc 2 của -1 sqrt(-1) ans = 0 + 1.0000i Để biểu diễn phần ảo của các số phức, sử dụng hai kí tự i hoặc j c = [3+4i, 4+3j, -i, 10j] c = 3.0000 + 4.0000i 4.0000 + 3.0000i 0 - 1.0000i 0 +10.0000i 8 Chỉ số của mảng Mỗi biến của MATLAB là một mảng có thể chứa nhiều phần tử. Khi muốn truy cập đến một số phẩn tử nào đó của mảng, ta sử dụng các hàm lệnh chỉ số. Ví dụ, xét A là ma trận magic vuông cấp 4: A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1 Có hai cách để truy cập đến một phần tử của ma trận. Cách thông dụng là chỉ ra 2 chỉ số vị trí của phần tử đó theo hàng và cột A(4,2) ans = 14 Cách ít thông dụng hơn, nhưng lại hữu dụng hơn trong vài trường hợp, là chỉ ra 1 chỉ số vị trí của phần tử đó cộng dồn lần lượt theo các cột: A(8) ans = 14 Cách sử dụng 1 chỉ số vị trí được gọi là ‘linear indexing’. Nếu ta truy cập đến một phần tử có chỉ số vị trí vượt quá kích thước của mảng trong phần bên phải của một câu lệnh gán, MATLAB sẽ báo lỗi: test = A(4,5) Attempted to access A(4,5); index out of bounds because size(A)=[4,4]. Tuy nhiên, bên trái một câu lệnh gán, ta hoàn toàn có thể gán các giá trị cho các phần tử nằm bên ngoài mảng đã có. Khi đó thì các kích thước của mảng sẽ được tự động thay đổi để chưa được phần tử mới. 9 A(4,5) = 17 A = 16 2 3 13 0 5 11 10 8 0 9 7 6 12 0 4 14 15 1 17 Để truy cập đến nhiều phần tử của một mảng, sử dụng dấu hai chấm (:) theo cấu trúc start:end. Dấu hai chấm cho phép chỉ ra một khoảng giá trị truy cập. Ví dụ, để truy cập đến các phần tử của cột thứ 2 nằm trên 3 hàng đầu của ma trận A: A(1:3,2) ans = 2 11 7 Nếu dấu (:) đứng riêng lẻ, MATLAB sẽ truy cập đến tất cả các phần tử của kích thước đó. Ví dụ, truy cập đến tất cả các cột của hàng thứ 3 của ma trận A: A(3,:) ans = 9 7 6 12 0 Dấu (:) cũng có thể được sử dụng để tạo các vecto gồm các phần tử cách đều, theo cấu trúc start:step:end, ví dụ: B = 0:10:100 B = 0 10 20 30 40 50 60 70 80 90 100 Nếu step không được xác định thì MATLAB sẽ gán cho step giá trị mặc định bằng 1 10 Các biến và Workspace Workspace là không gian chứa các biến được tạo ra trong MATLAB hay import vào MATLAB từ các file dữ liệu hay các chương trình khác. Ví dụ, các dòng lệnh sau sẽ tạo ra hai biến A và B trong Workspace: A = magic(4); B = rand(3,5,2); Danh mục các biến của Workspace có thể được xem bằng lệnh whos. whos Name Size Bytes Class Attributes A 4x4 128 double B 3x5x2 192 double Các biến cũng sẽ được liệt kê trong khung Workspace của cửa sổ chương trình: Các biến của Workspace sẽ không được tự động lưu lại sau khi thoát khỏi chương trình. Để lưu lại dữ liệu cho các lần sử dụng tiếp theo, sử dụng lệnh save save myfile.mat Câu lệnh trên sẽ lưu toàn bộ Workspace hiện tại thành một .MAT file. Để xóa toàn bộ các biến trong Workspace, sử dụng lệnh clear. Để gọi lại các biến đã lưu trong .MAT file, sử dụng lệnh load. load myfile.mat 11 Chuỗi kí tự Chuỗi kí tự là một dãy gồm các kí tự bất kì nằm trong dấu ngoặc đơn (‘’). Có thể gán một chuỗi kí tự cho giá trị của một biến. myText = 'Hello, world'; Sử dụng dấu ngoặc kép để thể hiện dấu ngoặc đơn trong chuỗi kí tự. otherText = 'You''re right' otherText = You're right myText và otherText là các mảng, giống như mọi biến khác của MATLAB. Loại dữ liệu của chuỗi kí tự là char, dạng viết gọn cho ‘character’. whos myText Name Size Bytes Class Attributes myText 1x12 24 char Có thể nối ghép các chuỗi kí tự bằng toán tử [] tương tự như với mảng thông thường. longText = [myText,' - ',otherText] longText = Hello, world - You're right Để chuyển đổi các giá trị số thành chuỗi kí tự, sử dụng các hàm có sẵn trong MATLAB, ví dụ num2str, int2str f = 71; c = (f-32)/1.8; tempText = ['Temperature is ',num2str(c),'C'] tempText =Temperature is 21.6667C 12 Function MATLAB cung cấp một lượng lớn các Function (hàm lệnh) có sẵn để thực hiện các tính toán hoặc nhu cầu phổ biến của người dùng. Danh sách và mô tả của các Function của MATLAB có thể xem tại địa chỉ. Khi đã biết tên gọi của một Funnction, có thể truy cập phần Help mô tả Function đó từ Command Window bằng câu lệnh Help functionname Ví dụ, giả sử ta có hai ma trận A và B A = [1 3 5]; B = [10 6 4]; Khi gọi một Function, các biến input sẽ được đặt trong dấu ngoặc tròn (): max(A); Nếu có nhiều input thì chúng sẽ được ngăn cách bởi dấu phẩy (,) max(A,B); Giá trị output của một Function có thể được gán cho một biến khác: maxA = max(A); Khi có nhiều giá trị output, chúng sẽ được ngăn cách bởi dấu phẩy (,) và đặt trong ngoặc vuông []: [maxA,location] = max(A); Các biến input dạng chuỗi kí tự được đặt trong dấu ngoặc đơn (‘’) disp('hello world'); Để gọi một Function không có biến input và không trả lại các giá trị output, chỉ cần nhập tên của Function clc Function clc sẽ xóa và trả lại Command Window trống. 13 Vẽ hình 2-D và 3-D Vẽ hình 2-D Để vẽ các đường 2-D, sử dụng lệnh plot. Ví dụ, để vẽ đồ thị hàm sin trong khoảng [0, 2π]: x = 0:pi/100:2*pi; y = sin(x); plot(x,y) Có thể dán nhãn cho các trục tọa độ và đặt tên cho đồ thị xlabel('x') ylabel('sin(x)') title('Plot of the Sine Function') 14 Có thể thay đổi các thiết lập cho đồ thị bằng cách nhập thêm các giá trị định dạng cho đồ thị. Ví dụ câu lệnh sau sẽ cho đồ thị là đường màu đỏ gạch rời. plot(x,y,'r--') Chuỗi 'r--' là chuỗi định dạng của đồ thị. Mỗi chuỗi định dạng có thể bao gồm các giá trị về màu sắc, loại đường, và loại điểm đánh dấu. Điểm đánh dấu là những điểm sẽ được đánh dấu trên các đồ thị bằng các kí hiệu như +, o hay *. Ví dụ ‘g:*’ sẽ là định dạng của một đường màu xanh nét chấm với các điểm đánh dấu dạng * Chú ý rằng tên đồ thị và nhãn của các trục tọa độ được đặt cho đồ thị thứ nhất sẽ không xuất hiện trong đồ thị tiếp theo. Một cách mặc định, MATLAB sẽ xóa các đồ thị cũ khi một lệnh plot mới được gọi, đồng thời khởi tạo lại các trục tọa độ cũng như các yếu tố khác cho đồ thị mới. Để vẽ thêm các đường mới vào đồ thị đã có, sử dụng lệnh hold x = 0:pi/100:2*pi; y = sin(x); plot(x,y) hold on y2 = cos(x); plot(x,y2,'r:') legend('sin','cos') 15 Cho đến khi có lệnh hold off, tất cả các đường được vẽ sẽ cùng hiển thị trong đồ thị hiện thời. Vẽ hình 3-D Một đồ thị 3-D cơ bản là một mặt biều thị cho một hàm 2 biến z = f (x,y). Để tính z, đầu tiên ta tạo một tập các điểm tọa độ (x,y) bằng lệnh meshgrid [X,Y] = meshgrid(-2:.2:2); Z = X .* exp(-X.^2 - Y.^2); Sau đó vẽ mặt bằng lệnh surf surf(X,Y,Z) Hai lệnh vẽ hình 3-D cơ bản là surf và mesh. Trong khi surf tô màu cả các đường và các ô của mặt thì mesh chỉ tô màu các đường và cho kết quả hình vẽ dạng khung. 16 Vẽ đồ thị con Có thể vẽ được nhiều đồ thị trong các miền con của một hình vẽ bằng cách sử dụng lệnh subplot. Ví dụ, đoạn lệnh sau sẽ vẽ 4 đồ thị trong một khung hình được chia làm 4 miền con: t = 0:pi/10:2*pi; [X,Y,Z] = cylinder(4*cos(t)); subplot(2,2,1); mesh(X); title('X'); subplot(2,2,2); mesh(Y); title('Y'); subplot(2,2,3); mesh(Z); title('Z'); subplot(2,2,4); mesh(X,Y,Z); title('X,Y,Z'); Hai giá trị đầu trong các input của subplot chỉ kích thước theo hai chiều ngang dọc của khung hình. Giá trị thứ ba chỉ ra miền con sẽ được sử dụng để vẽ đồ thị. 17 Script Một chương trình MATLAB đơn giản nhất được gọi là một tập lệnh (Script). Script là một .M file với nội dung là một chuỗi các dòng lệnh gán biến và gọi hàm của MATLAB. Thực thi một Script bằng cách nhập tên của nó vào dòng lệnh. Ví dụ về Script Để tạo một Script mới, dùng lệnh edit edit plotrand Câu lệnh trên sẽ tạo ra một file trống có tên plotrand.m. Nhập một số dòng lệnh đơn giản vẽ một vecto nhận các giá trị ngẫu nhiên n = 50; r = rand(n,1); plot(r) Sau đó, thêm các dòng lệnh vẽ đường nằm ngang đi qua giá trị trung bình: m = mean(r); hold on plot([0,n],[m,m]) hold off title('Mean of Random Uniform Data') Một điều nên làm trong khi viết code là thêm các dòng chú thích để mô tả các phần chương trình được viết. Các dòng chú thích được bắt đầu bằng dấu %. % Generate random data from a uniform distribution % and calculate the mean. Plot the data and the mean. n = 50; % 50 data points r = rand(n,1); plot(r) % Draw a line from (0,m) to (n,m) m = mean(r); hold on plot([0,n],[m,m]) hold off title('Mean of Random Uniform Lưu Script trong Folder hiện thời. Đ plotrand Cách khác để chạy một Script là click nút Vòng lặp và các câu lệnh có điều kiệ Trong một Script có thể có các vòng l Ví dụ, tạo một Script có tên calcmaen.m giá trị trung bình của các lần tính toán. nsamples = 5; npoints = 50; for k = 1:nsamples currentData = rand(npoints,1); sampleMean(k) = mean(currentData); end overallMean = mean(sampleMean) Bây giờ, thay đổi các câu lệnh bằng cách bỏ đ ấ ố ệ trung bình sau mỗi lần tính toán trong vòng l tự của lần tính toán. for k = 1:nsamples iterationString = ['Iteration #' disp(iterationString) currentData = rand(npoints,1); sampleMean(k) = mean(currentData) 18 Data') ể gọi một Script, chỉ cần nhập tên của nó vào dòng l Run trong cửa sổ Editor. n ặp và khối lệnh có điều kiện như for, if, và s để tính giá trị trung bình của 5 giá trị ngẫ i d u (;) cu i câu l nh tính sampleMean ặp, đồng thời hiển thị trong cửa sổ Command ,int2str(k)]; ệnh. witch. u nhiên, rồi sau đó tính để hiển thị các giá trị Window số thứ 19 end overallMean = mean(sampleMean) Với thay đổi này, khi gọi Script calcmean, kết quả sẽ hiển thi như bên dưới. calcmean Iteration #1 sampleMean = 0.3988 Iteration #2 sampleMean = 0.3988 0.4950 Iteration #3 sampleMean = 0.3988 0.4950 0.5365 Iteration #4 sampleMean = 0.3988 0.4950 0.5365 0.4870 Iteration #5 sampleMean = 0.3988 0.4950 0.5365 0.4870 0.5501 overallMean = 0.4935 Sửa đổi thêm Script: Trong cửa sổ Editor, thêm vào đoạn lệnh có điều kiện ở cuối caclmean.m để hiển thị thông báo về sự sai khác của giá trị overallMean: if overallMean < .49 disp('Mean is less than expected') elseif overallMean > .51 disp('Mean is greater than expected') else disp('Mean is within the expected range') end Gọi caclmean để xem kết quả của đoạn lệnh vừa bổ sung: overallMean = 0.5178 Mean is greater than expected Địa chỉ của Script 20 MATLAB sẽ chỉ truy cập được các Script hay các dữ liệu khác ở một khu vực được chỉ định của ổ cứng. Để gọi một Script thì.M file của Script đó phải nằm trong Folder hiện hành (được hiển thị tro