Rekurencja w LabVIEW
Rekurencja w LabVIEW
Witam,
Próbuję stworzyć VI, który będzie rekurencyjnie dodawał kolejną tablicę do istniejącej (budowa struktury sieci neuronowej). Problem jest taki, że LabVIEW nie pozwala na zagnieżdżenie VI'a w tym samym VI'u. Udało mi się to osiągnąć poprzez referencję i pierwsze uruchomienie działa. Jednak próba uruchomienia pierwszego powtórzenia generuje błąd.
W jaki sposób można to zrobić?
Pozdrawiam
Pierre
Próbuję stworzyć VI, który będzie rekurencyjnie dodawał kolejną tablicę do istniejącej (budowa struktury sieci neuronowej). Problem jest taki, że LabVIEW nie pozwala na zagnieżdżenie VI'a w tym samym VI'u. Udało mi się to osiągnąć poprzez referencję i pierwsze uruchomienie działa. Jednak próba uruchomienia pierwszego powtórzenia generuje błąd.
W jaki sposób można to zrobić?
Pozdrawiam
Pierre
-
- Administrator
- Posty: 1315
- Rejestracja: 30 lip 2003 00:00
- Wersja środowiska: LabVIEW 2015
- Lokalizacja: Ruda Śląska
- Kontakt:
Rekurencja w LabVIEW
Witaj
W VI Properties w sekcji Execution powinieneś zaznaczyć Reentrant execution, co spowoduje, że ponowne odwołanie się do tego VIja tworzy jego kopię i uruchomienie jej.
Pozwala to na równoległe uruchamianie tych samych VIjów.
bogdani
W VI Properties w sekcji Execution powinieneś zaznaczyć Reentrant execution, co spowoduje, że ponowne odwołanie się do tego VIja tworzy jego kopię i uruchomienie jej.
Pozwala to na równoległe uruchamianie tych samych VIjów.
bogdani
Re: Rekurencja w LabVIEW
To wiem i tak jest zrobione.
Opiszę dokładniej na czym polega problem:
Powyższego VI'a wywołuję jako subVI z innego VI'a i uruchamia sie bez problemu. Jeśli nie będę chciał wywoływać go dalej (rekurencyjnie) to program będzie działał. Zostanie dodana jedna warstwa i sterowanie powróci do VI'a głównego. Natomiast jeśli zdecyduje się dodać jeszcze jedną warstwę to otrzymuję komunikat zamieszczony poniżej, gdzie Tworzenie.vi to ten główny a cała aplikacja się zatrzymuje.
Opiszę dokładniej na czym polega problem:
Powyższego VI'a wywołuję jako subVI z innego VI'a i uruchamia sie bez problemu. Jeśli nie będę chciał wywoływać go dalej (rekurencyjnie) to program będzie działał. Zostanie dodana jedna warstwa i sterowanie powróci do VI'a głównego. Natomiast jeśli zdecyduje się dodać jeszcze jedną warstwę to otrzymuję komunikat zamieszczony poniżej, gdzie Tworzenie.vi to ten główny a cała aplikacja się zatrzymuje.
- jogurt_owocowy
- Posty: 1317
- Rejestracja: 30 lis 2004 00:00
- Wersja środowiska: LabVIEW 2015
- Lokalizacja: Kraków
Re: Rekurencja w LabVIEW
No toś mnie vugie uprzedził - akurat napisałeś jak zacząłem robić przykład ] Ale skoro już zrobiłem to go umieszczę.
Mamy kod silni w C:
A tak wygląda jego odpowiednik w LV:
[img]http://www.labview.pl/uploads/veir/recu ... torial.gif[/img]
przy czym w opcjach viaja musi być zaznaczona opcja Reentrant Execution!
Prosta sprawa, ale rodzi się pytanie: skoro się da, to dlaczego nie można zrobić tego po prostu wrzucając bloczek na diagram? Najwyraźniej z jakichś powodów nie chciano otwierać drogi do rekurencji w LV i wypadałoby uszanować tę wolę albo cierpieć wolne, pamięciożerne programy.
Poza tym warto pamiętać, że (jeśli mnie pamięć nie myli) każdy algorytm rekurencyjny da się zapisać w postaci iteracyjnej.
Pozdrawiam ]
Mamy kod silni w C:
Kod: Zaznacz cały
int factorial(int liczba) {
int sil;
if (liczba<0) return 0; /* wywołanie jest bezsensowne, zwracamy 0 jako kod błędu */
if (liczba==0 || liczba==1) return 1;
sil = liczba*silnia(liczba-1);
return sil; }
[img]http://www.labview.pl/uploads/veir/recu ... torial.gif[/img]
przy czym w opcjach viaja musi być zaznaczona opcja Reentrant Execution!
Prosta sprawa, ale rodzi się pytanie: skoro się da, to dlaczego nie można zrobić tego po prostu wrzucając bloczek na diagram? Najwyraźniej z jakichś powodów nie chciano otwierać drogi do rekurencji w LV i wypadałoby uszanować tę wolę albo cierpieć wolne, pamięciożerne programy.
Poza tym warto pamiętać, że (jeśli mnie pamięć nie myli) każdy algorytm rekurencyjny da się zapisać w postaci iteracyjnej.
Pozdrawiam ]
Ostatnio zmieniony 07 sty 2008 22:19 przez jogurt_owocowy, łącznie zmieniany 1 raz.
Re: Rekurencja w LabVIEW
witam
pozdrawiam
pmaj
nie każdy się da i bardzo często rekurencji brakujejogurt_owocowy pisze:Poza tym warto pamiętać, że (jeśli mnie pamięć nie myli) każdy algorytm rekurencyjny da się zapisać w postaci iteracyjnej
pozdrawiam
pmaj
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Mam zawyżone wymagania motywacyjne
Rekurencja w LabVIEW
Dzięki vugie. Po zastosowaniu poleceń jest lepiej ale niestety nie jest dobrze. Komunikat nie wyskakuje, program się nie zatrzymuje ale nie otwiera się kolejny Front panel, na czym mi zależy. W opcjach subVI jest możliwość zaznaczenia opcji 'Show front panel when called' ale niestety przy referencji tego nie ma :/
Czy na to też jest jakiś trik?
Czy na to też jest jakiś trik?
- jogurt_owocowy
- Posty: 1317
- Rejestracja: 30 lis 2004 00:00
- Wersja środowiska: LabVIEW 2015
- Lokalizacja: Kraków
Re: Rekurencja w LabVIEW
No... nie brakuje, bo jest (jak widać) i kto chce, może korzystać.nie każdy się da i bardzo często rekurencji brakuje
A co do tego czy się da czy nie, to kiedyś obiło mi się o uszy na jakimś wykładzie, że każdy algorytm rekurencyjny ma swój iteracyjny odpowiednik. M.in. TUTAJ też tak piszą.
Ostatnio zmieniony 07 sty 2008 23:08 przez jogurt_owocowy, łącznie zmieniany 1 raz.
Re: Rekurencja w LabVIEW
ok, rzeczywiście rekurencji nie brakuje, bo jest.
co do tego ze każdy algorytm się da zapisać: z tego co wiem, to nie da się udowodnić, ze nie każdy algorytm nie może być zapisany iteracyjnie, a nawet da się udowodnić, ze każdy algorytm da się zapisać iteracyjnie. ALE np. problemu przestawiania różnej wielkości klocków z patyka pierwszego na trzeci przy pomocy drugiego (wieże Hanoi) nie udało się zapisać iteracyjnie jeszcze nikomu, natomiast rekurencyjnie to tylko 5 linijek.
pzdrv
co do tego ze każdy algorytm się da zapisać: z tego co wiem, to nie da się udowodnić, ze nie każdy algorytm nie może być zapisany iteracyjnie, a nawet da się udowodnić, ze każdy algorytm da się zapisać iteracyjnie. ALE np. problemu przestawiania różnej wielkości klocków z patyka pierwszego na trzeci przy pomocy drugiego (wieże Hanoi) nie udało się zapisać iteracyjnie jeszcze nikomu, natomiast rekurencyjnie to tylko 5 linijek.
pzdrv
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Mam zawyżone wymagania motywacyjne
- jogurt_owocowy
- Posty: 1317
- Rejestracja: 30 lis 2004 00:00
- Wersja środowiska: LabVIEW 2015
- Lokalizacja: Kraków
Re: Rekurencja w LabVIEW
Jeśli masz rację z tymi wieżami Hanoi to możesz dorzucić swoje trzy grosze do Wikipedii. Jest tam jakieś rozwiązanie iteracyjne na trzy linijki - nie wiem jak z jego poprawnością, a nie mam niestety czasu na sprawdzanie.
Pozdrawiam :]
Pozdrawiam :]
Re: Rekurencja w LabVIEW
Witam
Również nie będę się wgryzał czy jest ono poprawne. To, że ten problem nie jest rozwiązany iteracyjnie usłyszałem od mądrzejszej ode mnie osoby (informatyka) i wziąłem za pewnik, co - jak widzę - może nie być prawdą. Jeżeli jest poprawne tym lepiej, nie mniej jednak jakiś czas temu (2 - 3 lata temu) nie znalazłem fragmentu kodu rozwiązującego go iteracyjnie, stąd nauczyłem się rekurencji
będąc w przekonaniu, że nie każdy kawałek kodu da się iteracyjnie zapisać - mój błąd
pozdrawiam
Również nie będę się wgryzał czy jest ono poprawne. To, że ten problem nie jest rozwiązany iteracyjnie usłyszałem od mądrzejszej ode mnie osoby (informatyka) i wziąłem za pewnik, co - jak widzę - może nie być prawdą. Jeżeli jest poprawne tym lepiej, nie mniej jednak jakiś czas temu (2 - 3 lata temu) nie znalazłem fragmentu kodu rozwiązującego go iteracyjnie, stąd nauczyłem się rekurencji

pozdrawiam
Nie jestem leniwy
Mam zawyżone wymagania motywacyjne
Mam zawyżone wymagania motywacyjne
Re: Rekurencja w LabVIEW
Ciekawie rozwinęła się ta dyskusja 
Nie jestem informatykiem z wykształcenia i nie wiem czy każdy algorytm da się zapisać na oba sposoby. Niemniej chciałem sprawdzić czy LabVIEW obsługuje rekurencyjne wywołania.
Jak na ten czas odpowiedź brzmi: TAK, pod warunkiem że nie będziemy chcieli wyświetlać kolejnego front panelu przy każdym wywołaniu.
Możliwe że ja tego zrobić nie umiem ale jeśli faktycznie istnieje takie ograniczenie to LV ma ode mnie duży minus.
Dzięki za wszystkie wskazówki, a swój program rozwiążę iteracyjnie

Nie jestem informatykiem z wykształcenia i nie wiem czy każdy algorytm da się zapisać na oba sposoby. Niemniej chciałem sprawdzić czy LabVIEW obsługuje rekurencyjne wywołania.
Jak na ten czas odpowiedź brzmi: TAK, pod warunkiem że nie będziemy chcieli wyświetlać kolejnego front panelu przy każdym wywołaniu.
Możliwe że ja tego zrobić nie umiem ale jeśli faktycznie istnieje takie ograniczenie to LV ma ode mnie duży minus.
Dzięki za wszystkie wskazówki, a swój program rozwiążę iteracyjnie

- bartus
- Posty: 141
- Rejestracja: 07 maja 2007 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Wrocław/Żory
Rekurencja w LabVIEW
ale nie uwazasz ze to byloby bez sensu troche? bo jakbys mial rekurencyjnie policzyc np 500 ! to wtedy mialbys 500 paneli otwartych.
Przynajmniej ja tak to widze, zreszta otwarcie front panela nie potrzebnie zuzywa zasoby procesora ;)
Przynajmniej ja tak to widze, zreszta otwarcie front panela nie potrzebnie zuzywa zasoby procesora ;)
Jest pare rzeczy dla których warto zyc - TO,UE i nie zmienia sie nic 

Rekurencja w LabVIEW
@bartus
Przy liczeniu 500! jest to bez sensu, ale jeśli kolejne powtórzenie wymaga zmiany jakiegoś parametru to już zaczyna pojawiać się sens takiego rozwiązania. Nie będę sie upierał, że jest to rozwiązanie najlepsze. Faktem natomiast jest to, że programista powinien ocenić co łatwiej mu zrobić, a oprogramowanie powinno umożliwić mu utworzenie choćby najbardziej wymyślnego rozwiązania.
Ja po prostu byłem ciekaw czy coś takiego się uda, bo w moim przypadku z założenia nie miałoby się to powtarzać więcej razy jak 3 - 4. W tym momencie obojętnie czy będę w pętli otwierał te okienka jedno po drugim czy żeby się otwierały jedno na drugim i razem zamknęły (na co liczyłem).
Przy liczeniu 500! jest to bez sensu, ale jeśli kolejne powtórzenie wymaga zmiany jakiegoś parametru to już zaczyna pojawiać się sens takiego rozwiązania. Nie będę sie upierał, że jest to rozwiązanie najlepsze. Faktem natomiast jest to, że programista powinien ocenić co łatwiej mu zrobić, a oprogramowanie powinno umożliwić mu utworzenie choćby najbardziej wymyślnego rozwiązania.
Ja po prostu byłem ciekaw czy coś takiego się uda, bo w moim przypadku z założenia nie miałoby się to powtarzać więcej razy jak 3 - 4. W tym momencie obojętnie czy będę w pętli otwierał te okienka jedno po drugim czy żeby się otwierały jedno na drugim i razem zamknęły (na co liczyłem).
-
- Posty: 383
- Rejestracja: 17 lis 2006 00:00
- Wersja środowiska: LabVIEW 2009
- Lokalizacja: Warszawa
Re: Rekurencja w LabVIEW
Dodam tylko, że LV 8.5 obsługuje rekurencję, ale tylko dla wywołań wewnątrz klasy.
Widziałem też na LAVA zrobiony XNode, który automatycznie tworzy dynamiczne wywołanie rekurencyjne w dowolnym VI. Ale rekurencja w tej formie jest bardzo nieefektywna.
Widziałem też na LAVA zrobiony XNode, który automatycznie tworzy dynamiczne wywołanie rekurencyjne w dowolnym VI. Ale rekurencja w tej formie jest bardzo nieefektywna.