关于性能:如何在Matlab中向量化“ for”循环

您所在的位置:网站首页 matlab向量化编程代替for例题 关于性能:如何在Matlab中向量化“ for”循环

关于性能:如何在Matlab中向量化“ for”循环

2024-07-10 16:06| 来源: 网络整理| 查看: 265

我正在编写一个可计算某种矩阵的Matlab应用程序。 我试图用基于矢量的计算替换程序中的for循环,但是,我陷入了困境。

到目前为止,我已经弄清楚了这个简单的代码示例部分:

123456789101112kernel = zeros(5,5,5); offset = 3; sig=1; for x=-2:2     for y=-2:2         for z=-2:2             IN = x.^2/(sig^2) + y.^2/(sig^2) + z.^2/(sig^2);             kernel(offset+x, offset+y, offset+z) = exp(-IN/2);         end     end end

可以用这样的结构代替:

123[x,y,z] = ndgrid(-2:2,-2:2,-2:2); IN = x.^2/(sig^2) + y.^2/(sig^2) + z.^2/(sig^2); kernel = exp(-IN/2);

并给出相同的结果。 但是,如果我需要做一些小改动怎么办:

12345678910111213141516171819kernel = zeros(5,5,5); offset = 3;   sig=1; %sample 3x3 matrix R=magic(3)/10; for x=-2:2     for y=-2:2         for z=-2:2             % calculation of new x, y, z             point = [x,y,z]*R;               IN = (point(1)^2 )/(sig^2) + (point(2)^2)/(sig^2) + (point(3)^2)/(sig^2);             kernel(offset+x, offset+y, offset+z) = exp(-IN/2);         end     end end

我怎样才能加快施工速度? 可以很容易地将其向量化吗? 我是Matlab的新手,所以我将不胜感激。 非常感谢!

一种选择是使用arrayfun。

1234567sig=1; %sample 3x3 matrix R=magic(3)/10; [x,y,z] = ndgrid(-2:2,-2:2,-2:2); kernel = arrayfun(@(x, y, z) exp(-(norm([x,y,z]*R/sig)^2)/2), x,y,z);

说明:

arrayfun带有一个作用在标量输入上的函数以产生标量输出,以及要传递给该函数的输入数组。 然后,它遍历输入数组,在每个数组上运行您的函数,并将每个数组的输出放入输出矩阵(-es)的相应条目中。 因此,arrayfun基本上会执行嵌套循环,这会降低您的工作速度。

在此示例中,我还使用了匿名函数(也称为lambda函数)在最内层的循环中进行工作。 由于lambda函数必须是Matlab中的单个表达式,因此我不得不稍微重写一下内部循环(使用简单的代数操作)。 如果需要将arrayfun与不容易表示为lambda的函数一起使用,则始终可以将该函数编写在单独的.m文件中,并将其传递给arrayfun。

编辑:请注意,您不必再预先分配kernel,并且您也不需要offset。

相关讨论 好答案,谢谢!奇迹般有效。不过,奇怪的是,在这种情况下,循环的运行速度快了好几倍。显然,arrayfun的优化不是很好。 @ user3299285对我来说,arrayfun版本要快得多。在很大程度上取决于您拥有多少个循环迭代,以及每个迭代中要完成多少工作。对于这样一个很小的循环(总共27个迭代),从绝对值开始它非常快,因此没有太多收获。同样,范数仅取平方根(与其他算术运算相比较慢)仅是回来并在之后立即求平方。如果要更好地比较循环与arrayfun的速度,请用arrayfun使用的相同函数替换循环的主体。 恐怕我不能同意。即使用相同的功能替换主体,我也比使用arrayfun获得更好的结果。看来arrayfun确实不是太快:stackoverflow.com/questions/12522888/ @ user3299285哇,我想arrayfun毕竟不是一个好的解决方案。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3