Użyłem inputParser
obiektu, aby poradzić sobie z ustawieniem domyślnych opcji. Matlab nie zaakceptuje formatu podobnego do Pythona, który podałeś w pytaniu, ale powinieneś być w stanie wywołać funkcję w następujący sposób:
wave(a,b,n,k,T,f,flag,'fTrue',inline('0'))
Po zdefiniowaniu wave
funkcji w ten sposób:
function wave(a,b,n,k,T,f,flag,varargin)
i_p = inputParser;
i_p.FunctionName = 'WAVE';
i_p.addRequired('a',@isnumeric);
i_p.addRequired('b',@isnumeric);
i_p.addRequired('n',@isnumeric);
i_p.addRequired('k',@isnumeric);
i_p.addRequired('T',@isnumeric);
i_p.addRequired('f',@isnumeric);
i_p.addRequired('flag',@isnumeric);
i_p.addOptional('ftrue',inline('0'),1);
i_p.parse(a,b,n,k,T,f,flag,varargin{:});
Teraz wartości przekazywane do funkcji są dostępne za pośrednictwem i_p.Results
. Nie byłem też pewien, jak sprawdzić, czy przekazany parametr jest w ftrue
rzeczywistości inline
funkcją, więc pozostawiono walidator pusty.
if nargin
), łatwy w utrzymaniu, kompaktowy i elastyczny.Innym nieco mniej hakerskim sposobem jest
źródło
Tak, naprawdę fajnie byłoby mieć możliwość robienia tego, co napisałeś. Ale w MATLABie nie jest to możliwe. Wiele moich narzędzi, które zezwalają na wartości domyślne dla argumentów, zwykle jest napisanych z jawnymi kontrolami na początku, jak poniżej:
Ok, więc generalnie zastosowałbym lepszy, bardziej opisowy komunikat o błędzie. Zobacz, że sprawdzenie pustej zmiennej umożliwia użytkownikowi przekazanie pustej pary nawiasów, [], jako symbolu zastępczego zmiennej, która przyjmie wartość domyślną. Autor musi jednak nadal dostarczyć kod, aby zastąpić ten pusty argument jego wartością domyślną.
Moje narzędzia, które są bardziej wyrafinowane, z WIELU parametrów, z których wszystkie mają domyślne argumenty, często używają interfejsu par właściwość / wartość dla domyślnych argumentów. Ten podstawowy paradygmat jest widoczny w narzędziach graficznych uchwytów w programie Matlab, a także w Optimset, Odeset itp.
Aby móc pracować z tymi parami właściwość / wartość, będziesz musiał nauczyć się o varargin, jako sposobie wprowadzania w pełni zmiennej liczby argumentów do funkcji. Napisałem (i opublikowałem) narzędzie do pracy z takimi parami właściwość / wartość, parse_pv_pairs.m . Pomaga przekształcić pary właściwość / wartość w strukturę Matlab. Umożliwia również podanie wartości domyślnych dla każdego parametru. Przekształcenie nieporęcznej listy parametrów w strukturę jest BARDZO dobrym sposobem na ich przekazanie w MATLAB-ie.
źródło
Oto mój prosty sposób na ustawienie domyślnych wartości funkcji za pomocą polecenia „try”:
Pozdrowienia!
źródło
Odkryłem, że funkcja parseArgs może być bardzo pomocna.
źródło
Istnieje również „hack”, którego można użyć, chociaż w pewnym momencie może zostać usunięty z programu Matlab: Funkcja eval w rzeczywistości przyjmuje dwa argumenty, z których drugi jest uruchamiany, jeśli wystąpił błąd w pierwszym.
W ten sposób możemy użyć
aby użyć wartości 1 jako domyślnej dla argumentu
źródło
Wydaje mi się, że znalazłem całkiem sprytny sposób rozwiązania tego problemu, zajmując się tylko trzema liniami kodu (z wyjątkiem zawijania wierszy). Poniższy tekst jest pobierany bezpośrednio z funkcji, którą piszę, i wydaje się, że działa zgodnie z oczekiwaniami:
Pomyślałem, że się tym podzielę.
źródło
Jestem zdezorientowany, że nikt nie wskazał na ten wpis na blogu Lorena, jednego z programistów Matlab. Podejście to opiera się na
varargin
wszystkich tych niekończących się i bolesnych przypadkachif-then-else
lubswitch
przypadkach z zawiłymi warunkami i unika ich . Gdy istnieje kilka wartości domyślnych, efekt jest dramatyczny . Oto przykład z połączonego bloga:Jeśli nadal nie rozumiesz, spróbuj przeczytać cały wpis na blogu Lorena. Napisałem kolejny post na blogu, który dotyczy brakujących domyślnych wartości pozycji. Chodzi mi o to, że mógłbyś napisać coś takiego:
i nadal mają domyślną
eps
wartośćtol
parametru (i oczywiście@magic
wywołanie zwrotnefunc
). Kod Lorena pozwala na to z niewielką, ale trudną modyfikacją.Na koniec tylko kilka zalet tego podejścia:
if-then-else
podejść, które wydłużają się wraz z każdą nową wartością domyślną)Powiedziano Troothowi, że jest też wada. Kiedy wpiszesz funkcję w powłoce Matlaba i zapomnisz jej parametrów, zobaczysz nieprzydatną
varargin
wskazówkę. Aby sobie z tym poradzić, radzimy napisać sensowną klauzulę użytkowania.źródło
Po zapoznaniu się z ASSIGNIN (dzięki tej odpowiedzi przez b3 ) i EVALIN Napisałem dwie funkcje, aby ostatecznie uzyskać bardzo prostą strukturę telefonicznej:
Oto lista:
i
źródło
Jest to mniej więcej zaczerpnięte z podręcznika Matlab ; Mam tylko przelotne doświadczenie ...
źródło
Matlab nie dostarcza mechanizmu do tego, ale możesz skonstruować taki w kodzie przestrzeni użytkownika, który jest terserski niż sekwencje inputParser lub "if nargin <1 ...".
Następnie możesz to nazwać w swoich funkcjach w ten sposób:
Formatowanie to konwencja, która umożliwia odczytanie nazw parametrów do ich wartości domyślnych. Możesz rozszerzyć swoją getargs () o opcjonalne specyfikacje typu parametrów (do wykrywania błędów lub niejawnej konwersji) i zakresy liczby argumentów.
Takie podejście ma dwie wady. Po pierwsze, jest powolny, więc nie chcesz go używać do funkcji wywoływanych w pętlach. Po drugie, pomoc funkcji Matlaba - wskazówki dotyczące autouzupełniania w wierszu poleceń - nie działają dla funkcji varargin. Ale jest to całkiem wygodne.
źródło
możesz chcieć użyć
parseparams
polecenia w programie Matlab; użycie wyglądałoby następująco:źródło
np.
f(2,4,'c',3)
powoduje, że parametrc
ma wartość 3.źródło
jeśli użyjesz oktawy, możesz to zrobić w ten sposób - ale niestety Matlab nie obsługuje takiej możliwości
(wzięte z dokumentu )
źródło
Lubię to robić w nieco bardziej zorientowany obiektowo sposób. Przed wywołaniem wave () zapisz niektóre argumenty w strukturze, np. jeden zwany parametrami:
W ramach funkcji falowej sprawdź, czy parametry struktury zawierają pole o nazwie „flaga”, a jeśli tak, to czy jego wartość nie jest pusta. Następnie przypisz mu jeszcze wartość domyślną, którą zdefiniowałeś wcześniej, lub wartość podaną jako argument w parametrach struct:
Ułatwia to obsługę dużej liczby argumentów, ponieważ nie zależy to od kolejności podanych argumentów. To powiedziawszy, jest również pomocne, jeśli musisz później dodać więcej argumentów, ponieważ nie musisz zmieniać sygnatury funkcji, aby to zrobić.
źródło
wave(a,b,'flag',42,'fTrue',1)