MATLAB/Octave — Scientific Computing
Overview
MATLAB is a numerical computing environment optimized for matrix operations and scientific computing. GNU Octave is a free, open-source alternative with high compatibility. All code examples use MATLAB syntax that runs on both platforms.
When to Use
- Performing matrix operations and linear algebra (eigenvalues, SVD, least squares)
- Solving ordinary and partial differential equations numerically
- Signal processing (FFT, filtering, spectral analysis)
- Creating 2D/3D scientific visualizations and publication figures
- Numerical optimization and root finding
- Statistical analysis and curve fitting
- Batch processing of experimental data files
- For Python-based numerical computing, use numpy/scipy instead
- For statistical modeling with inference, use statsmodels instead
Prerequisites
# GNU Octave (free, open-source)
# macOS
brew install octave
# Ubuntu/Debian
sudo apt install octave
# Running scripts
octave script.m # Octave
matlab -nodisplay -nosplash -r "run('script.m'); exit;" # MATLAB
Note: MATLAB requires a commercial license from MathWorks. GNU Octave is free and runs most MATLAB scripts without modification. Key Octave differences: supports # comments, ++/+= operators; some MATLAB toolbox functions unavailable.
Quick Start
% Load data, fit, and plot
x = linspace(0, 2*pi, 100);
y = sin(x) + 0.1 * randn(size(x));
p = polyfit(x, y, 5);
y_fit = polyval(p, x);
figure;
plot(x, y, 'bo', x, y_fit, 'r-', 'LineWidth', 2);
xlabel('x'); ylabel('y');
legend('Data', 'Polynomial fit');
title('Curve Fitting Example');
saveas(gcf, 'fit_result.png');
Core API
1. Matrix Operations
MATLAB operates fundamentally on matrices and arrays.
% Create matrices
A = [1 2 3; 4 5 6; 7 8 9]; % 3x3 matrix
v = linspace(0, 1, 100); % 100 evenly spaced points
I = eye(3); % Identity matrix
R = rand(3, 3); % Uniform random
N = randn(3, 3); % Normal random
% Operations
B = A'; % Transpose
C = A * B; % Matrix multiplication
D = A .* B; % Element-wise multiplication
x = A \ [1; 2; 3]; % Solve Ax = b (preferred over inv(A)*b)
fprintf('Solution: [%.2f, %.2f, %.2f]\n', x);
% Indexing and manipulation
A = magic(5);
sub = A(1:3, 2:4); % Submatrix (rows 1-3, cols 2-4)
row = A(2, :); % Entire row 2
col = A(:, 3); % Entire column 3
A(A < 5) = 0; % Logical indexing
% Concatenation
C = [A; ones(1, 5)]; % Vertical (add row)
D = [A, zeros(5, 1)]; % Horizontal (add column)
fprintf('Size: %d x %d\n', size(C));
2. Linear Algebra
A = [4 1 2; 1 3 1; 2 1 5];
% Eigendecomposition
[V, D] = eig(A); % V: eigenvectors, D: diagonal eigenvalues
fprintf('Eigenvalues: %.2f, %.2f, %.2f\n', diag(D));
% Singular value decomposition
[U, S, V] = svd(A);
fprintf('Singular values: %.2f, %.2f, %.2f\n', diag(S));
% Matrix decompositions
[L, U, P] = lu(A); % LU with pivoting
[Q, R] = qr(A); % QR decomposition
R_chol = chol(A); % Cholesky (symmetric positive definite)
% Condition number and rank
fprintf('Condition number: %.2f\n', cond(A));
fprintf('Rank: %d\n', rank(A));
3. Plotting and Visualization
% 2D line plots
x = 0:0.1:2*pi;
figure;
plot(x, sin(x), 'b-', 'LineWidth', 2); hold on;
plot(x, cos(x), 'r--', 'LineWidth', 2);
xlabel('x'); ylabel('y');
title('Trigonometric Functions');
legend('sin(x)', 'cos(x)');
grid on;
saveas(gcf, 'trig.png');
% 3D surface plot
[X, Y] = meshgrid(-2:0.1:2, -2:0.1:2);
Z = X.^2 + Y.^2;
figure;
surf(X, Y, Z);
colorbar; xlabel('X'); ylabel('Y'); zlabel('Z');
title('Paraboloid');
print('-dpdf', 'surface.pdf');
% Multi-panel figure
figure;
subplot(2, 2, 1); plot(x, sin(x)); title('sin');
subplot(2, 2, 2); plot(x, cos(x)); title('cos');
subplot(2, 2, 3); bar([1 3 2 5 4]); title('Bar');
subplot(2, 2, 4); histogram(randn(1000, 1), 30); title('Histogram');
saveas(gcf, 'panels.png');
4. Data Import/Export
% CSV / tabular data
T = readtable('data.csv');
M = readmatrix('data.csv');
fprintf('Table: %d rows x %d cols\n', height(T), width(T));
% Write data
writetable(T, 'output.csv');
writematrix(M, 'output.csv');
% MAT files (MATLAB native binary)
A = rand(100, 100);
save('data.mat', 'A'); % Save variable
S = load('data.mat', 'A'); % Load specific variable
% Images
img = imread('image.png');
fprintf('Image size: %d x %d x %d\n', size(img));
imwrite(img, 'output.jpg');
5. Statistics and Data Analysis
data = randn(1000, 1) * 5 + 50;
% Descriptive statistics
fprintf('Mean: %.2f, Std: %.2f, Median: %.2f\n', mean(data), std(data), median(data));
fprintf('Min: %.2f, Max: %.2f\n', min(data), max(data));
% Correlation and covariance
X = randn(100, 3);
R = corrcoef(X);
fprintf('Correlation matrix:\n');
disp(R);
% Linear regression (polyfit)
x = (1:50)';
y = 2.5 * x + 10 + randn(50, 1) * 5;
p = polyfit(x, y, 1);
fprintf('Slope: %.2f, Intercept: %.2f\n', p(1), p(2));
% Moving statistics
y_smooth = movmean(y, 5);
6. Differential Equations
% First-order ODE: dy/dt = -2y, y(0) = 1
f = @(t, y) -2 * y;
[t, y] = ode45(f, [0 5], 1);
figure; plot(t, y, 'b-', 'LineWidth', 2);
xlabel('Time'); ylabel('y(t)');
title('Exponential Decay');
fprintf('Final value: %.4f (expected: %.4f)\n', y(end), exp(-10));
% Second-order ODE: y'' + 0.5y' + 4y = 0 (damped oscillator)
% Convert to system: y1' = y2, y2' = -0.5*y2 - 4*y1
f = @(t, y) [y(2); -0.5*y(2) - 4*y(1)];
[t, y] = ode45(f, [0 20], [1; 0]);
figure; plot(t, y(:,1), 'b-', 'LineWidth', 2);
xlabel('Time'); ylabel('Displacement');
title('Damped Oscillator');
7. Signal Processing
% Generate signal with two frequencies
fs = 1000; % Sampling frequency
t = 0:1/fs:1-1/fs;
signal = sin(2*pi*50*t) + 0.5*sin(2*pi*120*t) + randn(size(t))*0.2;
% FFT
Y = fft(signal);
f = (0:length(Y)-1) * fs / length(Y);
figure;
plot(f(1:length(f)/2), abs(Y(1:length(Y)/2)));
xlabel('Frequency (Hz)'); ylabel('|FFT|');
title('Frequency Spectrum');
% FIR low-pass filter (keep < 80 Hz)
b = fir1(50, 80/(fs/2)); % 50th order, cutoff 80 Hz
filtered = filter(b, 1, signal);
figure;
plot(t, signal, 'b', t, filtered, 'r', 'LineWidth', 1.5);
legend('Original', 'Filtered');
title('Low-pass Filtering');
8. Functions and Programming
% Anonymous functions
f = @(x) x.^2 + 2*x + 1;
fprintf('f(5) = %d\n', f(5)); % 36
% Function files (save as myfunc.m)
% function [rmse, r2] = myfunc(y_true, y_pred)
% residuals = y_true - y_pred;
% rmse = sqrt(mean(residuals.^2));
% ss_res = sum(residuals.^2);
% ss_tot = sum((y_true - mean(y_true)).^2);
% r2 = 1 - ss_res / ss_tot;
% end
% Struct for organized data
experiment.name = 'Trial 1';
experiment.data = rand(10, 3);
experiment.params = struct('temp', 37, 'pH', 7.4);
fprintf('Experiment: %s, %d samples\n', experiment.name, size(experiment.data, 1));
Key Concepts
Vectorization
MATLAB is optimized for vectorized operations. Avoid explicit loops when possible:
% Slow (loop)
n = 1e6;
y = zeros(1, n);
tic;
for i = 1:n
y(i) = sin(i/1000);
end
t_loop = toc;
% Fast (vectorized)
tic;
y = sin((1:n)/1000);
t_vec = toc;
fprintf('Loop: %.3fs, Vectorized: %.3fs, Speedup: %.1fx\n', t_loop, t_vec, t_loop/t_vec);
Element-wise vs Matrix Operations
| Operator | Matrix | Element-wise | |----------|--------|-------------| | Multiply | A B | A . B | | Divide | A / B (right div) | A ./ B | | Power | A ^ n (matrix power) | A .^ n |
ODE Solver Selection
| Solver | Order | When to Use | |--------|-------|-------------| | ode45 | 4-5 | Default. Most non-stiff problems | | ode23 | 2-3 | Rough solutions, faster per