menu

Matlab 3: Dạo một vòng code matlab

Đăng lúc 18/02/2018, trong chuyên mục Lập trình Matlab

Chúng ta chưa tìm hiểu sâu về cấu trúc và câu lệnh matlab vội. Bài này giúp bạn “vọc vạch” với code matlab để có cái nhìn khái quát đầu tiên và cũng để định hướng cần phải xem cái gì ở bài nào.

Bài này sẽ chia làm hai phần:

  • Code chơi với vài lệnh matlab cơ bản để nhận biết các đối tượng cơ bản trong matlab sẽ được giới thiệu ở các bài tiếp theo.
  • Thử code một bài tập nhỏ.

Vọc với code matlab

Khi bạn mới mở matlab lên và trước đó chưa có tạo gì hết (khung Editor chưa được mở), giao diện matlab sẽ giống như sau

Khi vừa mở matlab lên.

Bây giờ bạn hãy gõ vào những câu lệnh sau đây, mỗi câu lệnh 1 dòng và enter để thấy kết quả

Lệnh đầu tiên.

2+2

Bạn sẽ thấy xuất hiện ngay biến ans có giá trị là 4 (khoan đã, biến là gì?) Biến ans này là biến matlab tự đặt tên để lưu các giá trị mà bạn không có đặt tên cho nó.

Lệnh tiếp theo.

a=2+3

Bạn thấy đấy, nếu bạn đặt tên cho nó (a) thì nó sẽ tạo thêm một cái a ở bên Workspace và lúc này, biến ans của chúng ta vẫn là cái lúc nãy.

Như đã nói ở bài trước, matlab là một ngôn ngữ được thiết kế dành riêng cho các ma trận, cái gì của nó cũng liên quan đến ma trận, ngay cả 1 con số nhỏ nhoi và đơn lẻ cũng được lưu vào một cái ma trận với số chiều là 1x1. Để hiện số chiều của mỗi biến trong Workspace, hãy làm như bên dưới

Hiển thị size của mỗi biến.

Bây giờ hãy thử tạo một vector xem sao nhé (ở các bài sau, chúng ta sẽ tìm hiểu chi tiết và đầy đủ các cách tạo vector, ma trận trên matlab, bài này chỉ việc…chơi thôi)

Lệnh tiếp theo.

x=[1:10:50]
y=[5:5:55];

Hàng 1 và hàng 2 khác nhau ở dấu ;, bạn xem bên kết quả cũng có sự khác nhau ở dòng của x và của y.

  • Nếu có dấu ; ở cuối câu lệnh thì kết quả của câu lệnh sẽ không hiển thị ở Command Windows. Cái này có lợi khi nào? Khi ma trận của bạn quá lớn (dẫn đến việc hiển thị rất mất thời gian) cũng như khi bạn viết nhiều câu lệnh riêng biệt trên cùng một dòng, các câu lệnh này sẽ cách nhau bởi dấu ;.
  • Hàng 1 là bạn tạo ra một biến x nhận giá trị là một vector gồm các số bắt đầu từ 1 và không lớn hơn 50, mỗi số cách nhau 10 đơn vị kể từ 1 (ta gọi đó là bước nhảy 10).
  • Hàng 2 là các số từ 5 và không lớn hơn 55, bước nhảy từ 1 là 5.
  • Xem bên Workspace, cả hai biến xy đều được tạo ra và lưu vào “bộ nhớ”. Tuy nhiên cách biểu diễn của x và y lại tương đối khác nhau ở mục Value. Matlab sẽ hiển thị chi tiết giá trị của biến ra nếu nó đơn giản (ví dụ như x), còn nếu phức tạp, nó chỉ hiển thị thông tin về biến, kiểu 1x11 double của y. Còn thế nào là đơn giản, thế nào là phức tạp thì…chỉ có matlab biết.

Bây giờ bạn hãy thử nhấp đôi vào biến x bên khung Workspace xem chuyện gì xảy ra?

Nhấp đôi vào biến bên Workspace.

Một cửa sổ bảng biểu của biến sẽ hiển thị ra. Cái này giống như bảng trên excel vậy, gồm hàng và cột đại diện cho ma trận hai chiều. Đây là nơi bạn có thể quản lý các biến, cũng có thể copy-paste qua lại giữa matlab và excel (không tin mở excel làm thử nhé).

Ở trên là vector, tạo thử một cái ma trận bất kỳ xem sao,

Lệnh tiếp theo.

rand(3,2)

Câu lệnh rand viết tắt của “random” (ngẫu nhiên) sẽ cho phép bạn tạo ra một ma trận/vector/… bất kỳ (giá trị nằm trong khoảng 0 và 1). Nó có nhiều tác dụng lắm, thử gõ vào khung Help để xem giải thích cụ thể nhé.

Cặp số (3,2) nói cho matlab biết là 3 dòng, 2 cột. Bạn đừng thấy lạ là tại sao bạn cũng gõ y chang tôi nhưng ma trận lại ra khác tôi. Đơn giản bởi vì nó tạo ngẫu nhiên nên mỗi lần dùng lệnh này nó lại tạo ra một cái ngẫu nhiên khác, mà ngẫu nhiên thì sẽ không thể giống nhau được.

Lần nữa, hãy để ý là tôi không có đặt tên (hay “gán”) rand(3,2) cho bất kỳ biến gì nên matlab sẽ tự động đưa vào biến ans. Ngó sang Workspace để thấy biến ans bây giờ đã nhận ValueSize khác rồi đấy.

Tạo ra được vector và ma trận rồi, bây giờ chúng ta thử “truy xuất” đến các thành phần của chúng xem sao.

Lệnh tiếp theo.

kq=x(4)+y(5)

Lấy phần tử thứ 4 của x cộng với phần tử thứ 5 của y.

Bạn thấy đấy, matlab được thiết kế rất “tự nhiên”, bạn học về vector và ma trận ký hiệu ra sao thì trên matlab chúng ta cũng thao tác và gõ tương tự vậy.

Lệnh tiếp theo.

% aa=5
bb=10

Không có gì xảy ra tại dòng có dấu %!

Bạn thấy đấy, tất cả những gì phía sau dấu % trên một dòng sẽ không có tác dụng khi matlab chạy. Matlab khi gặp ký tự này nó sẽ hiểu là “Ah, bỏ qua thôi” và nó bắt đầu xét dòng lệnh kế tiếp. Chúng ta dùng ký hiệu này để ghi “comment” (ghi chú) cho code của chúng ta. Việc ghi chú là rất cần thiết khi code vì nó sẽ giúp cho code dễ hiểu hơn, nhất là khi bạn chia sẻ code với người khác hay khi đoạn code quá dài và phức tạp.

Chúng ta sẽ kết thúc cuộc dạo chơi ở phần vẽ vời đơn giản. Hãy thử vẽ hàm số $f(x)=x^2$ xem nó ra cái gì nhé? Dữ liệu của x chính là x ở các bước trên

Kết quả sao khi plot.

f = x.^2;
plot(x,f,'r-');

Matlab không vẽ hàm số mà thật ra nó vẽ các điểm (x,f(x)) rồi sau đó nối chúng lại với nhau. Một cửa sổ hình vẽ hiện lên mang tên Figure 1, bạn có thể thao tác với hình vẽ này bằng các công cụ trong cửa sổ hình vẽ này (zoom, save, ghi chú,…)

Sẽ có một bài viết chi tiết về việc vẽ hình trong matlab, ở đây ta chỉ đang vẽ một hàm rất rất đơn giản.

  • Nhắc lại x=[1,11,21,31,41], ta sẽ tìm giá trị của h tại từng giá trị của x. Do $f(x)=x^2$ nên chúng ta dùng lệnh f=x.^2, dấu . phía trước phép bình phương cho matlab biết là chúng ta sẽ bình phương từng phần tử của x. Kết quả ta được f=[1,121,441,961,1681].
  • Sau khi có đủ giá trị của x và h (hai cái này phải cùng kích thước), matlab sẽ vẽ các điểm tương ứng (1,1), (11,121),… đó chính là ý nghĩa của plot(x,f).
  • Để có thể nối các điểm lại với nhau và thêm màu đỏ, ta dùng 'r-' (r viết tắt của red).

Giải quyết một bài tập nhỏ

Vậy là bạn đã có một cái nhìn tổng quát về matlab và cách nó hoạt động. Bây giờ chúng ta hãy cùng nhau thử lập trình một ứng dụng nho nhỏ.

Bài tập 3.1

Hãy viết một hàm kiểm tra tính chẵn lẻ của một số được người dùng nhập vào. Sau đó xuất ra kết quả.

Bài này rất quen thuộc, chúng ta đã tiếp cận với nó ở bài Lập trình là gì và như thế nào. Vui lòng đọc lại giải thuật ở bài ấy, bây giờ chúng ta sẽ dựa vào giải thuật đó để viết nên hàm kiemTraChanLe() trên matlab. Bên dưới là “đoạn code” ở bài trước

xuất-ra-màn-hình "Vui lòng nhập vào một số"
đọc-kết-quả-từ-bàn-phím-và-gán-vào-biến x
nếu x chia hết 2 thì
  xuất-ra-màn-hình "x là số chẵn"
ngược-lại-thì
  xuất-ra-màn-hình "x là số lẻ"

Vậy ta cần phải biết các lệnh tương ứng trong matlab là gì? Ví dụ xuất-ra-màn-hìnhđọc-kết-quả-từ-bàn-phím-và-gán-vào-biến thì trong matlab là lệnh gì? Tôi cũng không biết nữa (tôi xạo đó). Vậy làm sao? Ta liên tưởng ngay xuất ra màn hình là “export”, “print”,… và đọc kết quả là “input”, “read”,… Mấy từ khóa này (tiếng Anh thôi nha) có tác dụng giúp bạn tìm kiếm dễ hơn trên Google (Vâng, tôi đang hướng dẫn bạn cách tìm câu trả lời sau này đấy).

Thử tìm trên Google

Ngay kết quả thứ 2 sau khi gõ tìm trên Google là chúng ta đã có câu trả lời, đó là từ khóa input (trong đường link đó còn có hẳn 1 đoạn code ví dụ cho bạn nữa). Có những thứ rất rất cơ bản, hay được sử dụng thì tôi sẽ đề cập đến trong loạt bài này, còn có những thứ ít dùng thì bạn cần phải biết cách để tìm kiếm.

Tương tự, bạn có thể tự tìm nếu...thì, ngược-lại-thì, chia-hết, xuất-ra-màn-hình là gì trong matlab. Ở đây tôi đã tìm được như thế này

  • xuất-ra-màn-hìnhđọc-kết-quả-từ-bàn-phím-và-gán-vào-biến : input
  • nếu…thì…ngược-lại-thì: if...else...end
  • chia-hết: ~mod(a,b) (mod(a,b) cho ra số dư trong phép chia a cho b, tuy nhiên thêm ~ phía trước sẽ ra kết quả là 1 (nếu a chia hết cho b) hoặc 0 (nếu a không chia hết cho b). Sao tui biết tài thế? Tui nhờ bác Google tìm cho đó, với từ khóa “divisible by in matlab” và nhận được kết quả đầu tiên.
  • xuất-ra-màn-hình: disp

Và đây là đoạn code của hàm kiemTraChanLe, đoạn code này chứa trong file kiemTraChanLe.m (bạn có thể download file này tại đây)

function kiemTraChanLe()
  thongbao = 'Vui long nhap vao mot so: '; % gia su ban nhap dung
  x = input(thongbao);
  
  if ~mod(x,2)
      bienTam = [num2str(x),' la so chan.']; % chua doan tra loi
      disp(bienTam); % xuat ra cau tra loi
  else
      bienTam = [num2str(x),' la so le.']; % chua doan tra loi
      disp(bienTam); % xuat ra cau tra loi
  end
end

Test kết quả Bài tập 3.1.

  • À há, bạn nhận ra chúng ta phải viết tất cả các đoạn code ở một file riêng, tôi đã đặt tên nó là kiemTraChanLe.m (bạn có thể download file này tại đây). Việc sử dụng file .m cho phép chúng ta
    • Lưu lại đoạn code dài thườn thượt và chạy một lần duy nhất, cũng là để sử dụng sau này.
    • Tạo ra các file hàm số để sử dụng (Oái, hàm số là gì? Sẽ có một bài viết chi tiết về nó sau, ở đây ta chỉ cần tạm hiểu nó là cái chúng ta sẽ gọi tên mỗi lần muốn chạy “phần mềm” trong bài tập này, cái này có tên kiemTraChanLe()).
    • Để có thể soạn thảo đọa đoạn code này trên một file .m, bạn cần mở trình Editor trong matlab (xem lại bài trước để biết nó là gì). Để có thể tạo một file mới, bạn chọn Home > New Script hay chỉ đơn giản nhấn Ctrl+N.
  • Tại sao lại dùng bienTamnum2str? Vì yêu cầu của hàm disp là bên trong nó chỉ có thể là một biến kiểu string (chữ). Trong khi x (kiểu số) và chúng ta chưa biết (vì chưa biết người dùng nhập gì), chỉ có “la mot so chan” hay “la mot so le” đang là kiểu string thôi. Ta cần chuyển x từ kiểu số sang kiểu chữ nên dùng hàm num2str (viết tắt của “number to string”, hãy dùng chức năng Help trong matlab để xem nó là gì nhé). Sau khi chuyển x về string, ta cần ghép nó vào thành một câu hoàn chỉnh với “la mot so chan” bằng cách đặt chúng vào biến bienTam.
  • Bạn không nên dùng tiếng Việt có dấu trong matlab, nếu bạn dùng, nó sẽ hiển thị ? ở mấy chỗ có dấu. Ví dụ thay vì nó hiện “là một số chẵn”, nó sẽ hiện “l? m?t s? ch?n”.

Tổng kết cuộc dạo chơi

Vậy là sau bài đầu tiên, bạn đã biết được một số điều sau đây

  • Một số loại biến trong matlab và chúng sẽ được hiển thị ở Workspace.
  • Một số phép toán cơ bản.
  • Tác dụng của dấu ;.
  • Tác dụng của dấu %.
  • Cách đơn giản để tạo ra một vector hay ma trận ngẫu nhiên.
  • Vẽ một hình chơi chơi bằng lệnh plot.
  • Viết được một hàm nho nhỏ bằng cách tạo một file .m.
  • Cách tìm kiếm sơ khai những điều chưa biết tùy theo nhu cầu.

Kể từ bài tiếp theo, chúng ta sẽ đi chuyên sâu vào những thứ trên đây.

matlab
tự học matlab
Top