假设我有一个可以从一个输入计算一个输出的函数,例如
function y = sqrt_newton(x)
y = x ./ 2;
yo = y;
y = 0.5.*(y + x ./ y);
while abs(y - yo) > eps * abs(y)
yo = y;
y = 0.5.*(y + x ./ y);
end
end
我希望能够将此函数应用于矢量输入,例如sqrt_newton(2:9),就像内置函数一样.使用循环开头的条件或内部的if-clause实现此目的的最佳方法是什么?我想避免写一个额外的函数作为包装器来循环输入向量,如果可能的话.
我目前的繁琐解决方案
我到现在为止做的是:
>我必须首先将输入扩展到相同的大小(使用金融工具箱中的finargsz,但如果你知道另一个核心功能也是如此,那就太好了)
>使用大小记录形状
>处理投入
>循环通过所有输入元素
>重塑输出
似乎数字函数减轻了所有这些繁重工作的需要,但额外的评论将是最受欢迎的.
最佳答案
总有
arrayfun
.您可以保留您拥有的代码,将其置于内部功能中.
function y = sqrt_newton(z)
y = arrayfun(@inner, z);
function y= inner(x)
y = x ./ 2;
yo = y;
y = 0.5.*(y + x ./ y);
while abs(y - yo) > eps * abs(y)
yo = y;
y = 0.5.*(y + x ./ y);
end
end
end
编辑:上面的解决方案具有在使用1×1输入后可以轻松实现的优点,但是对于大输入,其他答案中的循环更快.例如,在我的计算机上,代码
tic; sqrt_newton(rand(500)); toc
使用我的代码在~1.24秒内运行,使用@ Ramashalanka代码运行0.06秒,使用@ GuntherStruyf的代码运行0.28秒.
相关文章