背景故事:
这是一个旧的脚本,我需要比较同一对象的两个稍微不同的图像来获取相机本身的数据。我用八度写了这个脚本,后来我发现matlab运行得更快,因为比我用matlab代替八度更快。我最近决定再次检查八度,我仍然得到了1:1000的速比。
问题:
剧本:
color_depth = 8;
number_of_colors = 3;
number_of_grey_levels = 2^color_depth;
Double_Distribution_0 =zeros(number_of_grey_levels,number_of_grey_levels,number_of_colors);
frame_A = 1+int16(imread('Path\image_A.tif'));
frame_1 = 1+int16(imread('Path\image_1.tif'));
[height,width]=size(frame_A(:,:,1));
number_of_pixels = width*height;
for k = 1:number_of_colors
tic
for i = 1:height
for j = 1:width
Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k) = 1 + Double_Distribution_0(frame_1(i,j,k),frame_A(i,j,k),k);
end
end
toc
end发布于 2013-01-02 20:25:48
1)是的,您可以像Shai所解释的那样将代码向量化。但是,请注意,他的解决方案缺少frame_1和frame_A上的颜色索引。
for k=1:number_of_colors
f_1 = frame_1(:,:,k);
f_A = frame_A(:,:,k);
Double_Distribution_0(:,:,k) = accumarray( {f_1(:), f_A(:)}, 1,...
[number_of_grey_levels, number_of_grey_levels] );
end2) Matlab比Octave快很多倍的原因是,从6.5版开始,Matlab就使用了JIT编译器来大大加快简单的for-循环等。如果您不熟悉JIT是什么,请查看这里。据我所知,Octave还在为自己的JIT工作,但我认为还需要一段时间:-)。
您的Octave版本是否会受益于上述代码取决于他们是如何用Octave编写的。我希望会有很大的好处。
发布于 2012-12-25 06:19:17
如果我正确理解你的代码,它所做的是建立一个二维直方图的联合颜色分布的两个框架。
for k=1:number_of_colors
Double_Distribution_0(:,:,k) = accumarray( {frame_1(:), frame_A(:)}, 1,...
[number_of_grey_levels, number_of_grey_levels] );
end发布于 2013-01-25 14:57:32
谢谢你们两位的快速反应。
不知何故,语法的一部分不起作用,但当我将其缩短为:
Double_Distribution_0(:,:,k) = accumarray({frame_1(:,:,k),frame_A(:,:,k)},1);我得到了我想要的结果(将结果与旧代码进行比较),在这种情况下,八度下的运行时间仅比matlab高2倍。
https://stackoverflow.com/questions/14026607
复制相似问题