在编译之前,我有三个文件可以正常工作 . 但是当我编译它们时,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 回答
以下内容来自MATLAB's guide on code generation (from ver. 2011b):
显然,您使用匿名函数会导致问题 .
自本指南发布以来,这可能会发生变化,但我会有点惊讶 . 尝试重新编写代码以避免匿名函数调用;无论如何,你可能会节省一些开销 .
编辑:
经过多次挖掘I found here,MATLAB现在支持对象,然而,匿名函数仍然不受支持 .
当MATLAB编译器将您的代码打包成可执行文件时,它需要包含主函数所依赖的所有文件 . 它使用依赖性分析来实现这一点,即遍历代码以查看它依赖的内容以及这些内容所依赖的内容 .
有时,依赖关系分析可能会失败,并且会错过某些依赖关系 . 例如,如果您的代码调用类似
eval('myfunction')
的内容,则它将找不到myfunction
作为依赖项 .看起来,无论出于何种原因,依赖性分析都找不到
replaceZeroWithNaN2
,并且它会得到你看到的错误 . 您可以通过运行depfun('testMain.m')
来自行检查 -depfun
是MATLAB用于查找依赖关系的命令,输出显示它找到依赖于testClass
,但不是replaceZeroWithNaN2
.在这种情况下,您可以明确告诉依赖关系分析包含一个函数 .
将以下注释放在
testClass.m
的顶部:%#function
是一个pragma,它明确告诉依赖关系分析,下面的代码取决于函数replaceZeroWithNaN2
. 当我这样做时,depfun
的输出现在包括replaceZeroWithNaN2
.然后MATLAB编译器应包含
replaceZeroWithNaN2
,您的可执行文件应该可以工作 .您可能还想向MathWorks报告此问题:我觉得依赖分析确实应该已经接收
replaceZeroWithNaN2
,这可能是一个错误 .