首页 文章

matlab可执行文件中的匿名函数

提问于
浏览
1

在编译之前,我有三个文件可以正常工作 . 但是当我编译它们时,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

所有文件都在同一目录中 . 编译后我收到以下错误:

未定义函数'replaceZeroWithNaN2'用于'double'类型的输入参数

2 回答

  • 1

    以下内容来自MATLAB's guide on code generation (from ver. 2011b)
    Unsupported Code Features

    显然,您使用匿名函数会导致问题 .

    自本指南发布以来,这可能会发生变化,但我会有点惊讶 . 尝试重新编写代码以避免匿名函数调用;无论如何,你可能会节省一些开销 .

    编辑:

    经过多次挖掘I found here,MATLAB现在支持对象,然而,匿名函数仍然不受支持 .

  • 1

    当MATLAB编译器将您的代码打包成可执行文件时,它需要包含主函数所依赖的所有文件 . 它使用依赖性分析来实现这一点,即遍历代码以查看它依赖的内容以及这些内容所依赖的内容 .

    有时,依赖关系分析可能会失败,并且会错过某些依赖关系 . 例如,如果您的代码调用类似 eval('myfunction') 的内容,则它将找不到 myfunction 作为依赖项 .

    看起来,无论出于何种原因,依赖性分析都找不到 replaceZeroWithNaN2 ,并且它会得到你看到的错误 . 您可以通过运行 depfun('testMain.m') 来自行检查 - depfun 是MATLAB用于查找依赖关系的命令,输出显示它找到依赖于 testClass ,但不是 replaceZeroWithNaN2 .

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

    将以下注释放在 testClass.m 的顶部:

    %#function replaceZeroWithNaN2
    

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

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

    您可能还想向MathWorks报告此问题:我觉得依赖分析确实应该已经接收 replaceZeroWithNaN2 ,这可能是一个错误 .

相关问题