前段时间改写老师的一个计算纳米细颗粒物的C语言程序,不过运行的效率实在是太低了,工作站跑都很吃劲,晚上看了冈萨雷斯的数字图像处理意外发现了问题所在。在将C语言的程序改写成Matlab程序的时候我还是保持的写C语言的想法,上来全是for循环而忽视了Matlab的矩阵操作。
这里举的例子是冈萨雷斯的书里面的一个例子,比较的是f(x,y)=A sin(u0x+v0y),用for循环和向量化代码实现,具体如下:
function [rt,f,g] = twodsin(A,u0,v0,M,N) tic %开始时间 for r = 1:M u0x = u0*(r-1); for c = 1:N v0y = v0*(c-1); f(r, c) = A*sin(u0x+v0y); end end t1 = toc; %结束时间 tic %开始时间 r = 0:M-1; c = 0:N-1; [C,R] = meshgrid(c,r); g = A*sin(u0*R+v0*C); t2 = toc; %结束时间 rt = t1/(t2+eps);
测试代码:
[rt,f,g] = twodsin(1, 1/(4*pi), 1/(4*pi), 512, 512);
输出:
rt = 4.0483 (Intel Core i5 CPU 2.67GHz)
可以看出for循环和向量化操作的差距,冈萨雷斯书中给出的是34.2520,这里是因为电脑配置不同的缘故。
输出图像: