2014-02-05 39 views
7

我想確保用戶定義的MATLAB函數(包含在m文件中)的輸入參數具有某種類型。我知道MATLAB會自動將數據類型分配給變量(以滿足某些人的喜好和令其他人感到沮喪),但是我想知道在MATLAB中是否存在「嚴格數據類型」選項,或者類似的東西,特別是用於用戶定義函數的輸入參數。是否有可能在MATLAB中強制輸入參數數據類型?

我發現MATLAB的「基礎類」(數據類型)的這兩個網頁一個有用的解釋:

http://www.mathworks.com/help/matlab/matlab_prog/fundamental-matlab-classes.html http://www.mathworks.com/help/matlab/data-types_data-types.html

不過,我一直無法找到答案的嚴格問題數據類型,特別是函數輸入參數。我認爲這將是一個非常基本的問題,在很多地方已經得到了回答,但經過廣泛的搜索後,我還沒有找到確鑿的答案。現在,我一直在使用is[TYPE]()功能手動檢查數據類型,如果不符合要求則顯示錯誤消息,雖然這看起來很渺茫,我希望我能讓MATLAB爲我執行它。

下面是一個函數的例子,我想在其中指定輸入參數數據類型。它位於MATLAB當前路徑中的一個名爲strict_data_type_test.m的文件中。在這個函數中,我想強制變量yes_or_no是MATLAB的logical數據類型。我知道我可以使用islogical()函數來手動檢查,但我的問題是,是否有可能讓MATLAB爲我執行它。我也知道任何非零的double值都爲真,零值爲false,但我想強制用戶發送一個logical以確保錯誤的參數不是偶然發送的,例如。下面是示例性函數:

function y = strict_data_type_test(x, yes_or_no) 

    % manual data type check can go here, but manual check is not desirable 

    if (yes_or_no) 
     y = 2 .* x; 
    else 
     y = -5 .* x; 
    end 

end 

添加輸入參數變量名之前的數據類型(如在大多數編程語言)治療中的數據類型的文本作爲另一個變量名而不是一個數據類型標識符。由此看來,嚴格的數據類型在MATLAB中無法以任何方式實現,但也許你們中的一位大師知道我無法找到的有用技巧,功能或語法。

非常感謝您的幫助。

+0

答案是否定的。你調用的是[TYPE]()'是實現它的方法。或者閱讀['inputParser'](http://www.mathworks.com/help/matlab/ref/inputparserclass.html)class [here](http://www.mathworks.com/help/matlab/matlab_prog /input-parser-validation-functions.html)。或者如果你喜歡,寫一個'mex'函數。如果強制類型和用戶傳入錯誤類型,您會發生什麼? – horchler

+0

我同意其他人認爲'inputParser'是要走的路。請參閱[此處](http://stackoverflow.com/a/20337956/2778484)以獲取摘要和簡明示例。 – chappjc

+0

爲了迴應horchler:我希望如果出現了類型強制執行,並且用戶從控制檯傳入了錯誤的類型,那麼會發生錯誤(不需要手動編程函數內的錯誤),更重要的是,如果用戶在另一個腳本或函數內輸入函數調用,那麼MATLAB會將函數調用突出顯示爲錯誤,向用戶顯示它不正確,而不必運行腳本/函數(「編譯器執行」)。 – Babak

回答

3

我已經得到了一些偉大的迴應,所以我不能隨便挑一個作爲「接受的答案」,而是要總結一下我從你們都學會爲止:

  • 沒有,MATLAB不具有內置的嚴格的數據類型的函數輸入參數
  • MATLAB運行前編譯代碼,所以人工驗證檢查不應該對性能非常繁重(分析器可以用來評估這個)
  • 許多有益的存在手動驗證檢查的方法,這裏按順序列出˚F最相關的至少相關的什麼,我試圖做的事:
  • 我可以通過一些MathWorks提供的MATLAB函數(或統計工具箱函數)來查看如何驗證輸入參數的想法,方法是輸入edit後跟功能名稱。建議的兩個函數是normpdf()(來自統計工具箱)和integral()。我發現有一些其他功能是有幫助的,如dot()cross()

其他的想法:

  • 這樣看來,在inputParser類是在最專業的方法來驗證輸入參數的整體concensus。在a related (but not duplicate) stackoverflow post上注意到,較新的MathWorks函數傾向於使用這個類,表明它可能是最好的和最新的選擇。
  • 由於MathWorks提供的MATLAB函數似乎沒有強制執行嚴格的輸入參數數據輸入,這進一步表明,即使可以這樣做,也可能不是推薦的方法。
  • MATLAB似乎認爲「錯誤處理」和「異常處理」是兩個不同的概念。例如,這裏有兩個指向MATLAB文檔中心的鏈接,它們顯示了MathWorks如何以不同的方式考慮「錯誤處理」和「異常處理」:MathWorks Documentation Center article on Error HandlingMathWorks Documentation Center article on Exception Handling。有關此主題的相關StackOverflow帖子已發佈,可以找到here (link)。我聯繫了MathWorks,並在該文章中添加了關於此主題的一些新信息,因此如果您有興趣,可以通過以下鏈接閱讀更多內容。
0

Matlab提供了一個'inputParser',它允許檢查輸入。除此之外,您可以使用斷言:

assert(islogical(yes_or_no),'logical input expected') 

要確保輸入參數的正確數量,請使用narginchk

btw:看看一些Matlab函數,如edit integral,並檢查tmw如何處理這個問題。

+0

編輯整合是一個錯誤嗎?我發現編輯似乎在編輯器中打開文件,我認爲'integal'是'integral'的拼寫錯誤。那麼你是說我應該看看內置MATLAB函數的代碼,比如'integral',看看那些實現輸入參數數據類型的方法嗎? – Babak

+0

是的,整合是一個錯字。對於架構/模式的問題,我經常會看一些內置函數,假設語言的設計者知道如何使用它;) – Daniel

+0

太好了,謝謝。 – Babak

1

你會發現寫這類代碼的繁瑣或者擔心它會降低性能:

if ~islogical(yes_or_no) && ~isscalar(yes_or_no) 
    error('test:NotLogicalType','Second argument must be logical (Boolean).'); 
end 
if yes_or_no 
    y = 2 .* x; 
else 
    y = -5 .* x; 
end 

召回,然而,Matlab的編譯代碼運行,所以之前,即使你需要測試很多條件將是蠻快。運行分析器查看。

在某些情況下(可能不是你的例子)的另一種選擇是使用lazier方法。此選項允許與任何輸入被提供你的代碼運行,但使用try/catch塊以捕獲任何錯誤:

try 
    if yes_or_no 
     y = 2 .* x; 
    else 
     y = -5 .* x; 
    end 
catch me 
    ... 
    error('test:NotLogicalType','Second argument must be logical (Boolean).'); 
    % rethrow(me); 
end 

上面的代碼將產生一個錯誤,如果yes_or_no是例如一個單元陣列(它仍將允許非不過,對於yes_or_no,它們的布爾值,非標量值等等,但是Matlab通常過分寬容)。然後,您可以生成自定義錯誤消息,檢測,拋出什麼樣的錯誤以及嘗試其他方法等。「統計信息」工具箱中的許多功能都使用此方法(例如,在命令窗口中輸入edit normpdf)以獲得更好或更差。

5

validateattributes也可能適合你,如果有適合你的情況的屬性。例如,如果你想強制執行yes_or_no是一個合乎邏輯的標量,你可以嘗試:

validateattributes(yes_or_no,{'logical'},{'scalar'}) 

否則也許像「非空」的屬性。

+0

您可以使用用戶定義的類,因此適用於任何輸入類型。我經常使用它。 – Marc

相關問題