基礎應用
1. 基本數學運算函數
函數 | 功能 | 示例 |
---|---|---|
abs(x) | 絕對值 | abs(-3) → 3 |
sqrt(x) | 平方根 | sqrt(16) → 4 |
exp(x) | 指數函數 exe^xex | exp(1) → 2.7183 |
log(x) | 自然對數 | log(exp(3)) → 3 |
log10(x) | 常用對數(以 10 為底) | log10(100) → 2 |
sin(x), cos(x), tan(x) | 三角函數(弧度制) | sin(pi/2) → 1 |
asin(x), acos(x), atan(x) | 反三角函數 | asin(1) → 1.5708 |
round(x) | 四舍五入 | round(3.6) → 4 |
floor(x) | 向下取整 | floor(3.6) → 3 |
ceil(x) | 向上取整 | ceil(3.2) → 4 |
mod(a,b) | 取模 | mod(7,3) → 1 |
rem(a,b) | 余數 | rem(7,3) → 1 |
sign(x) | 符號函數(-1, 0, 1) | sign(-5) → -1 |
2. 矩陣與數組操作
函數 | 功能 | 示例 |
---|---|---|
size(A) | 返回矩陣維度 | size([1 2; 3 4]) → [2 2] |
length(A) | 向量長度 / 最大維度長度 | length([1 2 3 4]) → 4 |
numel(A) | 元素總數 | numel(eye(3)) → 9 |
reshape(A,m,n) | 改變矩陣形狀 | reshape(1:6,2,3) → 2x3 矩陣 |
transpose(A) / A.' | 轉置(不共軛) | [1+2i 3; 4 5]' |
ctranspose(A) / A' | 共軛轉置 | [1+2i 3; 4 5]' |
diag(A) | 提取/生成對角矩陣 | diag([1 2 3]) |
triu(A) | 上三角矩陣 | triu(magic(3)) |
tril(A) | 下三角矩陣 | tril(magic(3)) |
inv(A) | 矩陣求逆 | inv([1 2; 3 4]) |
pinv(A) | 廣義逆(偽逆) | pinv([1 2; 3 4]) |
det(A) | 行列式 | det([1 2; 3 4]) |
rank(A) | 矩陣秩 | rank([1 2; 2 4]) → 1 |
eig(A) | 特征值與特征向量 | [V,D] = eig([1 2; 2 1]) |
svd(A) | 奇異值分解 | [U,S,V] = svd(rand(3)) |
3. 統計與線性代數
函數 | 功能 | 示例 |
---|---|---|
mean(A) | 平均值 | mean([1 2 3]) → 2 |
median(A) | 中位數 | median([1 3 2]) → 2 |
var(A) | 方差 | var([1 2 3]) → 1 |
std(A) | 標準差 | std([1 2 3]) → 1 |
sum(A) | 求和 | sum([1 2 3]) → 6 |
prod(A) | 連乘 | prod([1 2 3]) → 6 |
max(A) | 最大值 | max([3 7 2]) → 7 |
min(A) | 最小值 | min([3 7 2]) → 2 |
corrcoef(A,B) | 相關系數 | corrcoef([1 2 3],[2 4 6]) |
4. 繪圖與可視化
函數 | 功能 | 示例 |
---|---|---|
plot(x,y) | 二維折線圖 | plot(0:0.1:2*pi, sin(0:0.1:2*pi)) |
scatter(x,y) | 散點圖 | scatter(rand(10,1), rand(10,1)) |
bar(y) | 柱狀圖 | bar([1 3 2]) |
histogram(A) | 直方圖 | histogram(randn(1000,1)) |
pie(A) | 餅圖 | pie([2 3 4]) |
surf(X,Y,Z) | 三維曲面圖 | surf(peaks) |
mesh(X,Y,Z) | 三維網格圖 | mesh(peaks) |
contour(X,Y,Z) | 等高線圖 | contour(peaks) |
imshow(I) | 顯示圖像 | imshow(imread('cameraman.tif')) |
imagesc(A) | 可視化矩陣 | imagesc(magic(5)) |
5. 文件輸入輸出
函數 | 功能 | 示例 |
---|---|---|
load('file.mat') | 讀取 .mat 文件 | load('data.mat') |
save('file.mat','A') | 保存變量 | save('result.mat','A') |
csvread('file.csv') | 讀取 CSV | csvread('data.csv') |
csvwrite('file.csv',A) | 寫入 CSV | csvwrite('output.csv',A) |
xlsread('file.xlsx') | 讀取 Excel | [num,text,raw] = xlsread('data.xlsx') |
xlswrite('file.xlsx',A) | 寫 Excel | xlswrite('out.xlsx',rand(5)) |
fopen, fclose, fscanf, fprintf | 文本文件操作 | fid=fopen('test.txt','w'); fprintf(fid,'%f',pi); fclose(fid); |
6. 圖像處理常用函數
函數 | 功能 | 示例 |
---|---|---|
imread('file') | 讀入圖像 | I = imread('cameraman.tif') |
imwrite(I,'file') | 保存圖像 | imwrite(I,'out.png') |
rgb2gray(I) | 彩色轉灰度 | Igray = rgb2gray(I) |
imresize(I, scale) | 圖像縮放 | imresize(I,0.5) |
imrotate(I, angle) | 圖像旋轉 | imrotate(I,45) |
imcrop(I, rect) | 裁剪圖像 | imcrop(I,[50 50 100 100]) |
edge(I,'canny') | 邊緣檢測 | BW = edge(I,'canny') |
fft2(I) | 二維傅里葉變換 | F = fft2(I) |
ifft2(F) | 逆變換 | I2 = ifft2(F) |
7. 信號處理常用函數
函數 | 功能 | 示例 |
---|---|---|
fft(x) | 快速傅里葉變換 | fft([1 2 3 4]) |
ifft(X) | 逆 FFT | ifft(fft([1 2 3 4])) |
filter(b,a,x) | IIR/FIR 濾波 | y = filter([1 -1],[1],x) |
conv(x,h) | 卷積 | conv([1 2 3],[1 1]) |
xcorr(x,y) | 互相關 | xcorr([1 2 3],[1 1]) |
spectrogram(x) | 時頻分析 | spectrogram(sin(0:0.01:10)) |
8. 符號運算(Symbolic Math Toolbox)
函數 | 功能 | 示例 |
---|---|---|
syms x | 定義符號變量 | syms x y |
diff(f,x) | 符號微分 | diff(sin(x),x) → cos(x) |
int(f,x) | 不定積分 | int(x^2,x) → x^3/3 |
int(f,a,b) | 定積分 | int(x^2,0,1) → 1/3 |
limit(f,x,a) | 極限 | limit(sin(x)/x,x,0) → 1 |
solve(eq,x) | 解方程 | solve(x^2-4==0,x) → ±2 |
taylor(f,x,a,n) | 泰勒展開 | taylor(exp(x),x,0,5) |
高級應用
1.進階數據結構與類型
-
Table / timetable / categorical
table
,readtable
,writetable
:面向列的數據表,適合異構列(數值、字符串、類別)。timetable
:帶時間索引的表,方便時序數據操作(retime
,synchronize
)。categorical
:節省內存并提高分組/比較效率,適用于離散標簽。
T = readtable('data.csv'); TT = table2timetable(T,'RowTimes','Time'); TT2 = retime(TT,'daily','mean');
-
Sparse 矩陣
sparse
,nnz
,spy
,用于大規模稀疏系統;線性求解優先用\
(背后自動選最優方法),或eigs
,chol
(稀疏 Cholesky)。
A = sparse(i,j,v,m,n); x = A\b; % 高效稀疏求解
-
Containers & 高級集合
containers.Map
(鍵值表)、datetime
/duration
、string
(比 char 更現代)、cell
/struct
。
2.數值線性代數與穩定性技巧
-
優先使用高層函數(
A\b
)而非顯式inv(A)
。 -
常用穩定/高效求解器:
\
(mldivide
)、lsqminnorm
(欠定最小范數)、linsolve
(可傳選項)、chol
/cholupdate
、lu
、qr
、eigs
。
-
SVD/秩相關:對病態問題用
svd
或svds
分析奇異值分布,做截斷正則化(TSVD)。 -
正則化 & 數值穩定化:
Tikhonov
(添加lambda*I
)、pinv
(偽逆)、ridge
(統計工具箱)。
3. 性能優化與向量化(最影響速度的點)
-
預分配:先
zeros
,nan
,cell
,避免動態擴容。A = zeros(1,1e6); for k=1:1e6, A(k)=k; end
-
向量化替代循環:盡量用矩陣運算、邏輯索引、
bsxfun
(舊),現在優先隱式擴展(implicit expansion)。% loop -> vectorized % for i: y(i)=a(i)+b; y = a + b; % 隱式擴展 / 向量運算
-
高效索引技巧:邏輯索引、
find
,用accumarray
做分組統計替代循環。 -
減少臨時變量 / 內存峰值:鏈式運算可能產生臨時大數組,必要時分步并
clear
臨時結果。 -
內存查看與管理:
whos
,memory
(Windows)查看內存分配;大數組用single
或gpuArray
(見下)減小占用。 -
JIT-friendly 代碼:避免在循環中使用復雜動態結構(動態字段、增長的 cell),保持數組類型一致。
4.并行計算與 GPU 加速
-
多核并行(本地/集群)
parpool
,parfor
:并行 for;適合獨立迭代任務。spmd
:分布式并行,處理分塊數據或 Message Passing。parfeval
,backgroundPool
:異步執行(注意你不能讓我后臺執行——這里僅說明)。
parpool(4); parfor i=1:Nout(i) = heavyFunc(i); end
-
GPU 加速(需要 Parallel Computing Toolbox & GPU 支持)
gpuArray
,gather
,arrayfun
(GPU 上的 elementwise 函數),大多數線性代數/FFT/conv 支持 GPU 版本。
A_gpu = gpuArray(rand(1000)); B_gpu = A_gpu * A_gpu; B = gather(B_gpu);
-
處理大數據:
tall
arrays(惰性評估)、datastore
(分塊讀入 CSV/Datastore)、mapreduce
(大數據 MapReduce 風格)。ds = datastore('bigdata/*.csv'); tt = tall(ds); meanVal = mean(tt.Value); % 在本地機器/cluster 上可擴展
5.I/O、數據持久化與大文件處理
-
高效讀寫:
matfile
(增量讀寫.mat
)、memmapfile
(二進制內存映射)、datastore
/tall
。m = matfile('large.mat','Writable',true); chunk = m.A(1:1000,:); % 不會把整個文件載入內存
-
表格/文本:
readtable
/writetable
/detectImportOptions
用于自動推斷與自定義列類型。 -
圖像/視頻:
imread
,imwrite
,VideoReader
,VideoWriter
,對大視頻做分幀處理并行化。
6.繪圖、可視化與發布
-
現代繪圖 API:
tiledlayout
替代subplot
,uifigure
+uicontrol
用于交互式 GUI(App Designer)。 -
導出高質量圖:
exportgraphics
,print
,saveas
,常配-r300
或-r600
輸出高分辨率圖。 -
交互與動畫:
plotly
(第三方)、getframe
/movie
,animatedline
(實時時繪圖)。 -
三維/體數據:
trisurf
,isosurface
,volshow
(App),pcshow
(點云)、pcread
/pcwrite
。tiledlayout(1,2); ax1 = nexttile; plot(ax1,x,y); ax2 = nexttile; imagesc(ax2,rand(100)); exportgraphics(gcf,'fig.png','Resolution',300);
7.圖像/信號處理常用進階函數
- 圖像(Image Processing Toolbox):
imfilter
,imgaussfilt
,imbinarize
,imopen
/imclose
,regionprops
,bwconncomp
。 - 特征與匹配(Computer Vision Toolbox):
detectSURFFeatures
,detectHarrisFeatures
,extractFeatures
,matchFeatures
。 - 頻域/濾波(Signal Processing Toolbox):
designfilt
,filtfilt
,butter
,spectrogram
,welch
。
8.調試、性能剖析與測試
-
調試工具:斷點、
dbstop if error
,keyboard
,disp
/fprintf
。 -
分析性能:
profile on; ...; profile viewer
,關注 CPU hotspots 與內存分配。 -
單元測試:
matlab.unittest
框架(測試類、斷言、測試套件、mock)。import matlab.unittest.TestCase classdef MyTest < TestCasemethods(Test)function testSimple(tc)tc.verifyEqual(1+1,2);endend end
-
代碼覆蓋率:使用
matlab.unittest.TestRunner
的覆蓋率插件檢查測試覆蓋度。
9.代碼組織與工程化
-
函數與包:使用
+package
命名空間和@class
(類)組織大型項目;addpath
,savepath
管理路徑。 -
面向對象:值類(默認) vs 句柄類(繼承
handle
),注意句柄類的共享語義與內存管理。 -
函數接口設計:使用
inputParser
或arguments
(新語法,R2019b 及以后)做參數檢查和默認值。function out = myfun(a,b,varargin)p = inputParser;addOptional(p,'scale',1,@isnumeric);parse(p,varargin{:});s = p.Results.scale;out = a + b*s; end
-
文檔與示例:在
.m
文件頂部用 help 注釋,doc
自動生成幫助文檔;使用 Live Script(.mlx
)寫可交互教程。
10.與外部語言/工具互操作
-
MEX / C / C++:用
mex
編譯 C/C++ 代碼以加速關鍵內核(注意內存管理與類型轉換)。 -
Python 集成:
py
命名空間直接調用 Python,或用pyrun
。py.numpy.array([1,2,3]);
-
Java / .NET:MATLAB 可直接調用 Java 類或編譯為 Java 包。
-
部署:
MATLAB Compiler
打包為獨立應用或庫(注意 license 要求),Simulink Coder
生成 C 代碼嵌入設備。
11.常見陷阱與實戰建議
- 不要用
for
盲目替代向量化,在某些含大量復雜邏輯的情形下parfor
+ preallocation 更適合。 - 避免
eval
:維護性差且慢,用function handles
或str2func
替代。 - 注意隱式類型轉換:字符串、char、cell 和 categorical 的混用會引發奇怪錯誤。
- 隨機性可復現:
rng(seed,'twister')
固定種子。 - I/O 性能:對重復讀寫大數組采用
matfile
或二進制格式減少開銷。 - 版本差異:
bsxfun
在舊版必須用,新版(R2016b 以后)支持隱式擴展;使用前確認目標用戶的 MATLAB 版本。
12.示例:把一個循環向量化(實用示例)
原始循環:
for i=1:nC(i,:) = A(i,:) + B(i,:);
end
向量化后:
C = A + B; % 直接矩陣運算(隱式擴展或逐元素相加)
13.小結與進一步學習路徑
-
優先掌握:向量化、預分配、內存管理、
parfor
、gpuArray
、table/timetable
、matfile/datastore
。 -
建議練習:
- 用
profile
找到瓶頸并向量化; - 將耗時子函數改寫為 MEX 或 GPU;
- 學會用
tall
/datastore
處理超內存數據。
- 用