2013-03-14 11 views
6

W większości języków OO, w których zmienne mogą wskazywać na obiekty, mogą również mieć wartość zerową, co jest bardzo wygodne.matlab - co jest odpowiednikiem null/None/nil/NULL itd.?

Matlab, że posiada funkcję, która przetwarza polecenia, a następnie powraca układ komórkowy lub false (równa zeru - który jest inny wspólny wzorzec), jeśli nie:

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

problem polega na tym, że kiedy sprawdzić wynik, to daje błąd:

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

pisałem funkcję sprawdzenia go bez błędu: strcmp('logical', class(re)) && false == re, ale to wydaje się być bardzo powolny do stosowania w gorących obszarów komunikatu kod, a także niewygodne, jeśli muszę dodać thi s funkcji do każdego pliku M, który piszę.

Korzystanie z NaN jest jeszcze gorsze, ponieważ oprócz rzucania tego błędu, nie jest on równy samemu sobie.

Jaka jest lepsza alternatywa do użycia z tym wzorem?

+0

na adres jednego ze swoich punktów, idiomatyczne MATLAB jest użycie 'isNaN (A)', aby sprawdzić, nan, zamiast "A == NaN" (ponieważ jak się dowiedziałeś, ten drugi nie praca). – tmpearce

+0

To byłaby inna alternatywa, ale niestety np. 'isnan ({})' wyrzuca błąd. –

Odpowiedz

3

Możesz użyć funkcji isequal, aby porównać dwa elementy bez powodowania tego błędu. Na przykład:

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

Jeśli można zmienić funkcję parse jednym rozwiązaniem byłoby, aby powrócić dwa argumenty wyjściowe [re status] = parse(s), gdzie status byłaby zmienna logiczna. Ustaw ją na true w przypadku sukcesu, a na false w przeciwnym wypadku.

+0

To zawsze zadziała, nawet jeśli '[]' było poprawnym wynikiem 'parsowania (..)'. –

0

Myślę, że problem polega na tym, że funkcje matlab nie zwracają wskaźników, ale kopie wartości.

IMHO najlepszym najlepszym podejściem byłoby zdefiniowanie własnej klasy "wskaźnika". Wewnątrz można zdefiniować polecenie "isNull()" lub nawet przesłonić porównanie, aby uzyskać pożądane zachowanie.

1

Chciałbym użyć pustej komórki tablicy {}, jeśli nie jest to prawidłowy wynik w przeciwnym razie. Używanie pustych macierzy jest standardem MATLAB (patrz odpowiedź Evgeni Sergeev), ale użycie pustej tablicy komórek zamiast pustej tablicy numerycznej zapewnia, że ​​zawsze otrzymasz taki sam wynik.

Jeśli, z drugiej strony, pusta tablica komórek {} jest prawidłowym wynikiem swojej funkcji, a następnie użyję wyjątek sygnalizuje problem:

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

upewnij się, aby użyć odpowiedniego błędu ID (pierwszy argument error), tak, że można złapać dokładnie ten wyjątek podczas wywołania funkcji:

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