想象一下,你在MATLAB中有两个变量f(x,y)
的函数。它是以x
可以是标量或一维数组的方式编写的,但y
严格意味着是一个标量。对于数组x
,该函数返回与x
长度相同的元素数组。
接下来,您需要重构此函数以接受x
和y
作为相等长度的1D数组,即函数f([x1,x1],[y1,y2]) = [f(x1,y1), f(x2,y2)]
的值。
你会如何以最有效的方式做到这一点?
答案 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;
...
往往较慢的原因。