gpt4 book ai didi

函数句柄运行时的 Matlab 解析

转载 作者:行者123 更新时间:2023-12-02 01:38:06 25 4
gpt4 key购买 nike

我的问题:给定一个函数句柄,matlab 是在每次需要计算字符串时解析该字符串,还是只解析一次然后缓存它?

示例

考虑巧妙的功能

function [] = foo(func)
for j=1:1e4
func(j);
end

和脚本

func1 = @(x) 5*abs(x)^2
function foo(func1);

在运行时,Matlab 需要将 @(x) 5*abs(x)^2 解释为函数。在这个例子中,它执行一次还是一千次?

最佳答案

首先@(x)cos(x)不是一个字符串,它是一个anonymous function declaration 。当您创建匿名函数时,MATLAB 本质上会创建一个函数对象,其中包含其运行所需的所有信息。然后,这个匿名函数可以传递给各种函数,甚至可以保存到文件中。因此,它只构造一次并评估多次。

求值时,MATLAB 不会进行任何缓存,因此多次调用具有相同输入的同一匿名函数会导致每次都对匿名函数的内容进行求值。

如果您想获取有关匿名函数的更多信息,包括函数的本地工作区,可以使用 functions功能

f = @(x)cos(x);

functions(f)

% function: '@(x)cos(x)'
% type: 'anonymous'
% file: ''
% workspace: {[1x1 struct]}
% within_file_path: '__base_function'

话虽如此,在您的示例中,它确实可以减少为 function handle而不是匿名函数,因为您将所有输入参数直接传递给 cos 而无需修改它们。正如您所看到的,这具有不同的内部表示,并且从一些初步基准来看,它似乎稍微快一些。

f = @cos

functions(f)

% function: 'cos'
% type: 'simple'
% file: ''

以及快速基准测试

function benchit
fprintf('Anonymous function: %0.4f\n', timeit(@option1));
fprintf('Function handle: %0.4f\n', timeit(@option2));
end

function option2()
f = @(x)cos(x);
for k = 1:10000
f(k);
end
end

function option1()
f = @cos;
for k = 1:10000
f(k);
end
end

结果(并不是真正的巨大差异)

Anonymous function: 0.0056
Function handle: 0.0049

还有一些事情

  • 创建匿名函数时,匿名函数声明仍必须遵守 MATLAB 的所有标准语法规则,否则将无法创建。例如,以下内容将在匿名函数创建期间引发错误,因为它是无效语法

    func = @(x)thing]

    Error: Unbalanced or unexpected parenthesis or bracket.

  • 当您评估匿名函数(在成功创建之后)时,就像评估任何其他函数一样,匿名函数可能会抛出错误,并且错误取决于输入。

    func = @(x) x + [1 2];

    func([3 4])
    % 4 6

    % Now we're going to pass an array that isn't 1 x 2
    func([5 6 7])

    Matrix dimensions must agree.
    Error in @(x)x+[1,2]

关于函数句柄运行时的 Matlab 解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41862767/

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