繁体   English   中英

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

[英]anonymous function in matlab executable

在编译它们之前,我有三个文件可以完美工作。 但是,当我编译它们时,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的代码生成指南(自2011b版起) 不支持的代码功能

显然,您对匿名函数的使用会引起问题。

自从本指南发布以来,这种情况有可能发生了变化,但是我会感到有些惊讶。 尝试重新编写代码以避免匿名函数调用; 无论如何,您可能会节省一些开销。

编辑:

经过进一步的挖掘后, 我发现此处的 MATLAB现在支持对象,但是仍然不支持匿名函数。

当MATLAB Compiler将您的代码打包为可执行文件时,它需要包括主要功能依赖的所有文件。 它使用依赖关系分析来执行此操作,即遍历代码以查看其依赖的内容以及这些依赖的内容。

有时,依赖项分析可能会失败,并且会丢失某些依赖项。 例如,如果您的代码调用了eval('myfunction') ,它将不会找到myfunction作为依赖项。

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

在这种情况下,您可以显式告诉依赖项分析包括一个函数。

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

%#function replaceZeroWithNaN2

%#function是一个replaceZeroWithNaN2 ,可明确告知依赖项分析以下代码取决于函数replaceZeroWithNaN2 当我这样做时, depfun的输出现在包括replaceZeroWithNaN2

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

您可能还想将问题报告给MathWorks:在我看来,依赖分析确实应该已经开始使用replaceZeroWithNaN2 ,这可能是一个错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM