[英]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.