在MATLAB中重构一个函数以接受原始标量参数作为数组

时间:2015-10-03 20:52:24

标签: matlab function refactoring

想象一下,你在MATLAB中有两个变量f(x,y)的函数。它是以x可以是标量或一维数组的方式编写的,但y严格意味着是一个标量。对于数组x,该函数返回与x长度相同的元素数组。

接下来,您需要重构此函数以接受xy作为相等长度的1D数组,即函数f([x1,x1],[y1,y2]) = [f(x1,y1), f(x2,y2)]的值。

你会如何以最有效的方式做到这一点?

1 个答案:

答案 0 :(得分:2)

这非常适合f = @(x,y) y*x.^2; %an example where y should not be an array, x can fnew = @(xv,yv) arrayfun(f,xv,yv);

f(xv(k),yv(k))

只要两个数组的大小相同,此新函数将为每个k返回arrayfun

请注意f非常慢,因此使用循环来实现相同的效果或实现特定函数bsxfun的矢量化(可能使用function fv=fnew(xv,yv) if numel(xv)~=numel(yv) exit('fnew> xv and yv should have same length'); end fv=zeros(size(xv)); for k=1:numel(xv) fv(k) = f(xv(k),yv(k)); end )可能会更快。

显式循环替代方案是

arrayfun

您可以通过跳过大小检查来节省一些运行时间,类似的检查是MailMessage mail = new MailMessage("you@yourcompany.com", "user@hotmail.com"); mail.IsBodyHtml = false; ... 往往较慢的原因。