更好的MATLAB代码, 你不知道的(2)
1.bsxfun
对两个数组应用按元素运算启用隐式扩展
优点:
- bsxfun隐式地处理数组的复制,从而避免内存分配
- bsxfun支持多线程
C = bsxfun(fun, A, B)
2.使用Profiler
Profiler用来帮助分析程序
profile on %开启Profiler
profile clear %清楚Profiler状态
% 程序
profile report %查看Profiler结果
profile off %关闭Profiler
3.预先分配内存
n = 1000
% 什么都不写 good
% y = zeros(n, n); better
% y(n, n) = 0; best
tic;
for i = 1:n
for j = 1:n
y(i, j) = exp(i + j);
end
end
t = toc;
4.向量化或矩阵化
MATLAB在矩阵运算上很快很快,向量是
1
×
n
1 \times n
1×n或
n
×
1
n \times 1
n×1维矩阵
优点:
- 向量化的代码更短
- 更少的程序错误
- 运行地更快
tic;
%% 例子1 good
y(n, n) = 0;
for i = 1:n
for j = 1:n
y(i, j) = exp(i + j);
end
end
%% 例子2 better
[I, J] = meshgrid(1:n, 1:n);
IJ = I + J;
Y = exp(IJ);
t = toc;
5.解 A x = b Ax=b Ax=b
x = inv(A) * b; % good
x = A\b; % better
6.善用稀疏矩阵
7.原地计算
y = x.*x % good
x = x.*x % better
8.正确的数据类型
img_CannyEdge = edge(img_Double, 'canny') % good
img_CannyEdge = edge(img_Uint8, 'canny') % better
9.MATLAB主要按列来组织数据
n = 1000;
A = randn(n, n);
tic;
for i = 1:n
A(i, :) = 0; % 行先 good
A(:, j) = 0; % 列先 better
end
t = toc;
10.复制和写
tic;
%% good
B = A;
B(1, 1, 1) = 0;
%% better
A(1, 1, 1) = 0;
B =A;
t = toc;