[英]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现在支持对象,但是仍然不支持匿名函数。
当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.