gpt4 book ai didi

matlab - 在 MATLAB 中加快 for 循环的方法

转载 作者:太空宇宙 更新时间:2023-11-03 20:26:43 24 4
gpt4 key购买 nike

我刚刚分析了我的 MATLAB 代码,这个 for 循环中有一个瓶颈:

for vert=-down:up
for horz=-lhs:rhs
y = y + x(k+vert.*length+horz).*DM(abs(vert).*nu+abs(horz)+1);
end
end

其中 y、x 和 DM 是我已经定义的向量。我通过编写将循环矢量化,

B=(-down:up)'*ones(1,lhs+rhs+1);
C=ones(up+down+1,1)*(-lhs:rhs);
y = sum(sum(x(k+length.*B+C).*DM(abs(B).*nu+abs(C)+1)));

但这最终变得足够慢。

关于如何加快这个 for 循环有什么建议吗?

提前致谢。

最佳答案

您所做的并不是真正的矢量化。在 Matlab 中为图像处理编写适当的矢量化程序(我假设这就是你正在做的)是非常困难的,如果不是不可能的话。当我们使用术语向量化时,我们的真正意思是“无需额外计算的向量化”。比如这段代码

a = 1:1000000;
for i = a
n = n+i;
end

运行起来会比这段代码慢很多

a = 1:1000000;
sum(a)

更新:感谢@Rasman 的热心建议,上面的代码已经修改。原因是 Matlab 在运行代码之前不会您的代码编译成机器语言,这就是导致它变慢的原因。 summean.* 运算符等内置函数在后台运行预编译的 C 代码。 For 循环是代码运行缓慢的一个很好的例子,如果没有针对您的 CPU 寄存器进行优化。

请忽略我的第一条评论,您所做的是用向量操作重写您的程序。这些操作会占用额外的 CPU,仅仅是因为您告诉计算机进行更多计算,即使每个单独的计算可能(也可能不会)花费更少的时间。

如果你真的想加速你的代码,看看MEX files .它们允许您编写和编译 C 和 C++ 代码,将其编译并作为 Matlab 函数运行,就像那些快速的内置函数一样。无论如何,Matlab 并不意味着成为一个快速的通用编程平台,而是一个计算机模拟环境,尽管近年来这种方法一直在变化。我的建议(根据经验)是,如果你进行图像处理,你将编写 for 循环,而且很少有办法绕过它。矢量运算是为了更直观地解决线性代数问题而编写的,我们很少将数字图像视为常规矩形矩阵来处理它们。

希望对您有所帮助。

关于matlab - 在 MATLAB 中加快 for 循环的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5947413/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com