Czy możliwe jest pobranie wartości zwracanej przez „n-tą” z funkcji bez konieczności tworzenia zmiennych fikcyjnych dla wszystkich n-1
wartości zwracanych przed nią?
Powiedzmy, że mam następującą funkcję w MATLAB:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Załóżmy teraz, że interesuje mnie tylko trzecia zwracana wartość. Można to osiągnąć, tworząc jedną fikcyjną zmienną:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Ale myślę, że to trochę brzydkie . Myślę, że możesz zrobić coś podobnego do jednej z następujących rzeczy, ale nie możesz:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Czy są na to eleganckie sposoby, które działają?
Jak dotąd najlepszym rozwiązaniem jest po prostu użycie variableThatIWillUse
zmiennej zastępczej. Dzięki temu nie muszę tworzyć prawdziwej fikcyjnej zmiennej, która zanieczyszcza przestrzeń roboczą (lub którą musiałbym wyczyścić). W skrócie: rozwiązaniem jest użycie variableThatIWillUse
dla każdej zwracanej wartości aż do interesującej. Wartości zwracane po można po prostu zignorować:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Nadal uważam, że to bardzo brzydki kod, ale jeśli nie ma lepszego sposobu, to chyba zaakceptuję odpowiedź.
źródło
Odpowiedzi:
To trochę hack, ale działa:
Najpierw krótka przykładowa funkcja:
Kluczem tutaj jest to, że jeśli użyjesz zmiennej dwukrotnie po lewej stronie przypisania z wieloma wyrażeniami, wcześniejsze przypisanie zostanie zablokowane przez późniejsze przypisanie:
(edytuj: żeby sprawdzić, zweryfikowałem również, że ta technika działa,
[mu,mu,mu]=polyfit(x,y,n)
jeśli wszystko, na czym ci zależy,polyfit
to trzeci argument)edycja: jest lepsze podejście; zamiast tego zobacz odpowiedź ManWithSleeve .
źródło
W MATLAB w wersji 7.9 (R2009b) możesz użyć ~, np.
Zauważ, że
,
nie jest opcjonalny. Samo wpisanie[~ ~ var]
nie zadziała i spowoduje wyświetlenie błędu.Zobacz informacje o wersji, aby uzyskać szczegółowe informacje.
źródło
not
operatora jakodon't care
takiego też nie jest takie złe,
nie jest opcjonalne. Wpisanie[~ ~ var]
woli nie pracować, i wygeneruje błąd.Jeśli chcesz użyć stylu, w którym zmienna zostanie pozostawiona do segmentu bitów, rozsądną alternatywą jest
ans jest oczywiście domyślną zmienną śmieciową dla Matlaba, często nadpisywaną w trakcie sesji.
Chociaż podoba mi się nowa sztuczka, na którą teraz pozwala MATLAB, użycie ~ do oznaczenia ignorowanej zmiennej zwrotnej, jest to problem ze wsteczną kompatybilnością, ponieważ użytkownicy starszych wersji nie będą mogli używać twojego kodu. Generalnie unikam używania takich nowych rzeczy, dopóki co najmniej kilka wydań MATLAB-a nie zostanie wydanych, aby zapewnić, że pozostanie bardzo niewielu użytkowników. Na przykład nawet teraz stwierdzam, że ludzie nadal używają wystarczająco starej wersji MATLAB-a, że nie mogą używać funkcji anonimowych.
źródło
Oto inna opcja, której możesz użyć. Najpierw utwórz tablicę komórek, aby przechwycić wszystkie wyjścia (możesz użyć funkcji NARGOUT, aby określić, ile wyjść zwraca dana funkcja):
Następnie wywołaj funkcję w następujący sposób:
Wtedy po prostu usunąć element z że chcesz, i nadpisać :
źródło
Napisałem k-tą funkcję:
możesz wtedy zadzwonić
możesz również zawinąć funkcję, taką jak
po którym używasz
zwróć uwagę, że korzystanie z takich anonimowych funkcji wiąże się z narzutem i nie jest to coś, co robiłbym w kodzie, który byłby wywoływany tysiące razy.
źródło
W Matlab 2010a znalazłem zgrabny sposób na robienie tego, o co prosisz. Wystarczy użyć znaku "~" (oczywiście bez cudzysłowów) jako zmiennej fikcyjnej (tyle, ile chcesz, gdy zwracasz wiele parametrów). Działa to również w przypadku parametrów wejściowych do funkcji, jeśli funkcje są zaprojektowane do obsługi brakujących danych. Nie wiem, czy istniało to w poprzednich wersjach, ale niedawno się z tym spotkałem.
źródło
Możesz utworzyć funkcję (lub funkcję anonimową), która zwraca tylko wybrane wyniki, np
Następnie możesz wywołać swoją funkcję w ten sposób:
Możesz też przypisać dane wyjściowe do zmiennej:
źródło
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
wezwaniafunc(2)
. Nie widzę, gdzie to wybiera argumenty wyjściowe.Czy jest jakiś powód, aby nie używać ans (n), takich jak ten:
Daje b = 10 i czy w ten sposób nie byłoby kompatybilne ze wszystkimi wersjami Matlab?
Ponadto działa to w celu uzyskania drugiego argumentu wyjściowego, gdy nie wiesz, ile będzie argumentów! A jeśli to zrobisz:
Wtedy b = 8000! (Musisz zakończyć ~, aby złapać więcej argumentów!)
źródło
size(a)
i[b,c]=size(a)
zwracaj różne rzeczy. Funkcje w MATLAB-ie zmieniają zachowanie na podstawie liczby argumentów wyjściowych.