数组 – 在循环中向量化涉及while循环或if子句的函数(Matlab)

假设我有一个可以从一个输入计算一个输出的函数,例如

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秒.

转载注明原文:数组 – 在循环中向量化涉及while循环或if子句的函数(Matlab) - 代码日志