【问题标题】:anonymous function in matlab executablematlab可执行文件中的匿名函数
【发布时间】:2015-07-20 21:13:14
【问题描述】:

在我编译它们之前,我有三个可以完美运行的文件。但是,当我编译它们时,matlab 的行为就好像我没有包含其中一个文件,即使它包含在部署中。

function testMain

kuzu = zeros(5,1);
anonymousFunction = testClass.anonymousFunction;
kuzu2 = anonymousFunction(kuzu)

end

classdef testClass
    properties (Constant)
        anonymousFunction = @(x) replaceZeroWithNaN2(x)
    end
end

function output = replaceZeroWithNaN2(input)

input(input==0) = NaN;
output = input;

end

所有文件都在同一个目录中。编译后出现以下错误:

“double”类型的输入参数的未定义函数“replaceZeroWithNaN2”

【问题讨论】:

    标签: matlab executable anonymous-function


    【解决方案1】:

    以下来自MATLAB's guide on code generation (from ver. 2011b)

    显然您对匿名函数的使用导致了问题。

    自本指南发布以来,这可能已经发生了变化,但我会有点惊讶。尝试修改代码以避免匿名函数调用;无论如何,您可能会节省一些开销。

    编辑:

    在进一步挖掘I found here 之后,MATLAB 现在支持对象,但是仍然不支持匿名函数。

    【讨论】:

    • -1 这个答案不相关。您包含的文档来自 MATLAB Coder,用于从 MATLAB 生成 C 代码。 OP 没有这样做,而是使用 MATLAB Compiler 将代码部署为可执行文件,这是一种完全不同的产品,对您提到的语言子集没有任何限制。
    【解决方案2】:

    当 MATLAB Compiler 将您的代码打包成可执行文件时,它需要包含您的 main 函数所依赖的所有文件。它使用依赖分析来做到这一点,即遍历代码以查看它依赖于哪些事物,以及这些事物依赖于哪些事物。

    有时依赖关系分析可能会失败并且会遗漏一些依赖关系。例如,如果您的代码调用 eval('myfunction') 之类的东西,它将找不到 myfunction 作为依赖项。

    看起来,无论出于何种原因,依赖分析都没有找到replaceZeroWithNaN2,并且它没有包含在您的可执行文件中,因此您收到了您看到的错误。您可以通过运行 depfun('testMain.m') 自行检查 - depfun 是 MATLAB 用来查找依赖项的命令,输出显示它正在查找对 testClass 的依赖项,但不是 replaceZeroWithNaN2

    在这种情况下,您可以明确告诉依赖分析包含一个函数。

    将以下评论放在testClass.m的顶部:

    %#function replaceZeroWithNaN2
    

    %#function 是一个pragma,它明确告诉依赖分析下面的代码依赖于函数replaceZeroWithNaN2。当我这样做时,depfun 的输出现在包括replaceZeroWithNaN2

    然后,MATLAB 编译器应该包含 replaceZeroWithNaN2,并且您的可执行文件应该可以工作。

    您可能还想向 MathWorks 报告该问题:在我看来,依赖关系分析确实应该采用 replaceZeroWithNaN2,这可能是一个错误。

    【讨论】:

    • %#function 表达式似乎解决了我的问题,而无需对我的代码进行重大更改。谢谢!
    • 如果答案解决了您的问题,请使用答案左侧的勾选按钮将其标记为已接受。这让有类似问题的其他人更容易找到正确答案。
    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多