运行一些测试代码后的结论: 1)在您的代码中,mean2 在迭代次数大于 1000 时显得较慢的原因是因为将代码组织成函数的惩罚。 MATLAB 需要为函数创建一个作用域,并在函数调用结束时终止它 这可以从下面的测试条件中看出,我在代码中直接实现了 mean2。 2)根据@rayryeng 的评论,当数组很大时(至少在我的测试条件下),首先展开会加快计算速度。 3) sum(Ig(:),'double') 中的 'double' 参数会占用一些时间并且实际上是不必要的,因为即使没有该参数,sum 也会返回 double 数据类型。
我用来测试的代码如下:
Img = rgb2gray(imread('test2.tif')); % this is an rgb image larger than 1000x1000
Ig = Img(1:250,1:250);
n = 100000;
tic
for ii=1:n
M1 = sum(sum(Ig))/numel(Ig);
end
toc
disp(' for sum(sum(Ig))/numel(Ig) 250x250')
tic;
for ii=1:n
M2 = mean2(Ig);
end
toc
disp(' for mean2(Ig) 250x250')
tic;
for ii=1:n
M3 = sum(Ig(:),'double')/numel(Ig);
end
toc
disp(' for sum(Ig(:),''double'')/numel(Ig) 250x250')
tic;
for ii=1:n
M4 = sum(Ig(:))/numel(Ig);
end
toc
disp(' for sum(Ig(:))/numel(Ig) 250x250')
clear M1 M2 M3 M4
Ig = Img(1:500,1:500);
tic
for ii=1:n
M1 = sum(sum(Ig))/numel(Ig);
end
toc
disp(' for sum(sum(Ig))/numel(Ig) 500x500')
tic
for ii=1:n
M2 = mean2(Ig);
end
toc
disp(' for mean2(Ig) 500x500')
tic
for ii=1:n
M3 = sum(Ig(:),'double')/numel(Ig);
end
toc
disp(' for sum(Ig(:),''double'')/numel(Ig) 500x500')
tic
for ii=1:n
M4 = sum(Ig(:))/numel(Ig);
end
toc
disp(' for sum(Ig(:))/numel(Ig) 500x500')
Ig = Img(1:1000,1:1000);
tic
for ii=1:n
M1 = sum(sum(Ig))/numel(Ig);
end
toc
disp(' for sum(sum(Ig))/numel(Ig) 1000x1000')
tic
for ii=1:n
M2 = mean2(Ig);
end
toc
disp(' for mean2(Ig) 1000x1000')
tic
for ii=1:n
M3 = sum(Ig(:),'double')/numel(Ig);
end
toc
disp(' for sum(Ig(:),''double'')/numel(Ig) 1000x1000')
tic
for ii=1:n
M4 = sum(Ig(:))/numel(Ig);
end
toc
disp(' for sum(Ig(:))/numel(Ig) 1000x1000')
结果是:
经过的时间是 2.115313 秒。
对于 sum(sum(Ig))/numel(Ig) 250x250
经过的时间是 5.753932 秒。
对于 mean2(Ig) 250x250
经过的时间是 5.626373 秒。
对于 sum(Ig(:),'double')/numel(Ig) 250x250
经过的时间是 5.425690 秒。
对于 sum(Ig(:))/numel(Ig) 250x250
经过的时间是 6.349700 秒。
对于 sum(sum(Ig))/numel(Ig) 500x500
经过的时间是 6.810287 秒。
对于 mean2(Ig) 500x500
经过的时间是 6.840604 秒。
对于 sum(Ig(:),'double')/numel(Ig) 500x500
经过的时间是 6.455498 秒。
对于 sum(Ig(:))/numel(Ig) 500x500
经过的时间是 23.772897 秒。
对于 sum(sum(Ig))/numel(Ig) 1000x1000
经过的时间是 22.071418 秒。
对于 mean2(Ig) 1000x1000
经过的时间是 21.862069 秒。
对于 sum(Ig(:),'double')/numel(Ig) 1000x1000
经过的时间是 21.498514 秒。
对于 sum(Ig(:))/numel(Ig) 1000x1000