Lập trình MATLAB cơ bản là nền tảng quan trọng cho bất kỳ ai muốn làm việc với tính toán khoa học và kỹ thuật. MATLAB (Matrix Laboratory) không chỉ là công cụ giải toán mà còn là môi trường lập trình mạnh mẽ, được thiết kế đặc biệt để xử lý ma trận và mảng nhiều chiều một cách hiệu quả. Bài viết này sẽ đi sâu vào các khái niệm cốt lõi, cú pháp, và kỹ thuật lập trình MATLAB thực tế mà bạn cần nắm vững.
MATLAB Là Gì và Tại Sao Nên Học?
MATLAB là môi trường tính toán số và ngôn ngữ lập trình được phát triển bởi MathWorks từ cuối những năm 1970. Điểm đặc biệt của MATLAB nằm ở khả năng xử lý ma trận như kiểu dữ liệu cơ bản, khác với C/C++ hay Java nơi mảng là cấu trúc dữ liệu phức tạp hơn.
Trong thực tế, MATLAB được sử dụng rộng rãi tại các phòng lab nghiên cứu, công ty công nghệ, và các tổ chức tài chính. Ví dụ, các kỹ sư xử lý tín hiệu tại Qualcomm sử dụng MATLAB để prototype thuật toán trước khi implement bằng C cho chip. Các nhà phân tích định lượng tại Goldman Sachs dùng MATLAB để backtest chiến lược giao dịch.
Cài Đặt và Làm Quen Với Môi Trường
Cài đặt MATLAB
MATLAB yêu cầu license thương mại, nhưng sinh viên thường được truy cập miễn phí qua trường học. Sau khi cài đặt MATLAB R2023b trở lên, bạn sẽ thấy giao diện gồm:
- Command Window: Nơi thực thi lệnh trực tiếp
- Workspace: Hiển thị các biến đang tồn tại trong bộ nhớ
- Editor: Viết và lưu script (.m files)
- Current Folder: Quản lý thư mục làm việc
Lệnh cơ bản đầu tiên
% MATLAB version: R2023b
% Khai báo biến và phép toán cơ bản
a = 5; % Gán giá trị, dấu ; ngăn output
b = 10;
c = a + b % Không có ; sẽ hiển thị kết quả
% Output: c = 15
Lưu ý quan trọng: MATLAB phân biệt chữ hoa/thường. Biến myVar khác hoàn toàn với myvar.
Làm Việc Với Ma Trận và Mảng
Tạo ma trận
Ma trận là trái tim của MATLAB. Cú pháp tạo ma trận rất trực quan:
% Tạo ma trận 2x3
A = [1 2 3; 4 5 6];
% Tạo vector hàng
v_row = [1 2 3 4 5];
% Tạo vector cột
v_col = [1; 2; 3; 4; 5];
% Ma trận đặc biệt
zeros_mat = zeros(3, 4); % Ma trận 3x4 toàn số 0
ones_mat = ones(2, 2); % Ma trận 2x2 toàn số 1
identity = eye(3); % Ma trận đơn vị 3x3
random_mat = rand(2, 3); % Ma trận 2x3 số ngẫu nhiên [0,1]
% Input: A
% Output:
% A =
% 1 2 3
% 4 5 6
Indexing và slicing
MATLAB sử dụng indexing bắt đầu từ 1 (khác với Python/C++ bắt đầu từ 0):
A = [10 20 30; 40 50 60; 70 80 90];
% Truy cập phần tử
element = A(2, 3); % Hàng 2, cột 3 → 60
% Truy cập hàng/cột
row2 = A(2, :); % Toàn bộ hàng 2 → [40 50 60]
col3 = A(:, 3); % Toàn bộ cột 3 → [30; 60; 90]
% Slicing
sub_matrix = A(1:2, 2:3); % Hàng 1-2, cột 2-3
% Output:
% sub_matrix =
% 20 30
% 50 60
Pitfall thường gặp: Quên rằng MATLAB index từ 1. Nếu bạn viết A(0, 1), sẽ gặp lỗi “Index exceeds matrix dimensions”.
Phép toán ma trận
A = [1 2; 3 4];
B = [5 6; 7 8];
% Phép toán element-wise (từng phần tử)
C = A . B; % Nhân từng phần tử
% C =
% 5 12
% 21 32
% Phép toán ma trận (đại số tuyến tính)
D = A B; % Nhân ma trận
% D =
% 19 22
% 43 50
% Transpose
A_T = A'; % Chuyển vị
% A_T =
% 1 3
% 2 4
% Nghịch đảo
A_inv = inv(A); % Ma trận nghịch đảo (nếu tồn tại)
Time Complexity: Nhân ma trận A (m×n) với B (n×p) có độ phức tạp O(m×n×p). Với ma trận lớn (>1000×1000), nên dùng GPU computing hoặc sparse matrix nếu ma trận thưa.
Cấu Trúc Điều Khiển
Câu lệnh if-else
% MATLAB version: R2023b
score = 85;
if score >= 90
grade = 'A';
elseif score >= 80
grade = 'B';
elseif score >= 70
grade = 'C';
else
grade = 'F';
end
fprintf('Grade: %sn', grade);
% Output: Grade: B
Best practice: Với nhiều điều kiện, xem xét dùng switch-case thay vì chuỗi if-elseif dài.
Vòng lặp for
% Tính tổng các số từ 1 đến 100
sum_val = 0;
for i = 1:100
sum_val = sum_val + i;
end
fprintf('Sum: %dn', sum_val);
% Output: Sum: 5050
% Duyệt ma trận
A = [1 2 3; 4 5 6];
[rows, cols] = size(A);
for i = 1:rows
for j = 1:cols
fprintf('A(%d,%d) = %dn', i, j, A(i,j));
end
end
Performance tip: Vòng lặp trong MATLAB chậm hơn so với vectorization. Thay vì:
% Cách chậm
for i = 1:length(x)
y(i) = x(i)^2;
end
Nên dùng:
% Cách nhanh (vectorized)
y = x.^2;
Benchmark cho vector 1 triệu phần tử: vòng lặp ~0.5s, vectorization ~0.01s (nhanh hơn 50 lần).
Vòng lặp while
% Tìm số Fibonacci đầu tiên > 1000
a = 1;
b = 1;
while b <= 1000
temp = a + b;
a = b;
b = temp;
end
fprintf('First Fibonacci > 1000: %dn', b);
% Output: First Fibonacci > 1000: 1597
Viết Hàm Trong MATLAB
Cú pháp cơ bản
Tạo file calculate_area.m:
function area = calculate_area(length, width)
% CALCULATE_AREA Tính diện tích hình chữ nhật
% area = calculate_area(length, width) trả về diện tích
%
% Input:
% length - chiều dài (số dương)
% width - chiều rộng (số dương)
% Output:
% area - diện tích
% Kiểm tra input
if length <= 0 || width <= 0
error('Length and width must be positive');
end
area = length width;
end
Sử dụng:
>> area = calculate_area(5, 3)
area =
15
Hàm với nhiều output
function [mean_val, std_val] = calculate_stats(data)
% CALCULATE_STATS Tính mean và standard deviation
% [mean_val, std_val] = calculate_stats(data)
mean_val = mean(data);
std_val = std(data);
end
Sử dụng:
data = [1, 2, 3, 4, 5];
[m, s] = calculate_stats(data);
fprintf('Mean: %.2f, Std: %.2fn', m, s);
% Output: Mean: 3.00, Std: 1.58
Common mistake: Quên đặt tên file trùng với tên hàm. File phải là calculate_stats.m, không phải stats.m.
Vẽ Đồ Thị 2D và 3D
Đồ thị 2D cơ bản
% Vẽ hàm sin và cos
x = 0:0.1:2pi;
y1 = sin(x);
y2 = cos(x);
figure;
plot(x, y1, 'r-', 'LineWidth', 2);
hold on;
plot(x, y2, 'b--', 'LineWidth', 2);
hold off;
xlabel('x (radians)');
ylabel('y');
title('Sin and Cos Functions');
legend('sin(x)', 'cos(x)');
grid on;
Đồ thị hàm sin và cos trong MATLAB
Đồ thị 3D
% Vẽ surface plot của hàm z = x^2 + y^2
[X, Y] = meshgrid(-5:0.5:5, -5:0.5:5);
Z = X.^2 + Y.^2;
figure;
surf(X, Y, Z);
xlabel('X');
ylabel('Y');
zlabel('Z');
title('Surface Plot: z = x^2 + y^2');
colorbar;
shading interp; % Làm mượt bề mặt
Tip thực tế: Khi vẽ nhiều subplot, dùng subplot(m, n, p) để chia figure thành lưới m×n và chọn vị trí p.
Xử Lý File và Dữ Liệu
Đọc/ghi file CSV
% Ghi dữ liệu ra CSV
data = [1, 2, 3; 4, 5, 6; 7, 8, 9];
writematrix(data, 'output.csv');
% Đọc dữ liệu từ CSV
data_read = readmatrix('output.csv');
% Đọc file có header
T = readtable('data_with_header.csv');
% Truy cập cột theo tên
column_data = T.ColumnName;
Lưu/load workspace
% Lưu biến vào file .mat
x = 1:10;
y = x.^2;
save('my_data.mat', 'x', 'y');
% Load lại
clear all; % Xóa workspace
load('my_data.mat');
% x và y được restore
Debugging và Error Handling
Sử dụng try-catch
function result = safe_divide(a, b)
try
result = a / b;
catch ME
fprintf('Error: %sn', ME.message);
result = NaN;
end
end
Breakpoint và debugging
Trong Editor, click vào số dòng để đặt breakpoint (chấm đỏ). Khi chạy code, MATLAB sẽ dừng tại đó. Dùng:
dbstep: Chạy từng dòngdbcont: Tiếp tục chạydbquit: Thoát debug mode
Tip: Dùng keyboard trong code để tạo breakpoint động. MATLAB sẽ dừng và cho phép bạn inspect biến.
Ứng Dụng Thực Tế: Giải Phương Trình Vi Phân
Giả sử bạn cần giải phương trình dao động điều hòa: d²x/dt² + ω²x = 0
% Định nghĩa hệ phương trình bậc nhất
function dxdt = harmonic_oscillator(t, x, omega)
% x(1) = vị trí
% x(2) = vận tốc
dxdt = zeros(2, 1);
dxdt(1) = x(2);
dxdt(2) = -omega^2 x(1);
end
% Giải bằng ode45
omega = 2pi; % Tần số góc
tspan = [0 10]; % Khoảng thời gian
x0 = [1; 0]; % Điều kiện ban đầu: x(0)=1, v(0)=0
[t, x] = ode45(@(t,x) harmonic_oscillator(t, x, omega), tspan, x0);
% Vẽ kết quả
figure;
plot(t, x(:,1), 'LineWidth', 2);
xlabel('Time (s)');
ylabel('Position');
title('Harmonic Oscillator Solution');
grid on;
Complexity analysis: ode45 sử dụng Runge-Kutta bậc 4-5 với adaptive step size. Độ phức tạp phụ thuộc vào độ cứng của phương trình, thường O(n) với n là số bước thời gian.
Tối Ưu Hóa Performance
Preallocate memory
% Cách chậm - không preallocate
tic;
for i = 1:10000
slow_array(i) = i^2; % MATLAB phải resize mỗi lần
end
time_slow = toc;
% Cách nhanh - preallocate
tic;
fast_array = zeros(1, 10000);
for i = 1:10000
fast_array(i) = i^2;
end
time_fast = toc;
fprintf('Slow: %.4f s, Fast: %.4f sn', time_slow, time_fast);
% Typical output: Slow: 0.0523 s, Fast: 0.0012 s
Sử dụng built-in functions
MATLAB’s built-in functions được optimize ở mức C/Fortran. Luôn ưu tiên chúng:
% Thay vì tự viết
sum_manual = 0;
for i = 1:length(x)
sum_manual = sum_manual + x(i);
end
% Dùng built-in
sum_builtin = sum(x); % Nhanh hơn nhiều
Bạn đã nắm được các khái niệm cốt lõi của lập trình MATLAB cơ bản từ cú pháp, cấu trúc điều khiển, đến kỹ thuật tối ưu. Bước tiếp theo là thực hành với các bài toán thực tế trong lĩnh vực của bạn và tham khảo MATLAB Documentation để khám phá các toolbox chuyên biệt.
Cập nhật lần cuối 09/03/2026 by Hiếu IT
