簡體   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