【发布时间】:2014-03-25 05:41:21
【问题描述】:
大家好,我正在从事图像处理工作,并在 MATLAB 中编写了一小段代码。代码很慢。
我在这里给出我的代码 sn-p
for i=1:10
//find c1,c2,c3
//c1 c2 and c3 change at each iteration
u = (1./((abs(P-c1))^m) + 1./((abs(P-c2))^m) + 1./((abs(P-c3))^m));
u1 = 1./((abs(P-c1))^m)./u;
u2 = 1./((abs(P-c2))^m)./u;
u3 = 1./((abs(P-c3))^m)./u;
end
让我在这里解释一下变量:
P,u,u1,u2 and u3 are all matrices of size 512x512
c1,c2 and c3 are constants of dimension 1x1
m is a constant with value = 2
我想在循环中重复此操作(比如 10 次)。但是我的代码很慢。
分析器的结果如下:
程序的总运行时间为 4.6 秒。然而,上面列出的四个步骤本身需要大约 80% 的时间。
所以我想让我的代码运行更快。 我的第一次编辑
我修改后的代码sn-p
for i=1:10
//find c1 and c2
//c1 and c2 changes at each iteration
a=((abs(P-c1))^m);
b=((abs(P-c2))^m);
c=((abs(P-c3))^m);
x=1./a; y=1./b; z=1./c;
u = (x + y + z);
u1 = x./u;
u2 = y./u;
u3 = z./u;
end
现在程序计算上述步骤的计算时间为 2.47 秒:
所以这比我的第一种方法快得多。
第二次修改 对于 i=1:10 //找到c1,c2,c3 //c1 c2 和 c3 在每次迭代时改变
a=(P-c1).*(P-c1);
b=(P-c2).*(P-c2);
c=(P-c3).*(P-c3);
x=1./a; y=1./b; z=1./c;
u = (x + y + z);
u1 = x./u;
u2 = y./u;
u3 = z./u;
end
现在程序计算时间为 0.808 秒。
上面描述的四个步骤计算上面的速度非常快。
我相信它可以做得更快。你们能帮我进一步优化 我的代码。 这对于大于 512 的矩阵(例如 1024 、 2048 等)非常有用。
提前致谢。
【问题讨论】:
-
为什么要使用图像处理标签?性能标签更有意义。
-
对,但是如果在帖子中,则没有图像处理相关的问题。最好不要提及。这有助于让更多人参与该领域。
-
@roni 你说你在一个循环中运行了四行 10 次。那么这 10 个 for 循环中发生了什么变化。所有的矩阵,即
P,u,u1,u2 and u3都在变化吗?我的第二个问题是,你有这 10 个矩阵吗?如果您可以发布整个 for 循环会更好。 -
@roni 我不能对这么多信息发表太多评论。原因如下: 1、如果找到
c1, c2, c3的过程是不可向量化的,那么目前也做不了多少。 2. 如果可以向量化,那么实际上我们可以使用c1,c2,c3作为10x1数组并同时计算所有10 个值的u,u1,u2,u3。 3. 我能给你的最后一个建议是,尝试将其转换为parfor循环,看看是否有什么不同。 -
您的优化不等同于您的原始代码。 A^m 是矩阵幂。 A^2 是 AA,就像在矩阵乘法中一样。但是,您的新代码编写的是 A.*A,它是逐个元素的乘法,速度要快得多。那你想要哪个?每个元素平方(A.^2 或 A.*A),还是矩阵平方(A^2 或 AA)?
标签: performance matlab optimization performance-testing