我正在尝试向量化for
循环。我在一个名为[68x200]
的{{1}}矩阵中列出了一组坐标,我在plt2
矩阵中列出了另一组坐标,名为[400x1]
。我想创建一个名为trans1
的三维数组,其中dist1
我的dist1(:,:,1)
的所有值都减去plt2
的第一个值,一直到到trans1
的末尾。我有一个这样的for循环可以工作,但很慢:
trans1
感谢您的帮助。
答案 0 :(得分:3)
如果我理解正确,可以使用bsxfun
:
dist1 = bsxfun(@minus, plt2, shiftdim(trans1,-2));
或者,如果速度很重要,请使用此等效版本(感谢@chappjc),这似乎要快得多:
dist1 = bsxfun(@minus, plt2, reshape(trans1,1,1,[]));
一般来说,bsxfun
对于这样的案例来说是一个非常有用的功能。其行为可归纳如下:对于其两个输入数组中的任何一个的任何单个维度,它将“隐式”for
循环应用于沿同一维度的另一个数组。有关详细信息,请参阅doc。
答案 1 :(得分:0)
向量化是一个很好的第一次优化,并且通常比编写自己编译的mex函数(在c中)更容易。
然而,高级用户的黄金中途是Matlab Coder(这也适用于比发布的问题稍微难一些的问题,其中矢量化或多或少是不可能的)。首先,在你的情况下,围绕慢速代码创建一个小的m文件函数:
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的典型输入是什么。
您现在可以从应用程序部分启动Matlab Coder gui,只需在入口点文件下添加do_some_stuff。按Autodefine类型并选择包装函数。去构建并按下构建,你很高兴!这种方法通常几乎不费力地大大提高了执行速度。
BR 马格努斯