经过一些编程训练后我发现
for
比使用函数的时间快,且可能内存不会过早的溢出do while
与while(){}
比for
的时间快tic;function;toc
计时的时间快%对比sinfun1的执行时间 f(x)=sin(x/(100*pi))
function y = sinfun1(M)
x = 0 : M - 1 ;
for k = 1 : numel(x)
y(k) = sin(x(k) / (100*pi));
end
%命令行
>> tic; sinfun1(100); toc
>>> M = 100;
>> f = @() sinfun1(M);
>> timeit(f)
2.预分配数组比不使用预分配数组的时间快
%执行f(x)=sin(x/(100*pi))公式,对比使用预分配数组的函数 sinfun2 与没有使用预分配数组的函数 sinfun1,
其区别仅仅在于 y=zeros(1, numel(x)); 语句的使用
sinfun1.m
function y = sinfun1(M)
x = 0 : M - 1 ;
for k = 1 : numel(x)
y(k) = sin(x(k) / (100*pi));
end
sinfun2.m
function y = sinfun2(M)
x = 0 : M-1;
y=zeros(1, numel(x));
for k = 1:numel(x)
y(k) = sin(x(k) / (100*pi));
end
%命令行
>> timeit(@() sinfun1(20000))
>> timeit(@() sinfun2(20000))
3.向量化循环比预分配数组的时间快
%执行f(x)=sin(x/(100*pi))公式,对比使用预分配数组的函数 sinfun2 与使用向量化数组的函数 sinfun3
sinfun2.m
function y = sinfun2(M)
x = 0 : M-1;
y=zeros(1, numel(x));
for k = 1:numel(x)
y(k) = sin(x(k) / (100*pi));
end
sinfun3.m
function y =sinfun3(M)
x = 0 : M-1;
y = sin(x./(100/pi));
%命令行
>> timeit(@() sinfun2(20000))
>> timeit(@() sinfun3(20000))
4.将数字当作矩阵向量化处理比使用for
的时间快
twodsin1.m
%根据公式 f(x,y)=Asin(u0x+v0y)使用for来创建一副合成图像
function f = twodsin1(A, u0, v0, M, N)
f = zeros(M,N);
for c= 1 : N
v0y = v0 * (c-1);
for r = 1 : M
u0x = u0*( r - 1 );
f(r, c) = A * sin(u0x+v0y);
end
end
%命令行
timeit(@() twodsin1(1, 1/(4*pi), 1/(4*pi), 512, 512))
twodsin2.m
%根据公式 f(x,y)=Asin(u0x+v0y)使用向量化来创建一副合成图像
function f = twodsin2(A, u0, v0, M, N)
r = 0 : M -1;
c = 0 : N-1;
[C , R] = meshgrid(c,r);
f = A*sin(u0*R+v0*C);
%命令行
timeit(@() twodsin2(1, 1/(4*pi), 1/(4*pi), 512, 512))
!! 当然不排除特殊情况,可能与算法的好坏有关。