2013-03-14 112 views
6

在大多數OO語言中,變量可能指向對象,它們也可能具有空值,這非常方便。matlab - 什麼是null/None/nil/NULL等值?

在Matlab中,我有解析的命令的功能,然後返回一個單元陣列,或false(其等於零 - 這是另一種常見的模式),如果它失敗:

function re = parse(s) 
    ... 
    if (invalid) 
     re = false; 
     return; 
    end 
end 

的問題是,當我檢查的結果,它給出了一個錯誤:

re = parse(s); 
if (false == re) 
Undefined function 'eq' for input arguments of type 'cell'. 

我寫了一個函數來檢查它沒有一個錯誤:strcmp('logical', class(re)) && false == re,但是這似乎是在炎熱地區使用很慢代碼,而且如果我不得不增加代碼也很不方便s函數到我正在寫的每個M文件。

使用NaN更糟,因爲除了拋出這個錯誤之外,它也不等於它本身。

使用這種模式有什麼更好的選擇?

+0

爲了解決你的問題之一,慣用MATLAB是使用'isnan(A)'檢查楠,而不是'A == NaN'(因爲你發現了,後者沒有工作)。 – tmpearce 2013-03-14 04:33:54

+0

這將是另一種選擇,但不幸例如'isnan({})'拋出一個錯誤。 – 2013-03-14 05:10:47

回答

3

您可以使用isequal函數比較任意兩個項目而不會導致該錯誤。例如:

if isequal (re, false) 
    %code here 
end 
1

如果你可以改變功能parse一個解決辦法是將返回兩個輸出參數[re status] = parse(s),其中status將是合乎邏輯變量。如果成功,則將其設置爲true,否則將其設置爲false。

+0

即使'[]'是'parse(..)'的有效結果,這也將始終有效。 – 2013-03-14 05:21:16

0

我認爲問題是matlab函數不返回指針,而是返回值的副本。

恕我直言,最好的方法是定義你自己的「指針」類。在裏面你可以定義一個「isNull()」命令,甚至可以重寫比較來產生你想要的行爲。

1

如果不是有效的結果,我會使用空單元格陣列{}。使用空矩陣是MATLAB標準(請參閱Evgeni Sergeev的答案),但使用空單元格數組而不是空數值數組可確保始終使用相同類型的結果。

如果,另一方面,空單元陣列{}是你的函數的一個有效的結果,那麼我會使用異常以突出的一個問題:

if invalid 
    error('Parse:InvalidArgumentError', 'The input is invalid.'); 
end 

確保使用適當的錯誤ID(第一個參數error),這樣你可以捕捉正是異常,當你調用該函數:

try: 
    result = parse(something); 
catch ME 
    if strcmp(ME.identifier, 'Parse:InvalidArgumentError') 
     fprintf('Ooops\n'); 
    else 
     % Some other error 
     ME.rethrow(); 
    end 
end