2

我正在尝试对for循环进行矢量化。我在[68x200]名为 的矩阵中列出了一组坐标,在名为 的矩阵plt2中列出了另一组坐标。我想创建一个名为 的三维数组,其中的所有值都减去第一个值,一直到. 我有一个这样的 for 循环,它可以工作但很慢:[400x1]trans1dist1dist1(:,:,1)plt2trans1trans1

for i=1:source_points;
    dist1(:,:,i)=plt2-trans1(i,1);
end

谢谢你的帮助。

4

2 回答 2

3

如果我理解正确,这可以很容易地解决bsxfun

dist1 = bsxfun(@minus, plt2, shiftdim(trans1,-2));

或者,如果速度很重要,请使用这个等效版本(感谢@chappjc),它似乎要快得多:

dist1 = bsxfun(@minus, plt2, reshape(trans1,1,1,[]));

一般来说,bsxfun对于这种情况,这是一个非常有用的功能。它的行为可以总结如下:对于它的两个输入数组中的任何一个的任何单一维度,它for沿相同维度将“隐式”循环应用于另一个数组。有关详细信息,请参阅文档

于 2013-10-18T14:05:33.813 回答
0

矢量化是一个很好的第一次优化,通常比编写自己编译的 mex 函数(在 c 中)要容易得多。

然而,高级用户的黄金中间道路是 Matlab Coder(这也适用于比发布的问题稍难的问题,其中矢量化或多或少是不可能的)。首先,在您的情况下,围绕慢速代码创建一个小的 m-file 函数:

function dist1 = do_some_stuff(source_points,dist1,plt2,trans1)
for i=1:source_points;
    dist1(:,:,i)=plt2-trans1(i,1);
end

然后创建一个简单的包装函数,它调用 do_some_stuff 并定义输入。这个文件应该只有 5 行,只需要最基本的东西。Matlab Coder 使用包装函数来了解 do_some_stuff 的典型正确输入是什么。

您现在可以从 Apps 部分启动 Matlab Coder gui,只需在 Entry-Point Files 下添加 do_some_stuff。按 Autodefine types 并选择您的包装函数。去构建并按下构建,你很高兴!这种方法通常几乎不费吹灰之力就能大大提高执行速度。

BR马格努斯

于 2013-10-18T20:37:06.290 回答