发布网友 发布时间:2024-10-23 20:54
共1个回答
热心网友 时间:2024-11-10 04:03
在使用FunctionCompile时,我们可能会遇到函数编译失败的问题。以编译Function[x, Select[x, # > 1 &, 5]]为例,这里我们探讨一下问题出现的原因及解决策略。
首先,遇到的问题可能源自于匿名函数的使用。在FunctionCompile中,匿名函数的类型推断并不总是准确,导致编译失败。尝试明确函数类型(方案二)是另一种尝试,但即使如此,FunctionCompile也可能报错。
要深入理解问题,我们需要理解FunctionCompile中Select函数的内部实现。GeneralUtilities`PrintDefinitions@Select并不能查看FunctionCompile中的源码,需要直接在搜索结果中查找Select。Select的输入参数中,container需要是RangeIterable类型,形式如container["element"],而方案二中的参数类型"PackedArray"["Real", 1]与此不符,导致编译失败。
解决方案是,我们可以将Select函数的具体实现(如动态数组操作)以FunctionDeclaration的形式,调整为适应我们的函数类型。这样,方案二的编译可以成功,而方案一也可能因此得到解决,尽管这可能增加编译时长,如40秒,这在Mathematica的性能优化中是一个待改进的点。