Vectorising 3d数组

时间:2013-10-18 13:59:56

标签: matlab vectorization

我正在尝试向量化for循环。我在一个名为[68x200]的{​​{1}}矩阵中列出了一组坐标,我在plt2矩阵中列出了另一组坐标,名为[400x1]。我想创建一个名为trans1的三维数组,其中dist1我的dist1(:,:,1)的所有值都减去plt2的第一个值,一直到到trans1的末尾。我有一个这样的for循环可以工作,但很慢:

trans1

感谢您的帮助。

2 个答案:

答案 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 马格努斯