2009-08-13 127 views
3

在Matlab中當一個人試圖訪問不存在通常引發錯誤的矩陣的元素:是否可以在Matlab中爲下標提供默認值?

>> month(0) 
??? Subscript indices must either be real positive integers or logicals. 

我想知道是否存在允許在這樣的情況下供給的默認值的函數。例如:

>> get_def(month(0), NaN) 
ans = 
    NaN 

P.S.我可以解決這個特殊情況下標(0),但我想知道更通用的方式做這個。

回答

2

沒有內置的MATLAB函數來做你想做的。您可以使用try-catch塊:

>> try a = month(0); catch a = nan; end 
>> a 

a = 

    NaN 

然而,最好的辦法可能是給錯誤檢查索引第一,拋出一個錯誤或變量設置爲默認值,如果它超出了範圍。

如果你真的想嘗試使用可能爲0的索引,你可以編寫自己的get_def函數。下面是做這件事:

function value = get_def(vector,index,defaultValue) 
    try 
    value = vector(index); 
    catch 
    value = defaultValue; 
    end 
end 

你會再以下列方式使用該功能:

>> month = 1:12; 
>> get_def(month,0,nan) 

ans = 

    NaN 

>> get_def(month,1,nan) 

ans = 

    1 
+2

我只是評論說,我愛你的圖標。 YO QOTSA! – 2009-08-13 22:34:28

+0

@Matt:謝謝!你只是第二個注意/提及它的人。 – gnovice 2009-08-14 01:33:39

+1

我偶然聽到QOTSA現場專輯,當時我偶然發現了這個。感謝您完成感官圖片。 – 2009-08-14 23:40:20

3

優雅的解決方案是創建內建 MATLAB類的子類,超載的subsref方法:

classdef myDouble < double 

    methods 

     function obj = myDouble(val) 
      obj = [email protected](val); 
     end 

     function val = subsref(obj, S) 
      try 
       val = [email protected](obj, S); 
      catch 
       val = NaN; 
      end 
     end 

    end 

end 

然後,您可以使用這個類,如下所示:

>> a = myDouble(1:10); 
>> a(1:3) 

ans = 
    myDouble 
    double data: 
    1  2  3 

    Methods, Superclasses 

>> a('asdsa') 

ans = 
    NaN 

>> a({1, 'asdf'}) 

ans = 
    NaN 

由於子從類繼承,你仍然得到類和自定義myDouble類的附加功能的所有功能。

對檢查出來的MATLAB幫助:

+0

+1:我實際上考慮過提出這個建議,但認爲它可能比OP所尋找的複雜一點。 – gnovice 2009-08-15 04:30:00

+2

我希望OP鼓勵探索MATLAB類。你是對的,它最初可能會更復雜,但即使初學者對OOP概念的理解,解決問題的使用也會變得容易很多。當然,使用不當,程序也可能成爲Rube Goldberg-ian! – 2009-08-15 05:48:00

相關問題