4. Các phép toán
Các phép toán cơ bản
( + , - , * , / ). Ví dụ:
>> 7/45
>> (1+i)*(2-1)
Phép lũy thừa (^). Ví dụ:
>> 4^2
>>(3+e)^0.1
Với các biểu thức phức tạp, cần sử dụng các dấu ngoặc đơn.
>> ((2+3)*3)^(e-1)
Chú ý để không bị thiếu dấu nhân, ví dụ:
>> 3(1+0.7) % MATLAB sẽ báo lỗi
Các hàm toán học được định nghĩa sẵn (Built-in Functions)
>> sqrt(2) % Căn bậc hai
>> log(2); log10(1.2) % Hàm loga
>> cos(1.2), atan(-.8) % Các hàm lượng giác
>> round(1.2), floor(3.3), ceil(4.23) % Làm tròn số
>> exp(2+4*i) % Hàm lũy thừa cơ số tự nhiên
>> angle(i); abs(1+i); % Các phép toán với số phức
Bài tập
1. Giả sử hằng số thời gian của việc học của bạn là 1.5 ngày. Tính thời gian theo giây của 1.5 ngày và gán giá trị này cho biến tau.
2. Khóa học MATLAB cơ bản này kéo dài 5 buổi. Tính thời gian theo giây của 5 ngày và gán giá trị này cho biến endofClass
3. Phương trình sau biểu thị mối quan hệ của lượng kiến thức bạn thu được theo thời gian t:
k = 1 - e^(-t/T)
Tính lượng kiến thức bạn sẽ học được tại thời điểm endofClass. Gán vào biến knowledgeAtEnd (sử dụng hàm exp)
4. Sử dụng giá trị của knowlegdeAtEnd, in ra dòng sau:
At the end of 6.094, I will know X% of MATLAB với X = num2str(knowlegdeAtEnd)*100. Hàm num2str là hàm chuyển một số sang một xâu kí tự.
Các phép toán trên vector
Phép chuyển vị (lưu ý: toán tử ' sẽ cho chuyển vị Hamilton, tức là chuyển vị và lấy số phức liên hợp)
>> a = [1 2 3 4+i]
>> transpose(a)
>> a'
>> a.'
Cộng trừ ma trận: Thực hiện như với các biến đơn, yêu cầu các vector đó phải có cùng kích cỡ.
Để tính tổng hay tính tích tất cả các phần tử của vector dùng lệnh sum và lệnh prod
Các phép toán với từng phần tử: những hàm được định nghĩa sẵn sử dụng được với các phần tử vô hướng hầu như đều sử dụng được với vector
>> t = [1 2 3];
>> f = exp(t); % Cũng tương đương với
>> f = [exp(1) exp(2) exp(3)];
Nếu như không chắc chắn, nên sử dụng lệnh help để kiểm tra xem liệu hàm có hỗ trợ cho từng phần tử của mảng hay không.
Các toán tử (*/ ^) có hai cách sử dụng là cách sử dụng thông thường và cách sử dụng với từng phần tử của mảng.
Để sử dụng với từng phần tử của mảng, dùng dấu . ở trước toán tử (.* , .^, ./) . Cần chú ý tới kích thước của vector khi sử
dụng các toán tử này (trừ khi một trong hai toán hạng là một vô hướng).
>> a = [1 2 3]; b = [4; 2; 1];
>> a.*b, a./b, a.^b % Tất cả đều sai vì kích thước 2 vector không phù hợp
>> a.*b' , a./b' , a.^(b') % Đều được chấp nhận.
Các toán tử trên ma trận:
>> [1 2 3] * [4 2 1]'
ans =
11
>> [1 2; 3 4]^2 % Chú ý chỉ có ma trận vuông mới có thể nâng lên lũy thừa.
% Câu lệnh đó tương đương với [1 2; 3 4] * [1 2; 3 4]
>> [1 1 1; 2 2 2; 3 3 3]/[1 2 3; 1 2 3; 1 2 3] % Phép chia trái
>> [1 1 1; 2 2 2; 3 3 3]/[1 2 3; 1 2 3; 1 2 3] % Phép chia phải
Khởi tạo ma trận với giá trị mong muốn: sử dụng các lệnh ones, zeros, rand, eyes,...
>> o = ones(1,10) % vector hàng với 10 phần tử bằng 1
>> z = zeros(2,3) % ma trậnvới 2 cột, 3 hàng, các phần tử bằng 0
>> r = rand(1,45) % vector hàng với 45 phần tử lấy ngẫu nhiên (phân bố đều trong đoạn [0, 1])
>> e = eyes(3) % ma trận đơn vị 3x3
Khởi tạo một vector có các phần tử tăng tuyến tính
>> a = linspace( 0, 10 , 5) % Các phần tử bắt đầu tại 0, kết thúc tại 10, gồm 5 giá trị.
>> b = 0:2:10 %bắt đầu tại 0, mỗi phần tử tăng thêm 2, kết thúc khi bằng hoặc lớn hơn 10.
>> c=1:5 %nếu như giá trị tăng không được khai báo, giá trị default là 1.
Tương tự để khởi tạo một vector có các phần tử tăng theo logarith dùng lệnh logspace (các bạn tự tìm hiểu help).
Bài tập:
1. Tiếp theo bài tập trước, tạo một vector tuyến tính thời gian, tVec gồm 10000 phần tử từ 0 đến endOfClass.
2. Tính các giá trị của vector knowledgeVec tại mỗi điểm tương ứng của tVec theo công thức: k = 1 - exp(-t/tau)
Truy cập đến các phần tử trong vector (chỉ số)
MATLAB bắt đầu đánh số từ 1 (khác C đánh số mảng từ 0).
a(n) sẽ trả về phần tử thứ n của vector hàng.
Các chỉ số có thể cho dưới dạng vector, trong trường hợp này, kết quả trả về là một mảng có kích thước có tương đương với vector chỉ số.
>> x = [12 13 5 8];
>> a = x(2:3); % a = [13 5]
>> b = x(1:end-1); % b = [12 13 5], end = chỉ số cuối cùng của vector.
Truy cập đến các phần tử của ma trận
Các phần tử của ma trận có thể được đánh số dựa vào: 2 chỉ số hàng và cột (subscripts) hoặc dùng chỉ số tuyến tính (indices) giống như cách đánh chỉ số mảng nhiều chiều trong C (nhưng không bắt đầu từ (0,0)).
>> b = [14 33; 9 8]% Khi đó b(1,1)= 14 = b(1);b(1,2) = 33 =b(2);b(2,1)=9=b(3);b(2,2)=8=b(4)
% Để lấy được một ma trận con, đưa vào 1 mảng chỉ số.
>> A = rand(5) % Tạo một ma trận ngẫu nhiên 5x5
>> A(1:3,1:2) % Lấy một ma trận con từ 2 mảng chỉ số
>> A([1 5 3], [1 4]) % Cách khác để lấy 1 ma trận con
Truy cập đến từng phần tử của mảng (nâng cao)
MATLAB có sẵn các hàm để giúp lọc các phần tử mong muốn từ một ma trận.
Để tìm phần tử bé nhất và chỉ số của nó, dùng câu lệnh:
>> vec = [5 3 1 9 7]
>> [minVal, minInd] = min(vec) % Câu lệnh max sử dụng tương tự
Để tìm vị trí mọi phần tử có giá trị nhất định hay nằm trong một khoảng nhất định dùng lệnh find
>> ind = find(vec == 9) %Tìm chỉ số của các phần tử bằng 9
>> ind = find(vec>2 & vec <6)
Để chuyển giữa 2 dạng: chỉ số hàng, cột (subscripts) và dạng đánh số tuyến tính (indices) dùng câu lệnh ind2sub, và sub2ind.