gpt4 book ai didi

arrays - 向量化涉及循环中的 while 循环或 if 子句的函数 (Matlab)

转载 作者:太空宇宙 更新时间:2023-11-03 20:19:26 25 4
gpt4 key购买 nike

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

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 子句来实现此目的的最佳方法是什么?如果可能的话,我想避免编写一个额外的函数作为包装器只是为了遍历输入向量。

我目前的繁琐方案

到目前为止我所做的是:

  • 我必须首先将输入扩展到相同的大小(使用财务工具箱中的 finargsz,但如果您知道另一个执行相同操作的核心函数,那就太好了)

  • 使用size

    记录形状
  • 处理输入

  • 遍历所有输入元素

  • reshape 输出

似乎 numel 函数减轻了所有这些繁重工作的需要,但欢迎提供额外的评论。

最佳答案

总是有 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

编辑:上述解决方案的优点是在使用 1x1 输入后实现起来很简单,但其他答案中的循环对于大输入来说要快得多。例如,在我的电脑上,代码

tic; sqrt_newton(rand(500)); toc

使用我的代码在 ~1.24 秒 内运行,使用@Ramashalanka 的代码运行 0.06 秒,使用@GuntherStruyf 的代码运行 0.28 秒

关于arrays - 向量化涉及循环中的 while 循环或 if 子句的函数 (Matlab),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9559087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com