【发布时间】:2013-09-30 13:45:25
【问题描述】:
我有几个问题。请忍受我。我写了一个程序并试图优化它。我只发布我认为可以进一步优化的代码 sn-ps。
1. 首先,我尝试计算图像的梯度。我之前使用过 MATLAB 的 gradient operator,但发现它很慢。所以我写下了我自己的代码。请在my gradient code here! 找到我的代码
我在 MATLAB 上运行分析器,发现我的程序仍然存在一些瓶颈。我在这里张贴一张图片:
如您所见,我使用了两个额外的矩阵 A 和 B 两次,用于计算水平和垂直方向的梯度。真的有必要吗?如果不使用额外的矩阵 A 和 B 就不能将操作集成到第 5 行和第 8 行中。去除额外的矩阵 A 和 B 会使 我的代码运行得更快吗?
2. 其次,我需要在我的代码中使用拉普拉斯算子,发现它是我程序的瓶颈之一。我已经阅读了 matlab 文档并阅读了链接 Discrepancy between Matlab del2 and Matlab gradient of gradient 和 Understanding DEL2 function in Matlab in order to code it in C++。
然后我检查了 del2 的配置文件并找到了这个。 。我的问题是,在这种情况下,子函数 parse_inputs 和 ipermut 的功能是什么? 需要注意的是,我正在使用一个尺寸始终大于 64X64 的图像矩阵。
我阅读了 permute 的解释,它说“Permute 以便 del2 始终沿列使用。”。实际上是什么意思?我在某处读到 MATLAB 使用列主要格式。谁能解释一下这是什么意思?
关于 parse_inputs 子功能,我阅读了说明
%PARSE_INPUTS
% [ERR,F,LOC,CFLAG] = PARSE_INPUTS(F,V) returns the spacing LOC
% along the x,y,z,... directions and a column vector flag CFLAG. ERR
% will be true if there is an error.
我不知道这个函数是做什么的。请问谁能解释一下?
3。我还尝试为matlab写下我自己的del2函数,以使其更快,但奇怪的是我只能处理内部点。 MATLAB 中的实现对于 del2 是否正确?为什么它在边界点进行外推?
拉普拉斯算子的基础不应该总是它应该保持相等吗?
laplacian = del2(image);
[x, y] = gradient(image);
[xx, xy] = gradient(x);
[yx, yy] = gradient(y);
laplacian = xx + yy;
此代码取自 Please check code。我阅读了那里的所有帖子,但解释并不令我满意。请你解释一下为什么上面的代码没有给出相同的输出?
感谢大家阅读这组冗长而无聊的问题。任何帮助将不胜感激。如果有人有问题,我会将问题分开并单独发布。就这么说吧!
提前致谢!
编辑:经过一整天的努力,终于设法删除了违规矩阵A和B。我正在写下以下代码:
function [dx dy] = gradient_my_code(I)
dx=[I(:,2)-I(:,1) (I(:,3:end)-I(:,1:end-2))./2 I(:,end)-I(:,end-1)];
dy=[I(2,:)-I(1,:) ; (I(3:end,:)-I(1:end-2,:))./2 ; I(end,:)-I(end-1,:)];
出于计时目的我这样做了:
xaxis = [10,20,30,40,50,60,70,80,90,100,200,300,400,500,600,700,800,900,1000,2000,3000,4000,5000];
n1 = zeros(1,length(xaxis));
n2 = zeros(1,length(xaxis));
for i=1:length(xaxis);
x=xaxis(i);
u=magic(x);
tic
[dx dy] = gradient(u);
n1(i)=toc;
tic
[dx dy] = gradient_my_code(u);
n2(i)=toc;
end
plot(n1,'r','LineWidth',3);
hold on;
plot(n2,'b','LineWidth',3);
hold off;
我绘制了速度比较。请检查,伙计们给你的cmets。
【问题讨论】:
标签: matlab optimization image-processing matrix