You are here:
Foswiki
>
Cosmo Web
>
OctavePl
(28 Oct 2005,
BoudRoukema
)
(raw view)
E
dit
A
ttach
%TOC% ---+ zobacz także * %RED% *Jeśli chcesz to integrować w oficjalnym projekcie, bardzo proszę!* * http://cvs.sourceforge.net/viewcvs.py/*checkout*/octave/octave-lang/README%ENDCOLOR% * http://wiki.octave.org/ * WikipediaPl:octave <pre> Lancuchy (Strings) 1 KROTKIE WPROWADZENIE DO PROGRAMU OCTAVE : 1.1 URUCHAMIANIE OCTAVE 1.2 PROSTE PRZYKLADY 1.3 Konwencje 3 TYPY DANYCH 5 Łancuch 9 Zmienne 10 Wyrazenia 12 DYREKTYWY. 18 MatrixManipulations 20 ALGEBRA LINIOWA Appendix B Znane powody występowania błędów LICENCJA (GPL, bo jest tłumaczenie część octave'a) Autory wersji polski: Agnieszka Fidos, Krzysztof Helminiak, Tomasz Kaminski, Mariola Kozak, Rafal Maliszewski, Ola Pospolito, Boud Roukema, Leszek Sankiewicz, Jan Wroniszewski, Pawel Zielinski Było to tłumaczenie woluntarne w kadrze kursu ,,metody matematyczny w astronomii" w Centrum Astronomii UMK, wprowadzony w lato 2003r. </pre> ---+ 1 KROTKIE WPROWADZENIE DO PROGRAMU OCTAVE : --------------------------------------------------- <pre> KROTKIE WPROWADZENIE DO PROGRAMU OCTAVE : Niniejsza instrukcja pozwala uruchomic oraz zainstalowac zlacze GNU Octave; informuje takze, jak donosic o bledach programu. GNU Octave jest wysoko zaawansowanym jezykiem, przeznaczonym przede wszystkim do obliczen numerycznych. Jako ze praca z Octave polega na wpisywaniu polecen z klawiatury, stanowi on dogodne narzedzie do rozwiazywania zarówno liniowych jak i nieliniowych problemów numerycznych; mozliwe jest takze uzycie programu do nieprzewidzianych przez jego twórców eksperymentów numerycznych. Moze byc takze zastosowany jako jezyk do tworzenia tzw. batch'ów (plików wsadowych). GNU Octave jest softwarem do wolnego rozpowszechniania. Mozna go rozpowszechniac i / lub modyfikowac po spelnieniu warunków, okreslonych przez licencje GNU General Public License, która zostala opublikowana przez Free Software Fundation. GPL i jest dolczona do oryginalu niniejszej instrukcji w czeci zatytulowanej: GNU GENERAL PUBLIC LICENSE. * Running Octave | UruchomianieOctave * Simple Examples | ProstePrzyklady *Creating a Matrix | Tworzenie macierzy *Matrix Arithmetic | Arytmetyka macierzy *Solving Linear Equations | Rozwiazywanie rownan liniowych *Integrating Differential Equations | Calkowanie rownan rozniczkowych *Producing Graphical Output | Tworzenie graficznej postaci wyniku *Editing What You Have Typed | edytowanie wczesniejszych plecen *Getting Help | Zasieganie pomocy o **Conventions | Konwencje** *Fonts | Czcionki *Evaluation Notation |Notacja przy wyznaczaniu wartosci *Error Messages | Informacje o bledach *Format of Descriptions | Struktura opisu **-A Sample Function Description | Prosty przyklad opisu funkcji **-A Sample Command Description | Prosty przyklad opisu komendy **-A Sample Variable Description |Prosty przyklad opisu zmiennej Instrukcja odpowiada wersji Octave 2.0.5. </pre> ---+ 1.1 URUCHAMIANIE OCTAVE --------------------------------------------------- <pre> URUCHAMIANIE OCTAVE W wiekszosci systemów komenda wywolujaca program Octave jest komenda shellowa `octave'. Octave manifestuje sie wstepnym komunikatem, po czym szybko informuje o swej gotowosci do pracy i mozna rozpoczac wpisywanie komend. W razie pojawienia sie problemów mozna przerwac prace Octave przez jednoczesne wcisniecie klawiszy Control-C (co w skrócie oznaczac bedziemy przez C-c ). Wykonanie tej czynnosci spowoduje powrót do trybu wpisywania komend, co program zamanifestuje pojawieniem sie znaku zachety. By wyjsc z programu nalezy za znakiem zachety wpisac quit lub exit. W systemach, które wspomagaja kontroli pracy, mozna zawiesic proces Octave wysylajac sygnal SIGTSTP wciskajac C-z. </pre> ---+ 1.2 PROSTE PRZYKLADY --------------------------------------------------- <pre> PROSTE PRZYKLADY Ponizsze rozdzialy beda opisywaly bardzo szczegolowo wlasciwosci Octave, jednak zanim do tego dojdzie, pomocne moze okazac sie podanie kilku mozliwosci programu Octave. Jesli po raz pierwszy masz stycznosc z Octave, polecam przecwiczyc podane przyklady jako wstep do obslugi programu. Linie oznaczone przez np. `octave:13>' sa liniami, w które wpisuje sie kolejne polecenia. Kazda linie konczyc powinno przejscie do kolejnej linii przez wcisniecie return. Octave zareaguje dajac odpowiedz lub wyswietlajac wykres. TWORZENIE MACIERZY By stworzyc nowa macierz i zapisac ja jako zmienna, tak by moc odwolac sie do niej pozniej, napisz komende: octave:1> a = [ 1, 1, 2; 3, 5, 8; 13, 21, 34 ] Octave odpowie wyswietlajac macierz w rownych kolumnach. Zakonczenie komendy srednikiem poinformuje program Octave, by nie wyswietlal rezultatu komendy. Np.: octave:2> b = rand (3, 2); utworzy macierz o trzech wersach i dwoch kolumnach, ktorej kazdy element bedzie mial przypadkowa wartosc z przedzialu miedzy zerem a jedynka. By wyswietlic wartosc jakiejkolwiek zmiennej, nalezy po prostu napisac jej nazwe. Np., by wyswietlic wartosc zapisanej w pamieci macierzy b , nalezy wpisac komende: octave:3> b ARYTMETYKA MACIERZY Stosowana w jezyku Octave notacja jest bardzo wygodna do zapisu arytmetyki macierzy. Np. by przemnozyc macierz przez wartosc skalarna, nalezy wpisac komende: octave:4> 2 * a Chcac przemnozyc dwie macierze a i b , wpisz po prostu: octave:5> a * b ROZWIAZYWANIE ROWNAN LINIOWYCH By rozwiazac uklad rownan liniowych ax = b , mozna uzyc operatora dzielenia "/": octave:7> a \ b Jest to rownowazne z zapisem inv (a) * b, ale unika procesu bezposredniego obliczania macierzy odwrotnej. Jesli macierz ma tylko jeden wspolczynnik, Octave wyswietli informacje ostrzegawcza i obliczy najmniejsze standardowe rozwiazanie. CALKOWANIE ROWNAN ROZNICZKOWYCH Octave ma wbudowana funkcje do rozwiazywania nieliniowych rownan rozniczkowych postaci: dx -- = f (x, t) dt z warunkiem poczatkowym: x(t = t0) = x0 Calkowanie rownan tej postaci w Octave, nalezy poprzedzic zdefiniowaniem funkcji f(x,t), co jest czynnoscia wzglednie prosta. Odbywa sie to przez wpisanie bezposrednio postaci funkcji ( tzw. ciala funkcji ) w linii polecen . Ponizej zapisano komendy, które definiuja przykladowa funkcje. Zauwazyc mozna, ze podczas wpisywania funkcji, Octave manifestuje sie przez inny znak zachety, co wskazywac ma, ze program czeka na dokonczenie procesu definiowania funkcji: octave:8> function xdot = f (x, t) > > r = 0.25; > k = 1.4; > a = 1.5; > b = 0.16; > c = 0.9; > d = 0.8; > > xdot(1) = rx(1)(1 - x(1)/k) - ax(1)x(2)/(1 + b*x(1)); > xdot(2) = cax(1)x(2)/(1 + bx(1)) - d*x(2); > > endfunction Zadajac warunki poczatkowe: x0 = [1; 2]?; i zestaw wartosci czasu podanych, jako wektor ( zapisany w postaci kolumny ) - zauwaz, ze pierwsza z wartosci czasu odpowiada warunkom poczatkowym zadanym powyzej; t = linspace (0, 50, 200)'; Latwo wycalkowac uklad rownan rozniczkowych: x = lsode ("f", x0, t); Funkcja lsode uzywa Livermore Solver dla Zwyklych Rownan Rozniczkowych ( Ordinary Differential Equations), opisanych w pozycji: A. C. Hindmarsh, ODEPACK, a Systematized Collection of ODE Solvers, w: Scientific Computing, R. S. Stepleman et al. (Eds.), North-Holland, Amsterdam, 1983, strony 55--64. TWORZENIE GRFICZNEJ POSTACI WYNIKU By przedstawic graficzna postac wyniku wczesniej podanego przykladu, uzyc nalezy komendy: plot (t, x) Jezli uzywasz X Window System, Octave automatycznie utworzy oddzielne okno i przedstawi w nim wykres. Jezli pracujesz na innym terminalu, musisz o tym poinformowac Octave. Wpisz komende: gset term by zobaczyc liste uzywanych rodzajow terminali. Octve uzywa gnuplot do wyswietlania wykresow i moze to robic na kazdym terminalu zaopatrzonym wlasnie w gnuplot. By zapisac wynik graficzny komendy w pliku - zamiast jego bezposredniej edycji na terminalu - uzyc nalezy zestawu nastepujacych komend: gset term postscript gset output "foo.ps" replot Zestaw takich polecen bedzie takze uzyteczny do zapisu innych danych wyjsciowych. Zazwyczaj, kiedy w wyniku pracy z programem uzyskasz juz wykres, powinienes byc zainteresowany jego wydrukowaniem. Komenda gset prowadzi do podprocesu gnuplot , który umozliwia stworzenie pliku wyjscia, odpowiedniego dla uzywanej drukarki. Mozesz tez usunac plik posredniczacy, uzywajac nastepujacych komend: gset term postscript gset output "|lpr nazwa_twojej_drukarki" replot EDYTOWANIE WCZESNIEJSZYCH POLECEN W linii polecen programu Octave mozesz sie odwolac do wczesniejszych polecen, mozesz je reedytowac uzywajac popularnego edytora Emaks albo vi. Domyslne ustawienia wykorzystuja komendy edytora Emaks. By np. przywolac ostatnia komende, wcisnij Control-p. Jednoczesne wcisniecie klawiszy spowoduje przywrocenie linii komend wejscia. C-n spowodujeprzejscie do nastepnej linii, C-b cofnie kursor w linii, C-f spowoduje ruch kursora do przodu itd... Kompletny opis zdolnosci edycji wczesniej zapisanych linii polecen znajduje sie w niniejszej instrukcji - w rozdziale CommandLineEditing? . ZASIEGANIE POMOCY Octave ma obszerna funkcje pomocy (help). Ta sama dokumentacja, która dostepna jest w formie druku jest takze dostepna w formie podpowiedzi programowej (obydwie pochodza od tego samego pliku zrodlowego). Aby uzyskac dobra pomoc, nalezy wczesniej znac nazwe komendy, ktorej ma sie zamiar uzyc. Owa nazwa funkcji nie zawsze musi byc oczywista i dobrym poczatkiem jest po prostu napisanie help. Dzieki tej komendzie pokazane zostana uzytkownikowi wszystkie operatory, slowa kluczowe, funkcje, wbudowane zmienne i pliki funkcyjne. Wiecej informacji na temat kazdego z wypisanych obiektow mozna uzyskac przez dolaczenie do komendy help nazwy; np.: help plot wyswietli tekst pomocydla funkcji plot. Tekst pomocy Octave moze byc na tyle dlugi, ze nie zmiesci sie na ekranie .Wyjsciem z sytuacji jest uzycie komendy less lub more. Wcisnij RET , by przejsc do nastepnej linii, SPC by przejsc na nastepna strone lub - by wyjsc q ze strony. Octave zazwyczaj uzywa oddzielnego programu, zwanego Info. Zasieganie pomocy przy uzyciu Info opisane jest w niniejszej instrukcji w rozdziale Komendy Pomocy (org. Commands for Getting Help). </pre> ---+ 1.3 Konwencje --------------------------------------------------- <pre> KONWENCJE Ta czesc wyjasnia konwencje stosowane w notacji, uzytej w niniejszej instrukcji. Mozna te jej czesc pominac i odwolac sie do niej pozniej. CZCIONKI Przyklady kodu Octave zapisane sa inna czcionka, np. svd (a). Nazwy, reprezentujace argumenty lub zmienne {metasyntactic variables} natomiast, wystepuja w ponizszym tekscie w postaci: first-number. Komendy, które wpisywane sa za shellowym znakiem zachety, wpisywac bedziemy w nastepujacy sposób: `octave --no- init-file'. Komendy wpisywane w programie Octave wyrozniac bedziemy postacia: foo --bar --baz. Specjalne klawisze klawiatury oznaczac bedziemy natomiast tak: ANY. NOTACJA PRZY WYZNACZANIU WARTOSCI W przykladach podanych w instrukcji wyniki w nich otrzymane oznaczane sa operatorem `=>';np. sqrt (2) => 1.4142 co nalezy rozumiec jako: "oszacowanie wartosci pierwiastka kwadratowego z 2 daje 1.4142";. Wpewnych przypadkach wartosci macierzy okreslone okreslone przez wyrazenie, sa wyswietlane w postaci: [1, 2; 3, 4]? == [1, 3; 2, 4]? => [ 1, 0; 0, 1 ] W innych przypadkach wyswietlane sa w nastepujacej formie: eye (3) => 1 0 0 !0 1 0 !0 0 1 by wsposob przejrzysty pokazac strukture wyniku. Czasami, by opisac jedno wyrazenie, przyrownujemy je do innego wyrazenia, dajacego ten sam wynik.rownosc wyrazen oznaczana jest przez podwojny znak rownosci `==', np.: rot90 ([1, 2; 3, 4]?, -1) == rot90 ([1, 2; 3, 4]?, 3) == rot90 ([1, 2; 3, 4]?, 7) Wiele przykladow w instrukcji wyswietla jako wyznaczona wartosc tekst. Taki wynik oznaczac będziemy przez apostrofy isymbol: `-|.Zwracana wartosc liczowa jako obliczona z wyrazenia (tutaj 1), jest wyswietloana z operatorem `=> i w oddzieknej linii: printf ("foo %s\n", "bar") -| foo bar => 1 MELDUNKI O BLEDACH Niektóre przyklady sygnalizuka bledy. Zazwyczaj objawia sie to na twoim terminalu w postaci meldunku o bledzie. Meldunki takie sa wypisywane ze slowem error na poczatku linii: struct_elements ([1, 2; 3, 4]?) error: struct_elements: wrong type argument `matrix' STUKTURA OPISU Funkcje, komendy i zmienne sa opisywane w jednolity sposob. Pierwsza linia opisu zawiera nazwe struktury i - jesli trzeba - takze rodzaj argumentow, na które dziala. Rodzaj obiektu, czyli funkcja, komenda, zmienna itd., wskazany jest na poczatku linii. Dalszy opis nastepuje w kolejnych liniach; czasem zawiera takze przyklady. PRZYKLAD OPISU FUNKCJI W opisie funkcji najpierw nalezy wskazac jej nazwe. W tej samej linii umieszcza sie liste jej parametrow. Nazwy uzyte do okreslenia parametrow powinny byc konsekwentnie uzyte w czesci zwanej cialem funkcji. Ponizej zamieszczony jest opis wymyslonej funkcji foo: Function: foo (x, y, ...) Funkcja foo odejmuje x od y i dodaje do tego wyniku wartosc kolejnych argumentow. Jezli y nie jest podany, w jego miejsce domyslnie zostaje uzyta liczba 19. foo (1, [3, 5]?, 3, 9) => [ 14, 16 ] foo (5) => 14 bardziej ogolnie: foo (w, x, y, ...) == x - w + y + ... Program oczekuje, ze kazdy parametr, którego symbol zawiera nazwe typu zmiennej (np. integer, integer1 lub matrix ), bedzie wlasnie zmienna tego typu. Parametr nazwany object moze byc dowolnego typu. Natomiast charakter wspolczynnikow o nazwach innych rodzajow (np. new_file), jest rozstrzygany na podstawie ich uzycia w opisie ciala funkcji. W niektórych czesciach charakteryzujacych ogolnie funkcje, typy jej parametrow okreslane sa na samym poczatku opisu. Funkcje w Octave moga byc zdefiniowane na wiele roznych sposobow. Kategoria nazwy funkcji moze zawierac w sobie nazwe innej, wskazujac w jaki sposób dana funkcja jest zdefiniowana. Tak skonstruowane oznaczenie zawiera: * Funkcje wewnetrzne Funkcja juz napisana w takich jezykach jak C++, C lub Fourtran i bedaca elementem programu Octave. * Funkcje ladowalne Funkcja juz napisana w takich jezykach jak C++, C lub Fourtran, ale w odniesieniu do innych funkcji, dostep do niej opiera si? na polaczeniu dynamicznym (zobacz Funkcje Laczenia Dynamicznego) i nastepuje tylko wówczas, gdy podczas dzialania programu Octave funkcja jest potrzebna. * Funkcje z pliku Funkcje zdefiniowane w jezyku Octave i zapisane odpowiednio w pliku. Zobacz dzial Funkcje z pliku. * Funkcje mapujace (odwzorowujace) Funkcje dzialajace na kolejnych elementach macierzy lub wektora. PRZYKLADOWY OPIS KOMENDY Konstrukcja definiowania komend jest analogiczna do budowy funkcji z ta tyklo roznica, ze slowo "funkcja" ("function") zastapic nalezy slowem "komenda" ("command"). Komendy sa funkcjami, które moga byc wywolane bez podania argumentow w nawiasach. Ponizej znajduje sie przykladowy opis komendy programu Octave o nazwie cd: Command: cd dir Command: chdir dir Zmienia ona bierzacy katalog na dir (glowny). Np. cd ~/octave zmienia bierzacy katalog na `~/octave' . Jesli katalog, do którego komenda sie odnosi, nie istnieje, program powiadamia uzytkownika o bledzie, a bierzacy katalog zostaje nie zmieniony. PRZYKLADOWY OPIS ZMIENNEJ Zmienna jest nazwa obiektu, ktory moze otrzymac wartosc. Chociaz wartosc kazdej zmiennej moze byc dowolnie okreslona przez uzytkownika, to stndardowo istnieja tzw. zmienne wbudowane (built-in variables). Zazwyczaj istnieja po to, aby uzytkownicy mogli je zmieniac (?!) w sposob okreslony przez dzialanie programu Octave (zmienne wbudowane sa tez nazywane opcjami uzytkownika). Zwykle zmienne i zmienne wbudowane sa definiowane w ten sam sposob jak funkcje tyle, ze bez argumentow.ponizej znajduje sie opis wymyslonej zmiennej rob_co_chce_nie_co_mowie (w orginale: do_what_i_mean_not_what_i_say ): Built-in Variable: rob_co_chce_nie_co_mowie Jesli wartosc zmiennej jest rozna od zera, Octave zrobi to, czego aktualnie chcesz, nawet jesli zapisales nic nie znaczaca liste komend ;) Inne opisy zmiennych maja podobna postac, ale przy definiowaniu zwyklych zmiennych slowa "Built-in Variable" (zmienna wbudowana), nalezy zastapic slowem "Variable" (zmienna); natomiast przy definiowaniu stalych, których wartosci nie mozna zmieniac odpowiednio nalezy napisac `Constant'. </pre> ---+ 5 Łancuch --------------------------------------------------- <pre> ******************** Lancuchy (Strings) ******************** Stala znakowa sklada sie z ciagu znakow zawartych w podwojnym lub pojedynczym cudzyslowu. Na przyklad oba z ponizszych wyrazen : "papuga" papuga reprezentuja lancuch papuga. Lancuchy w Octave moga byc dowolnej dlugosci. Pojedynczy cudzyslow jest rowniez uzywany do transponowania operatorow (patrz sekcja operatory arytmetyczne), natomiast podwojny cudzyslow nie ma innego zastosowania w Octave, tak wiec lepiej uzywac wlasnie go do oznaczania lancuchow. Niektore znaki nie moga byc uzyte doslownie w stalej znakowej. Zamiast nich trzeba uzyc sekwencji specjalnej, w ktorej znak jest poprzedzony znakiem backslash (�\�). Jednym z zastosowan sekwencji specjalnych jest uzycie podwojnego lub pojedynczego cudzyslowu w stalej znakowej, ktora zostala wlasnie zdefiniowana za pomoca podwojnego lub pojedynczego cudzyslowu. Poniewaz zwykly podwojny cudzyslow konczy lancuch, musisz uzyc sekwencji specjalnej �\�� aby cudzyslow byl czescia lancucha. Znak backslash jest kolejnym znakiem, ktory nie moze byc uzyty normalnie. Musisz uzyc �\\� aby wstawic pojedynczy backslash do lancucha. Tak wiec lancuch, ktory zawiera dwa znaki �\ moze byc zapisany �\�\\� lub ��\\�. Analogicznie lancuch, ktory zawiera dwa znaki �\ moze byc zapisany �\�\\� lub �' \\�. Kolejnym zastosowaniem backslash-a jest reprezentowanie niedrukowalnych znakow takich jak znak nowej linii. Nic nie powstrzyma cie od pisania wiekszosci z tych znakow bezposrednio w stalych znakowych, jesli to zrobisz moga wygladac okropnie. Ponizej znajduje sie lista sekwencji specjalnych w Octave. Sa takie same jak te uzywane w jezyku C. \\ Reprezentuje backslash �\� \� Reprezentuje podwojny cudzyslow ��� \� Reprezentuje pojedynczy cudzyslow ��� \a Reprezentuje glosnik systemowy, Ctrl-g, kod ASCII 7 \b Reprezentuje backspace, Ctrl-h, kod ASCII 8 \f Reprezentuje formfed (wysuwa kartke z drukarki), Ctrl-l, kod ASCII 2 \n Reprezentuje nowa linie, Ctrl-j, kod ASCII 10 \r Reprezentuje powrot karetki, Ctrl-m, kod ASCII 13 \t Reprezentuje poziomy tabulator, Ctrl-i, kod ASCII 9 \v Reprezentuje pionowy tabulator, Ctrl-k, kod ASCII 11 Lancuchy moga byc laczone uzywajac notacji definiowania macierzy. Na przyklad wyrazenie [ �foo�,�bar�,�baz�]? tworzy lancuch foobarbaz. Zobacz rozdzial Numeryczne typy danych, aby dowiedziec sie wiecej o tworzeniu macierzy *************** Tworzenie lancuchow *************** Funkcja wlaczana : blanks(n) Zwraca lancuch pusty lancuch dlugosci n. Funkcja wlaczana : int2str(n) Funkcja wlaczana : num2str(x) Zamienia numer na lancuch. Te funkcje nie sa zbyt elastyczne, za to sa kompatybilne z MATLAB-em. Dla lepszej kontroli wynikow uzywaj sprintf (zobacz rozdzial formatowane wyjscie). Funkcja wbudowana : setstr(x) Zamienia macierz na lancuch. Kazdy element macierzy jest konwertowany na odpowiadajacy mu znak ASCII. Na przyklad : Setstr([97, 98, 99]?) =>�abc� Funkcja wlaczana : strcat(s1,s2,...) Zwraca lancuch zawierajacy wszystkie parametry sklejone. Na przyklad : s = [ �ab�;�cde�]?; strcat(s,s,s) =>�ab ab ab � =>�cdecdecde� Wbudowana zmienna : string_fil_char Wartosc tej zmiennej jest uzywana do zamiany wszystkich lancuchow w macierzy na lancuchy od identycznej dlugosci. Powinna byc pojedynczym znakiem. Domyslna wartoscia jest � � (spacja). Na przyklad, string_fil_char = �X�; [ �these�; �are�; �strings� ]? =>�theseXX� =>�areXXXX� =>�strings� Funkcja wlaczana : str2mat(s_1, ..., s_n) Zwraca macierz zawierajaca lancuchy s_1, ..., s_n jako wiersze. Kazdy lancuch jest dopelniany odstepami tak by stworzyc macierz, w ktorej kazdy element ma taka sama dlugosc. Uwaga: Ta funkcja jest wzorowana na MATLAB-ie. W Octave mozesz stworzyc macierz lancuchow przez [s_1; ...; s_n]? nawet jesli lancuchy nie sa tej samej dlugosci. Funkcja wbudowana : isstr(a) Zwraca 1 jesli a jest lancuchem. W przeciwnym wypadku zwraca 0. *************** Wyszukiwanie i zamiana *************** Funkcja wlaczana : deblank(s) Usuwa znaki odstepu z lancucha s. Funkcja wlaczana : findstr(s,t,overlap) Zwraca wektor, ktorego wspolrzednymi sa wszystkie wystapienia lancucha krotszego w dluzszym. Jezeli opcjonalny argument �overlap� jest nie zerowy, to zwrocony wektor moze zawierac pozycje kolidujace (ustawione domyslnie). Na przyklad, findstr(�ababab�,�a�) =>[ 1, 3, 5 ]? findstr(�abababa�, �aba�, 0) =>[ 1, 5 ]? Funkcja wlaczana : index(s,t) Zwraca pozycje pierwszego wystapienia lancucha t w lancuchu s, lub 0 jesli s nie zawiera t. Na przyklad, idex (�Teststring�,�t�) =>4 Uwaga : Tej funkcji nie uzywa sie z tablicami lancuchow. Funkcja wlaczana : rindex(s,t) Zwraca pozycje ostatniego wystapienia lancucha t w lancuchu s, lub 0 jesli s nie zawiera t. Na przyklad, idex (�Teststring�,�t�) =>6 Uwaga : Tej funkcji nie uzywa sie z tablicami lancuchow. Funkcja wlaczana : split(s,t) Dzieli lancuch s na kawalki, separatorem jest t. Wynik jest zwracany jako tablica lancuchow, w ktorej lancuch jest dopelniany odstepami tak by stworzyc macierz, w ktorej kazdy element ma taka sama dlugosc. Na przyklad, split (�Test string�,�t�) =>�Tes � =>" s � =>�ring� Funkcja wlaczana : strcmp(s1, s2) Porownuje dwa lancuchy, zwraca 1 jezeli sa takie same, lub 0 w przeciwnym wypadku. Uwaga: Z uwagi na kompatybilnosc z MATLAB-em, funkcja strcmp zwraca 1 gdy lancuchy sa rowne, 0 w przeciwnym przypadku. Jest to dzialanie odwrotne do odpowiedniej funkcji z biblioteki jezyka C. Funkcja wlaczana : strrep(s, x, y) Zamienia wszystkie wystapienia lancucha x w lancuchu s lancuchem y. Na przyklad, strrep (�This is a test string�,�is�,�&%$�) =>�Th&%$ &%$ a test string� Funkcja wlaczana : substr(s, beg, len) Zwraca obciecie lancucha s zaczynajace sie od pozycji beg i majace len znakow. Na przyklad, substr(�This is a test string�, 6, 9) =>�is a test� Uwaga: Ta funkcja jest wzorowana na AWK-u mozesz uzyskac ten sam rezultat przez s (beg : (beg + len �1)) *************** Konwersje lancuchow *************** Funkcja wlaczana : bin2dec(s) Zwraca dziesietna wartosc odpowiadajaca binarnej wartosci reprezentowanej przez lancuch 0 i 1. Na przyklad, Bin2dec(�1110�) =>14 Funkcja wlaczana : dec2bin(n) Zwraca binarna wartosc odpowiadajaca nieujemnej dziesietnej liczbie n jako lancuch 0 i 1. Na przyklad, dec2bin(14) =>�1110� Funkcja wlaczana : dec2hex(n) Zwraca szesnastkowa wartosc odpowiadajaca nieujemnej dziesietnej wartosci n, jako lancuch. Na przyklad, dec2hex (2748) =>�abc� Funkcja wlaczana : hex2dec(s) Zwraca dziesietna wartosc odpowiadajaca szesnastkowej wartosci przechowywanej w lancuchu s. Na przyklad, hex2dec (�12B�) =>299 Funkcja wlaczana : str2num(s) Zamienia lancuch s na liczbe. Funkcja wlaczana : toascii(s) Zwraca reprezentacje kodow ASCII lancucha jako macierz. Na przyklad, toascii (�ASCII�) =>[ 65, 83, 67, 73, 73 ]? Funkcja wlaczana : tolower(s) Zwraca kopie lancucha s, w ktorej kazda wielka litera jest zastepowana przez odpowiadajaca jej mala litere. Znaki nie bedace literami sa pozostawiane bez zmian. Na przyklad, tolower (�MiXeD cAsE 123�) =>�mixed case 123� Funkcja wlaczana : toupper(s) Zwraca kopie lancucha s, w ktorej kazda mala litera jest zastepowana przez odpowiadajaca jej wielka litere, Znaki nie bedace literami sa pozostawiane bez zmian. Na przyklad, toupper (�MiXeD cAsE 123�) =>�MIXED CASE 123� Funkcja wbudowana : undo_string_escapes(s) Zamienia specjalne znaki w lancuchu na odpowiednie sekwencje specjalne. Na przyklad wyrazenie bell = �\a� Przypisuje zmiennej lancuchowej znak alarmu (Ctrl-g, kod ASCII 7). Jezeli ten lancuch jest drukowany, system piknie glosnikiem systemowym (jesli jest to mozliwe). Jest to normalnie pozadane zachowanie, czasami jednak uzyteczna jest mozliwosc drukowania oryginalnej reprezentacji lancucha, z specjalnymi znakami zastapionymi przez ich sekwencje specjalne. Na przyklad, undo_string_escapes (bell) =>�\a� Wbudowana zmienna : implict_num_to_str_ok. Jezeli wartosc implict_num_to_str_ok. jest niezerowa, to konwersja liczb na ich znakowe odpowiedniki jest dozwolona, gdy lancuchy sa tworzone przy uzyciu lancuchow i liczb w notacji macierzowej. W przeciwnym przypadku komunikat o bledzie jest drukowany i sterowanie wraca do wyzszego poziomu. Domyslna wartoscia jest 0. Na przyklad, [ �f�, 111, 111 ]? =>�foo� Wbudowana zmienna : implict_str_to_num_ok. Jezeli wartosc implict_str_to_num_ok. jest niezerowa, to konwersja lancucha na liczbowe odpowiedniki jest dozwolona. W przeciwnym przypadku komunikat o bledzie jest drukowany i sterowanie wraca do wyzszego poziomu. Domyslna wartoscia jest 0. *************** Znakowe klasy funkcji *************** Octave dostarcza nastepujace klasy funkcji znakowych wzorowanych na funkcjach z standardowej biblioteki jezyka C. Wszystkie one operuja na tablicach znakowych i zwracaja macierze zbudowane z 0 i 1. Niezerowe elementy wskazuja ze warunek byl spelniony dla odpowiedniego znaku w tablicy znakowej. Na przyklad, isalpha (�!Q@WERT^Y&�) =>[ 0, 1, 0, 1, 1, 1, 1, 0, 1, 0 ]? Funkcja : isalnum(s) Zwraca 1 dla znakow, ktore sa literami lub cyframi (isalpha(a) or isdigit(1) is true). Funkcja : isalpha(s) Zwraca 1 dla znakow, ktore sa litermi . Funkcja : isascii(s) Zwraca 1 dla znakow, ktorych kod ASCII jest z przedzialu od 0 do 127. Funkcja : iscntrl(s) Zwraca 1 dla znakow kontrolnych. Funkcja : isdigit(s) Zwraca 1 dla znakow, ktore sa cyframi dziesietnymi. Funkcja : isgraph(s) Zwraca 1 dla drukowalnych znakow (ale nie dla znakow odstepu). Funkcja : islower(s) Zwraca 1 dla znakow, ktore sa malymi literami. Funkcja : issprint(s) Zwraca 1 dla drukowalnych znakow (takze dla znakow odstepu). Funkcja : ispunct(s) Zwraca 1 dla znakow interpunkcyjnych. Funkcja : isspace(s) Zwraca1 dla bialych znakow (spacja, formfeed, znak nowej linii, powrot karetki, poziomy i pionowy tabulator). Funkcja : isupper(s) Zwraca1 dla wielkich liter. Funkcja : isxdigit(s) Zwraca 1 dla znakow, ktore sa szesnastkowymi cyframi. </pre> ---+ 3 TYPY DANYCH --------------------------------------------------- <pre> ** TYPY DANYCH ** Wszystkie wersje Octave zawieraja pewna ilosc wbudowanych (zdefiniowabych) typow danych, wliczajac rzeczywiste i zespolone skalary i macierze, lancuchy znakow i typ strukturalny. Mozliwe jest rowniez zdefiniowanie nowych, specjalnych typow przez napisanie kilku linijek kodu C++. W niektorych systemach nowe typy danych moga byc ladowane na bierzaco w trakcie pracy, wiec nie ma potrzeby przekompilowania Octave tylko dla dodania nowego typu. Aby dowiedziec sie wiecej na temat dynamicznie laczonych zawartosci Octave'a, sprawdz [dynamically linked functions]. W rozdziale [Definiowanie typow danych]? znajdziesz informacje, co zrobic aby stworzyc nowy typ danych dla Octave. WBUDOWANE TYPY DANYCH Standardowo zdefiniowanye typy to rzeczywiste i zespolone skalary i matryce, {ranges}, lancuchy znakowe i typ strukturalny. Dodatkowe typy moga byc dolaczone w przyszlych wersjach programu. Jesli potrzebujesz specjalnego typu danych, ktory nie jest aktualnie dostepny jako wbudowany, mozesz stworzyc swoj wlasny typ i {contribute} do dystrybucji w pozniejszych wersjach Octave. OBIEKTY NUMERYCZNE Zdefiniowane w Octave obiekty nueryczne zawieraja rzeczywiste i zespolone skalary i macierze. Sa ustalone, jako liczby o podwojnej precyzji (double precision numbers). W systemach, uzywajacych formatu rzeczywistego IEEE, moga byc ustalane wartosci w zakresie od 2.2251e-308 do 1.7977e+308, a wzgledna precyzja dochodzi do 2.2204e-16. Dokladne wartosci sa zwracane {respectively} przez zmienne realmin , realmax i eps . Obiekty macierzowe moga byc dowolnego rozmiaru, ktory mozna dowolnie zmieniac w trakcie pracy. Latwo jest otrzymac pojedynczy rzad, kolumne, czy podmacierz (minor), uzywajac zestawu pomocnych {indexing features}. Sprawdz rozdzial [Wyrazenia indeksowane]? Aby uzyskac wiecej informacji sprawdz rozdzial [Typy Danych Numerycznych]?. LANCUCHY Lancuchy znakowe w Octave skladaja sie z ciagu znakow zamknietych w cudzyslowiu pojedynczym (` `) lub podwojnym (" "). {Internally} Octave interpretuje lancuchy jako macierze znakow. Wszystkie operacje indeksowane, dzialajace na macierzach, dzialaja rowniez na lancuchach. Aby uzyskac wiecej informacji sprawdz rozdzial [Lancuchy]?. OBIEKTY TYPU STRUKTURALNEGO Typ strunturalny jest pomocny przy laczeniu obiektow roznych typow. Bierzaca implementacja uzywa {associative} tablicy z {indicies limited to strings}, ale sama skladnia jest podobna do struktur w jezyku C. Aby uzyskac wiecej informacji, sprawdz rozdzial [Struktury Danych]?. TYPY DANYCH UZYTKOWNIKA Mam nadzieje, ze kiedys umieszcze kompletny opis mechanizmów Octave'a pozwalajacych uzytkownikowi definiowac wlasne typy danych. Zanim to sie stanie, zajrzyjcie do ov.h , ops.h i innych powiazanych plikach w katalogu src . ROZMIARY OBIEKTOW Nastepujace funkcje pozwalaja okreslic rozmiary zmiennych i wyrazen. Funkcje te zdefiniowane dla wszystkich obiektow. Zwracaja -1 gdy operacja nie ma sensu. Na przyklad, typ strukturalny w Octave nie posiada rzedow ani kolumn, wiec funkcje rows i columns zwroca -1 dla tego typu argumentow. * columns (a): Zwraca liczbe kolumn macierzy a * rows (a): Zwraca liczbe rzedow a * length (a): Zwraca liczbe rzedow lub kolumn a w zaleznosci, ktora wartosc jest wieksza. * size (a,n): Zwraca liczbe rzedow i kolumn macierzy a. Z jednym argumentem wejsciowym i jednym wyjsciowym, zwracany jest wektor zlozony z 2 elementow. Gdy dane sa dwa argumenty wejsciowe, liczba rzedow jest przypisana do pierwszego, a liczba kolumn do drugiego. Na przyklad: 'size ([1, 2; 3, 4; 5, 6]?)' ' => [3, 2]?' '[nr, nc]? = size([1, 2; 3, 4; 5, 6]?)' => nr = 3 => nc = 2 Jesli jako drugi argument podane bedzie 1 lob 2, funkcja zwroci odpowiednio liczbe wierszy lub kolumn. 'size ([1, 2; 3, 4; 5, 6]?, 2)' => 2 zwraca liczbe kolumn podanej macierzy. * isempty (a): Zwraca 1 gdy a jest pusta macierza, tzn.gdy liczba wierszy, lub kolumn (lub obu) jest rowna 0. W przeciwnym razie funkcja ta zwraca 0. </pre> ---+ 9 Zmienne --------------------------------------------------- <pre> Zmienne Zmienne pozwalaja na nadawanie nazw wartosciom i odwolywanie sie do nich pozniej. Zdazyliscie juz zauwazyc zmienne w wielu przykladach. Oznaczenie zmiennej musi byc sekwencja liter, cyfr lub twardych spacji, ale nie moze rozpoczynac sie od cyfry. Octave nie nazuca limitu w dlugosci oznaczenia zmiennej, ale zadko spotyka sie zmienne o oznaczeniu dluzszym niz 30 znakow. ((enforce)). Nastepujace przytklady sa prawidlowym oznaczeniem zmiennej. x x15 __foo_bar_baz__ fucnrdthsucngtagdjb Jednak, nazwy takie jak __foo_bar_baz__, ktore zaczynaja sie od dwoch twardych spacji sa rozumiane jako zarezerwowane dla wewnetrzego uzytku przez Octave. Nie powinniescie uzywac ich w kodzie w ktorym piszecie, z wyjatkiem uzywania udokumentowanych wewnetrznych zmienneych Octav?a i zdefiniowanych wczesniej symbolizowanych stalych. Istota jest uwaga w oznaczaniu zmiennych. Symbole a i A sa roznymi zmiennymi. Oznaczenie zmiennej jest wazne w ekspresji przez sama siebie. Reprezentuje aktualna warttosc zmiennej. Zmiennym przypisywane sa nowe wartosci poprzez assignment operators i operatory zwielokrotniania. increment operators. Patrz rozdzial Assignment Expressions. Wiele zmiennych posiada specjalne wewnetrzne znaczenia. Na przyklad, ans zawiera (holds) aktualny katalog roboczy, a pi oznacza stosunek obwodu kola do jego promienia. Patrz rozdzial Built-in Variables, aby zapoznac sie z wczesniej zdefinowanymi zmiennymi. Niktore z tych wbydowanych zmiennych sa stalymi I nie moga byc zmienione. Inne moga byc uzywane i wykozystywane jak wszystkie inne zmiene ale ich wartosci sa automatycznie uzywane I zmieniane przez Octav?a. Zmienne w Octav?ie nie posiadaja z gory zdefinowanych typow, wiec jest mozliwe przypisanie watrosci numerycznej zmiennej a nastepnie w tym samym programie zachowac pod ta sama zmienna ciag znakow. Zmienne nie moga byc uzywane przed nadaniem im wartosci. Inaczej wyniekiem tego bedzie blad. Zmienne Globalne Do zmiennej, ktora zostala zdefiniowana jako globalna, mozemy sie odwolac z obrebu ciala funkcyjnego bez potrzeby obchodzenia go ((pass it)) jako formalnego parametru. Zmienna moze byc zadeklarowana jako globalna przy uzyciu oznaczenia deklaracji globalnej. Wszystkie nastepujace oznaczenia sa deklaracjami globalnymi. global a global b = 2 global c = 3, d, e = 5 Konieczne jest aby zadeklarowac zmienna jako globalna w obszaze ciala funkcyjnego aby moc sie do niej odwolywac. Na przyklad, global x function f () x = 1; endfunction f () nie oznacza wartosci globalnej zmiennej x na 1. W celu zmiany wartosci zmiennej globalnej x, trzeba tez zadeklarowac ja jako gloabalna w obszaze ciala funkcyjnego, w ten sposob function f () global x; x = 1; endfunction Pomijajac globalna zmienna w liscie parametrow funkcyjnych spowoduje utworzenie lokalnej kopii I nie zmodyfikuje wartosci globalnej. Dla przykladu, dane jest funkcji function f (x) x = 0 endfunction i definicja x jako globalnej na najwyzszym poziomie, global x = 13 wyrazenie f (x) wyswietli wartosc x na poziomie funkcji jako 0, ale wartosc x na wyzszym poziomie pozostaje niezmienna, dlatego ze funkcja dziala na kopii jej argumentu. Wbudowane Zmienne: warn_comma_in_global_decl Jezeli wartosc warn_comma_in_global_decl jest niezerowa, wyswietlone jest ostrzezenie dla deklaracji takiej jak global a = 1, b która powoduje ze zmienne a i b sa globalne i przypisuje wartosc 1 zmiennej a, poniewaz w tym kontekscie, przecinek nie jest interpretowany jako separator deklaracji. Domyslna wartosc warn_comma_in_global_decl jest niezerowa. default_global_variable_value: jezeli initialize_global_variables jest niezerowe, wartosc default_global_variable_value jest uzywana jako wstepna wartosc zmiennych globalnych które nie sa zainicjalizowane ((explicitly initialized)). Dla przykladu, initialize_global_variables = 1; default_global_variable_value = 13; global foo; foo => 13 zmienna default_global_variable_value jest wstepnie niezdefiniowana. Wewnatrz funkcyjne (Built-in Function): is_global (nazwa) Zwraca 1 je?eli nazwa jest globalnie widzialna. W innym przypadku, zwraca 0. Dla przyk?adu, global x is_global ("x") => 1 Status Zmiennych Polecenie(Command): clear options pattern ... (struktura opcji clear) Wykasuje nazwy odpowiadajace danym strukturom z tablicy symboli. Struktura moze posiadac nastepujuce specjalne znaki: ? Dopasuj jakikolwiek pojedynczy znak. * Dopasuj zero lub wiecej znaków. [ list ]? Dopasuj liste znakow wyspecyfikowana przez te liste. Jezeli pierwszym znakiem jest ! lub ^, dopasuje wszystkie znaki za wyjatkiem wyspecyfikowanych przez liste. Dla przykladu, struktura `[a-zA-Z]?' dopasuje wszystkie z gornej i dolnej czesci znakow alfabetycznych. Dla przykladu, polecenie clear foo b*r czysci nazwe foo i wszystkie nazwy rozpoczynajace sie na litere b a konczace na literze r. Jezeli clear jest wywolywane bez jakiegokolwiek argumentu, wszystkie zdefiniowane przez uzytkownika zmienne(user-defined variables) (lokalne i globalne) sa wyczyszczone z tablicy symboli. Jezeli clear jest wywolywane z co najmniej jednym argumentem, tylko dopasowane widoczne nazwy sa wyczyszczone. Dla przykladu, przypuscmy ze mamy zdefiniowana funkcje foo, a nastepnie ukrywamy ja przez przydzielenie foo = 2. Wykonujac komende clear foo wpierw wyczysci definicje zmiennej i odnowi definicje foo jako funkcji. Wykonujac clear foo po raz drugi wykasuje to definicje funkcji. Komenda ta nie moze byc uzywana w kontakcie z cialem funkcyjnym. * Na tym konczy sie tlumaczenie Variables. Wynikle bledy moga byc zwiazane z brakami "slowniczymi" co w niektorych przypadkach zostawilem czytelnikowi do rozpatrzenia samemy poprzez umieszczenie problemowego wyrazu w podujnym nawiasie (( )). </pre> ---+ 10 Wyrazenia --------------------------------------------------- <pre> WYRAŻENIA Wyrażenia są podstawowym blokiem instrukcji w Octave . Wyrażenie ocenia wartość, którą możesz drukować, przetestować, wprowadza zmienną do pamięci , przebieg do funkcji albo wyznacza nową wartość zmiennej z częscią operacyjną rozkazu przypisania. Wyrażenie moze służyć jako instrukcja sama w sobie. Większość innych rodzajów instrukcji zawiera jedno lub więcej wyrażeń, które dokładnie określają dane, na których mogą operować. Tak jak w innych językach programowania, wyrażenia w Octave zawierają zmienne, tablice odniesień, stałe i dzialaja poprzez wywolanie ich, jak równiez laczenie ich z róznymi częsciami operacyjnymi rozkazu. Wyrazenia indeksowe Wyrazenie indeksowe pozwala powołać się lub wyciągać wybrane elementy macierzy lub wektora. Wykladniki indeksowania moga byc skalarami, wektorami, rodzinami, albo specjalna częscia operacyjna rozkazu ":", który moze zostac uzyty, by wybrac cale rzędy albo kolumny. Wektory są umieszczone w indeksie poprzez użycie pojedynczego wyrażenia. Macierze wymagaja dwóch wykladników dopóki wartość wbudowanej zmiennej do_fortran_indexing nie jest niezerowa, kiedy to macierze mogą być indeksowane przez pojedyncze wyrażenie. Wbudowana Zmienna :do_fortran_indexing Jesli wartosc do_fortran_indexing jest niezerowa, Octave pozwala, by wybrac elementy dwuwymiarowej macierzy uzywajac pojedynczego wykladnika przez traktowanie macierzy jako pojedynczego wektora, utworzonego z kolumn macierzy. Wartosc standardowa wynosi 0. Dana jest macierz a=[1,2:3,4]? wszystkie z następujacych wyrazen sa równowazne a (1,[1,2]?) a (1,1:2) a (1,:) i wybieraja pierwszy rzad macierzy. Specjalna forma indeksowania moze zostac uzyta, by wybrac elementy macierzy albo wektora. Jezeli wykladnikami sa wektory utworzone tylko z jedynek i z zer, to w rezultacie indeksowania otrzyma sie nowa macierz, której elementy koresponduja z elementami wektora w wykladniku w ten sposób, ze równaja sie do jedynki.Na przyklad a=[1,2:3,4]?; a ([1,0]?,:) wybiera pierwszy rzad macierzy a. To dzialanie moze byc przydatne dla wybierania elementów macierzy bazujac na jakims warunku, gdy częsc operacyjna rozkazu porównania zwraca macierz zero-jedynkowa. Ta specjalna zero-jedynkowa forma indeksowania prowadzi do konfliktu z znormalizowanym rozkazem indeksowania. Na przyklad, nastepujaca instrukcja powinna a=[1,2;3,4]?; a ([1,1]?,:) zwrócic oryginalna macierz, czy macierz uformowana przez wybranie pierwszego rzedu dwa razy? Chociaz ten konflikt nie jest prawdopodobny, by powstal często w praktyce, mozesz wybrac zachowanie, które wolisz przez ustawienie wbudowanej zmiennej prefer_zero_one_indexing. Wbudowana Zmienna:prefer_zero_one_indexing Jesli wartosc prefer_zero_one_indexing jest niezerowa, Octave wykona zero-jedynkowe indeksowanie stylu kiedy jest konflikt uzywajac normalne reguly indeksowania Na przyklad, dana jest macierz a=[1,2,3,4]? z prefer_zero_one_indexing ustalonym jako niezerowe, wyrazenie a ([1,1,1,1]?) da w rezultacie macierz [1,2,3,4]?. Jesli wartosc prefer_zero_one_indexing jest ustalona jako zero, rezultatem bedzie macierz [1,1,1,1]?. W pierwszym przypadku, Octave wybiera kazdy element odpowiadajacy "1" w wektorze wykladnika. W drugim, Octave wybiera pierwszy element wielokrotnie razy. Wartosc standardowa dla prefer_zero_one_indexing wynosi 0. W koncu, umieszczanie w indeksie skalara z wektorem zlozonym z jedynek moze zostac uzyte do stworzenia wektora tego samego rozmiaru co wektor wykladnika, z kazdym elementem równym wartosci oryginalnego skalara. Na przyklad, nast&3281pujaca instrukcja a=13; a ([1,1,1,1]?) wyprodukuje wektor, którego cztery elementy sa równaja sie 13. Podobnie umieszczanie w indeksie skalara z dwoma wektorami zerowymi moze byc uzyte do stworzenia macierzy. Na przyklad następujaca instrukcja a=13; a([1,1]?,[1,1,1]?) utworzy 2 do 3 macierzy z wszystkimi elementami równymi 13. To jest bledna notacja i powinna byc uniknięta. Lepszym wyjsciem jest uzyc funkcji jedynkowej, do wygenerowania macierzy odpowiedniego rozmiaru, ktorej wszystkie elementy sa jedynkami, a nastepnie przeskalowac je, aby dostac pozadany skutek. Wbudowana Zmienna:prefer_column_vectors Jesli wartosc prefer_column_vectors jest niezerowa, to dzialanie takie jak for i=1:10 a(i)=i; endfor (porzednio nieokreslone) produkuje wektory kolumnowe. Inaczej wektory rzedowe sa preferowane. Wartosc standardowa wyrazenia wynosi 1. Jesli zmienna jest juz zdefiniowana jako wektor ( lub macierz z pojedynczym rzedem albo kolumna ) to oryginalna orientacja jest uszanowana, nie baczac na wartosc prefer_column_vectors. Wbudowana Zmienna:resize_on_range_error Jesli wartosc resize_on_range_error jest niezerowa, to wyrazenie jak fori=1:10 a(i)=sqrt(i); endfor (poprzednio nieokreslone) w rezultacie daje zmienna, ktorej rozmiar jest na tyle wystarcajacy, aby mogla ona otrzymac nowa wartosc. Nowe elementy, ktore nie zostaly przekazane przez ta wartosc, sa wyzerowywane. Jesli wartosc resize_on_range_error wynosi 0 , drukowany jest meldunek bledu i regulacja jest zwracana na najwyzszy poziom. Wartosc standardowa wynosi 1. Zauwaz, ze to jest calkiem nieskuteczne, by utworzyc wektor uzywajac petli jak w jednym z powyzszych przykladow. W tym szczegolnym przypadku, byloby bardziej skuteczniejsze uzycie wyrazenia a=sqrt(1:10); w ten sposob unikajac zupelnie petli. W przypadkach, gdzie petla jest nadal wymagana, albo pewna liczba wartosci musi zostac wlaczona, by utworzyc wieksza macierz, to jest ogolnie duzo szybciej ustawic najpierw rozmiar macierzy, a nastepnie wstawic elemenety uzywajac komendy indeksowania. Na przyklad, dana jest macierz a '[nr;nc]?=size(a);' x=zeros(nr,n*nc); for i=1:n x(:,(i-1)*n +1:i*n)=a; endfor jest znacznie szybsze niz x=a; for i=1:n-1 'x=[x,a]?;' endfor szczegolnie dla duzych macierzy, poniewaz Octave nie musi wielokrotnie zmieniac wielkosci wyniku. Wolanie Funkcji Funksja jest nazwa dla szczegolnego rodzaju obliczen. Poniewaz ma ona nazwe, to mozesz o nia zapytac z nazwy w jakims momencie w programie. Na przyklad funkcja sgrt oblicza pierwiastek kwadratowy liczby. Staly komplet funkcji jest wbudowany, co znaczy ze jest do dyspozycji w kazdym programie Octave. Funkcja sqrt jest jedna z nich. W dodatku, mozesz zdefiniowac swoje wlasne funkcje. Droga do uzycia funkcji jest poprzez wyrazenie wolajacego funkcje, ktore sklada sie z nazwy funkcji i nastepujacej po niej liscie argumentow w nawiasach. Argumenty sa wyrazeniami, ktore daja surowce dla obliczania, ktore wykona funkcja. Kiedy jest wiecej niz jeden argument, musza byc one rozdzielone przecinkami. Jesli nie ma argumentow, mozesz pominac nawiasy, ale jest dobrym pomyslem, zeby je zawrzec tak czy owak, gdyz wyraznie to wskazuje, ze wywolanie i przekazanie sterowania funkcji zostaly zamierzone. Ponizej jest pare przykladow: sqrt(x^2+y^2) #Jeden argument ones(n,m) #Dwa argumenty rand() #Zadnego argumentu Kazda funkcja oczekuje szczegolnej ilosci argumentow. Na przyklad, funkcja sqrt musi byc wolana z pojedynczym argumentem, liczba, by wziac pierwiastek kwadratowy: sqrt(argument) Niektore z wbudowanych funkcji przyjmuja rozna liczbe argumentow, w zaleznosci od szczegolnego ich uzycia, i ich zachowanie jest rozne w zaleznosci od liczby dostarczonych argumentow. Jak kazde inne wyrazenie, wywolanie funkcji daje wartosc, ktora jest obliczona przez funkcje, opierajaca sie o argumenty, ktore zostaly jej podane. W tym przykladzie wartosc sqrt(argument) jest pierwiastkiem kwadratowym z argumentu. Funkcja moze tez dac efekty uboczne, takie jak wyznaczanie wartosci pewnych zmiennych albo wprowadzanie lub wyprowadzanie rozkazow. W przeciwienstwie do wiekszosci jezykow, funkcje w Octave moga zwrocic wielokrotne wartosci. Na przyklad, nastepujaca instrukcja '[u,s,v]?=svd(a)' oblicza pojedynczy rozklad wartosci macierzy 'a'i wyznacza trzy wyniki macierzy u , s, i v.Lewa strona wyrazenia wielokrotnego przypisania jest wydrukiem wyrazen i moze byc wudrukiem nazw zmiennej albo wyrazen indeksowych. Przekazanie przez wartosc W Octave, w przeciwienstwie do Fortran, argumenty funkcji sa pominiete przez wartosc, co znaczy, ze kazdy argument w funkcji przywolania jest oceniany i wyznaczany do tymczasowej lokacji w pamieci zanim zostanie pomineta w funkcji. Nie ma aktualnie zadnej drogi, by wyszczegolnic , ze parametr funkcji powinien byc pominiety przez wzajemna zaleznosc wartosci. To znaczy , ze niemozliwe jest , by bezposrednio zmienic wartosc funkcji w przywolywaniu funkcji. Mozliwe jest tylko zmienienie miejscowej kopii w tresci funkcji Na przyklad , funkcja function f (x,n) while (n--.0) disp(x) endwhile endfunction monitoruje wartosc pierwszego argumentu n razy. W tej funkcji, zmienna n jest uzyta jako tymczasowa zmienna bez martwienia sie, ze jej wartosc moglaby sie tez zmienic w funkcji przywolania. </pre> ---+ 12 DYREKTYWY. --------------------------------------------------- <pre> * DYREKTYWY. Dyrektywy moga byc prostym wyrazeniem stalym albo zawilym wydrukiem petli zagniezdzonej i warunkowej dyrektywy. Dyrektywy kontroli takie jak if, while, i inne kontroluja przeplyw wykonania w programach Octave. Wszystkie regulujace dyrektywy zaczynaja sie specjalnymi wyrazami haslowymi takimi jak if i while, odroznianymi od prostych wyrazen. Wiele regulujacych dyrektyw zawiera inne dyrektywy; na przyklad , jesli dyrektywa if zawiera inna dyrektywe, ktora moze albo nie moze zostac wykonana. Kazda regulujaca dyrektywa ma odpowiadajaca dyrektywe konca, ktora oznacza koniec konca regulujacej dyrektywy. Na przyklad , wyraz kluczowy endif oznacza koniec dyrektywy if, a dyrektywa endwhile oznacza koniec dyrektywy while. Mozesz uzywac wyrazu haslowego end tam gdzie wyraz haslowy konca jest oczekiwany, ale uzywanie sprecyzowanych wyrazów haslowych jest preferowane, poniewaz, jesli uzywasz ich, Octave jest w stanie dostarczac lepszej diagnostyki dla niewlasciwie dobranych albo brakujacych wyrazow koncowych. * Dyrektywa if Wydruk dyrektyw zawarty miedzy wyrazami kluczowymi takimi jak if albo while i odpowiadajcymi im dyrektywami konca jest wywolywany trescia dyrektywy kontroli. Dyrektywa if jest dyrektywa decydowania w Octave. Sa trzy podstawowe formy dyrektywy if. W jego najprostszej formie, wyglada to tak: if (warunek) then-tresc endif warunek jest wyrazeniem, które cos, co reszta dyrektywy zrobi, kontroluje. then-tresc jest wykonana tylko wtedy, jesli warunek jest prawdziwy. warunek w dyrektywie if jest rozwazony prawdziwie, jesli jego wartosc jest niezerowa i nieprawdziwa, jesli jego wartosc jest zerem. Jesli wartosc warunkowego wyrazenia w dyrektywie if jest wektorem albo matryca, to jest rozwazona prawdziwie tylko wtedy, jesli wszystkie elementy sa niezerowe. Druga forma dyrektywy if wyglada tak: if (warunek) then-tresc else else-tresc endif Jesli warunek jest prawdziwy, then-tresc jest wykonane; inaczej, else-tresc jest wykonane. Tutaj jest przyklad: if (rem (x, 2) == 0) printf ("x is even\ n"); else printf ("x is odd \ n"); endif W tym przykladzie, jesli wyrazenie rem (x, 2) == 0 jest prawdziwe (to jest wartosc x jest podzielna przez 2), wtedy pierwsza dyrektywa printf jest oceniana, w innym przypadku druga dyrektywa printf jest oceniana. Trzecia i najogolniejsza forma dyrektywy if pozwala laczyc wielokrotne decyzje w pojedynczej dyrektywie. Wyglada to tak: if (warunek) then-tresc elseif (warunek) elseif-tresc else else-tresc endif Dowolna ilosc elseif moze ukazac sie w klauzulach. Kazdy warunek jest przetestowana z powrotem i, jesli jest znaleziony prawdziwy, odpowiadajaca mu tresc jest wykonana. Jesli zaden warunek nie jest prawdziwy i klauzula else jest obecna, jej tresc jest wykonana. Tylko jedna klauzula else moze ukazac sie i to musi byc ostatnia czescia dyrektywy. Idac za przykladem, jesli pierwszy warunek jest prawdziwy (to jest wartosc x jest podzielna przez 2), wtedy pierwsza dyrektywa printf jest wykonana. Jesli to jest nieprawdziwe, wtedy drugi warunek jest przetestowany i, jesli to jest prawdziwe (to jest wartosc x jest podzielna przez 3), wtedy druga dyrektywa printf jest wykonana. Inaczej, trzecia dyrektywa printf jest wykonana. if (rem (x, 2) == 0) printf ("x is even \ n"); elseif (rem (x, 3) == 0) printf ("x is odd and divisible by 3 \ n"); else printf ("x is odd \ n"); endif Zauwaz, ze wyraz haslowy elseif nie musi byc literowany else if, tak jak ma to miejsce w Fortranie. Jesli tak jest, obszar miedzy else i if bedzie znaczyc dla Octave, by ten potraktowal to jako nowa dyrektywe if w innej klauzuli else dyrektywy if. Na przyklad , jesli piszesz if (c1) tresc-1 else if (c2) tresc-2 endif Oktawa bedzie oczekiwala, by dodatkowe urzadzenie wejsciowe uzupelnilo pierwsza dyrektywe if. Jesli bedziesz uzywac Octave interaktywnie, to bedzie twoja szybka kontynuacja dla dodatkowego urzadzenia wejsciowego. Jesli Octave czyta to urzadzenie wejsciowe z pliku, to moze narzekac na brakujace albo dobrane niewlasciwie dyrektywy end, albo, jesli nie uzyles sprecyzowanych dyrektyw konca (endif, endfor, itd.), to moze po prostu wyprodukowac niepoprawne skutki, bez produkowania jakichs ostrzezen. To jest latwiejsze, aby zauwazyc blad, jeli przepisujemy dyrektywy innym sposobem niz ten, if (c1) tresc-1 else if (c2) tresc-2 endif uzywamy wciec, by przedstawic jak Octave grupuje dyrektywy. Zobacz segment Functions and Script Files . Wbudowane Zmienne: warn_assign_as_truth_value Jesli wartosc warn_assign_as_truth_value jest niezerowa, ostrzezenie zostanie wyemitowane dla dyrektywy w ten sposob if (s = t) ... odtad takie dyrektywy nie sa wspólne, i prawdopodobnie, ze mial zamiar napisac if (s == t) ... zamiast powyzszego. Sa czasy kiedy to jest przydatne, by napisac tekst lub kod programu, które zawieraja przydzial obowiazkow z warunkami dyrektywy while albo if. Na przyklad, dyrektywy takie jak while (c = getc()) ... sa wspólne dla programowania w C. To jest mozliwe, by uniknac wszystkich ostrzezen o dyrektywach do ustawiania warn_assign_as_truth_value do 0, ale to moze tez pozwolic na prawdziwe bledy takie jak if (x = 1) # zamierzal przetestowac (x == 1)! ... W takich przypadkach jest mozliwe zniesienie bledow dla sprecyzowanych dyrektyw przez pisanie ich z dodatkowym kompletem okraglych nawiasow. Na przyklad, piszac poprzedni przyklad jako while ((c = getc())) ... powstrzymaja ostrzezenie od bycia drukowanym dla tej dyrektywy, pozwalajac Octave, by ostrzegl o innych przypisaniach uzytych w kontekstach warunkowych. * Dyrektywa switch Wartosc standardowa warn_assign_as_truth_value wynosi 1. Dyrektywa switch zostala wprowadzona w Octave 2.0.5. To powinno zostac rozwazone doswiadczalnie i szczegoly implementacji moga zmienic sie nieznacznie w przyszlych wersjach Octave. Jesli masz wyjasnienia albo chcialbys podzielic sie twoimi doswiadczeniami w probach uzycia tej nowej dyrektywy w prawdziwych programach, prosze wyslij je na adres octave-maintainers at bevo.che.wisc.edu < mailto:octave-maintainers at bevo.che.wisc.edu >. ( Jesli myslisz, ze znalazles blad, prosze donies o tym do bug-octave at bevo.che.wisc.edu < mailto:bug-octave at bevo.che.wisc.edu >. Ogólna forma dyrektywy switch wyglada tak switch wyrazenie case etykieta lista_komend case etykieta lista_komend ... otherwise lista_komend endswitch * Symbole identyfikujace switch, case, otherwise i endswitch teraz sa wyrazami kluczowymi. * Etykieta moze byc jakims wyrazeniem. * Podwojne wartosci etykiety nie sa dostrzegane. Lista_komend odpowiadajaca pierwszemu zestawieniu bedzie wykonana. * Musisz miec co najmniej jedna klauzule case etykieta lista_komend. * Klauzula otherwise lista_komend jest opcjonalna. * Wszystkie inne sprecyzowane wyrazy haslowe end, endswitch moga zostac zastapione przez end, ale mozesz dostac lepsza diagnostyke, jesli uzywasz sprecyzowanych form. * Przypadki sa wylaczne, wiec nie dochodza do skutku poniewaz robi sie przypadki w dyrektywie przelacznika w jezyku C. * Elementy listy_komend nie sa opcjonalne. Robienie wydruku opcjonalnego znaczyloby wymaganie znaku rozdzielajacego pomiedzy etykieta a lista komend. W przeciwnym wypadku switch (foo) case (1) -2 ... wyprodukowalby zaskakujace rezultaty, poprawnie robi sie tak switch (foo) case (1) case (2) doit (); ... szczególnie dla programatorów C. * Implementacja jest prosta i aktualnie nie oferuje zadnej prawdziwej poprawy wystapienia rownowaznego bloku if, nawet, jesli wszystkie etykiety sa stalymi calkowitymi. Byc moze przyszle odchylenia tego beda mogly dostrzec wszystkie stale calkowite etykiety i ulepszyc to przez uzywanie przelacznika. Wbudowane Zmienne: warn_variable_switch_label * Dyrektywa while Jesli wartosc tej zmiennej bedzie niezerowa, Octave bedzie drukowal ostrzezenie, az etykieta switch nie bedzie stala albo wyrazeniem stalym. W programowaniu "petla" znaczy czesc programu, która jest (albo co najmniej moze byc) wykonana kolejno dwa albo wiecej razy. Dyrektywa while jest najprostsza petla w Octave. Ta petla wykonuje dyrektywe do chwili az warunek jest prawdziwy. Podobnie jak warunek w dyrektywie if, warunek w dyrektywie while jest rozwazony prawdziwie, jesli jego wartosc jest niezerowa i nieprawdziwie, jesli jego wartosc jest zerem. Jesli wartosc warunkowego wyrazenia w dyrektywie while jest wektorem albo matryca, to jest ono rozwazone prawdziwie, gdy wszystkie elementy sa niezerowe. Dyrektywa while w Octave wyglada tak: while (warunek) tresc endwhile Tutaj tresc jest dyrektywa albo wydrukiem dyrektyw, wiec mowimy tresc petli a warunek jest wyrazeniem, które kontroluje to jak dlugo petla jest wykonywana. Pierwsza rzecza, która dyrektywa while robi jest warunek. Jesli warunek jest prawdziwy, to wykonana jest tresc dyrektywy. Gdy tresc zostala wykonana, warunek jest przetestowany znowu i, jesli to jest nadal prawdziwe, tresc jest wykonana ponownie. To powtarza proces dopoki warunek jest juz nieprawdziwy. Jesli warunek jest poczatkowo nieprawdziwy, tresc petli nigdy nie jest wykonana. Ten przyklad tworzy zmienna fib, która zawiera pierwszych dziesiec elementów ciagu liczbowego Fibonacciego. fib = ones (1, 10); i = 3; while (i <= 10) fib (i) = fib (i -1) + fib (i -2); i ++; endwhile Tutaj tresc petli zawiera dwie dyrektywy. Prace petli wygladaja tak: najpierw, wartosc i jest ustawiona do 3. Potem while przetestowuje, czy i jest mniejsze lub rowne 10. To przedstawia sie tak kiedy i równa sie 3, wi?c wartosc i - tego elementu fib jest ustawiona do sumy poprzednich dwoch wartosci w ciagu. Wtedy i ++ zwieksza wartosc i i petla powtarza sie. Petla konczy sie kiedy i dociera do 11. Nowa linia nie jest wymagana miedzy warunkiem i trescia; ale uzywanie jej sprawia, ze program jest czytelny dopoki tresc jest bardzo prosta. * Dyrektywa for Zobacz segment Dyrektywa if dla opisu zmiennej warn_assign_as_truth_value. Dyrektywa for dogodnie liczy iteracje petli. Ogólna forma dyrektywy for wyglada tak: for var = wyrazenie tresc endfor gdzie tresc oznacza jakas dyrektywe albo wydruk dyrektyw, wyrazenie jest jakims aktualnym wyrazeniem i var moze przybierac kilka form. Zwykle to jest zmienna prosta albo umieszczona w indeksie. Jesli wartosc wyrazenia jest struktura, var moze tez byc wydrukiem. Zobacz ponizej Zapetlanie Segmentu Przez Elementy Struktury. Wyrazenie przypisani w dyrektywie for dziala troche inaczej niz normalna instrukcja przypisania w Octave. Zamiast wyznaczania kompletnego skutku wyrazenia zostaje wyznaczona kazda kolumna wyrazenia var w zwrocie. Jesli wyrazenie bedzie zakresem, wektorem wierszowym, albo skalarem, wartosc var bedzie za kazdym razem wykonywac tresc petli skalarnie. Jesli var bedzie kolumna tablic jednowymiarowych albo matryc, var bedzie za kazdym razem wykonywac tresc petli wektorowo. Idac za przykladem pokaze inny sposób, by utworzyc wektor zawierajacy dziesiec pierwszych elementów ciagu liczbowego Fibonacciego, tym razem uzywajac dyrektywy for: fib = ones(1, 10); for i = 3:10 fib (i) = fib (i -1) + fib (i -2); endfor Ten tekst przez pierwsze ocenianie wyrazenie 3:10 wyprodukowuje rzad wartosci obejmujacy od 3 do 10. Wtedy zmienna i jest wyznaczona jako pierwszy element zakresu i tresc petli jest wykonana raz. Kiedy nastapi koniec tresci petli nastepna wartosc w zakresie jest wyznaczona do zmiennej i i tresc petli jest wykonana ponownie. Ten proces trwa dopoki nie bedzie elementow do wyznaczenia. Chociaz jest mozliwe by przepisac wszystko dla petli for jako petle while, jezyk Octave ma obie dyrektywy, poniewaz czesto petla for jest mniej pracochlonna i naturalniejsza w mysleniu. Liczenie numeru iteracji jest bardzo podobne w petlach i raczej moze byc latwiejsze liczenie czesci petli niz czegos wewnatrz petli. *Zapetlanie Segmentu Przez Elementy Struktury Specjalna forma dyrektywy for pozwala ci na zapetlenie przez wszystkie elementy struktury: for [[wartosc, klucz]]? = wyrazenie tresc endfor W tej formie dyrektywy for, wartosc wyrazenia musi byc struktura. Jesli tak jest, klucz i wartosc sa zabrane do imienia elementu i odpowiadajacej mu wartosci w zwrocie dopoki nie bedzie wiecej elementów. Na przyklad, -| klucz = a -| wartosc = 1 -| klucz = b -| wartosc = -| -| 1 2 -| 3 4 -| -| klucz = c -| wartosc = lancuch znakow x.a= 1 x.b = [1, 2; 3, 4]? x.c = "lancuch znakow" for [[wartosc, klucz]]?= x klucz wartosc endfor Elementy nie sa dostepne do w jakims szczególnym rozkazie. Jesli bedziesz potrzebowac jazdy na rowerze przez wydruk szczególnej drogi, bedziesz musial uzyc funkcji struct_elements i uporzadkowac wydruk. * Dyrektywa break Zmienna klucz moze tez zostac pominieta. Jesli tak jest, nawiasy kwadratowe sa tez opcjonalne. To jest przydatne dla jazdy na rowerze przez wartosci wszystkich elementów struktury kiedy imiona elementów nie sa znane. Dyrektywa break wyskakuje z najglebszym for albo petla while, które ja zalaczaja. Dyrektywa break moze zostac uzyta tylko w tresci petli. Ponizszy przyklad znajduje najmniejszy dzielnik danej calosci, jak równiez identyfikuje pierwsze numery: num = 103; div = 2; while (div * div <= num) if (rem (num, div) == 0) break; endif div ++; endwhile if (rem (num, div) == 0) printf ("Najmniejszy dzielnik %d jest %d\n", num, div) else printf ("%d jest pierwszy\n", num); endif Kiedy przypomnienie jest wejsciem zerowym w pierwszej dyrektywie while, Octave natychmiast wybucha poza petla. To znaczy, ze Octave natychmiast przechodzi do dyrektywy idacej za petla i kontynuuje przetwarzanie. (To jest bardzo rózne od dyrektywy exit, która zatrzymuje niepodzielny program Octave.) Tutaj jest inny ekwiwalent programu do poprzedniego. Ilustruje on jak okolicznosc dyrektywy while moglaby takze zostac zastapiona break wewnatrz if: * Dyrektywa continue num = 103; div = 2; while (1) if (rem (num, div) == 0) printf ("Najmniejszy dzielnik %d jest %d\n", num, div); break; endif div ++; if (div * div > num) printf ("%d jest pierwszy\n", num); break; endif endwhile Dyrektywa continue, tak jak break, jest uzywana tylko wewnatrz petli for albo while. Przeskakuje przez reszte tresci petli, powodujac nastepny cykl dookola petli natychmiast rozpoczetej. Kontrastuje to z break, które wyskakuje z petli zupelnie. Tutaj jest przyklad: # drukuj elementy tablicy jednowymiarowej przypadkowej # calosci, jesli sa. # po pierwsze, utwórz wektor wierszowy 10 przypadkowych # calosci z wartosciami miedzy 0 i 100: vec = round (rand (1, 10) * 100); # drukuj to czym jestesmy zainteresowani : for x = vec if (rem (x, 2) != 0) continue; endif printf ("% d \ n", x); endfor Jesli jeden z elementów vec jest nadliczbowym numerem, ten przyklad przeskakuje drukowanie dyrektywy dla tego elementu i kontynuuje z powrotem pierwsza dyrektywe w petli. To nie jest praktyczny przyklad dyrektywy continue, ale to powinno dac ci czytelne zrozumienie jak to dziala. Zazwyczaj, prawdopodobnie napisanoby petle tak: * Dyrektywa unwind_protect for x = vec if (rem (x, 2) == 0) printf ("% d \ n", x); endif endfor Oktawa popiera ograniczona forme wyjatku, po którym operowanie umodelowalo forme Lisp rozwijac - ochraniac. Ogólna forma bloku unwind_protect wyglada tak: unwind_protect tresc unwind_protect_cleanup czyszczenie end_unwind_protect Gdzie tresc i czyszczenie sa opcjonalne i moga zawierac jakies wyrazenia Octave albo komendy. Dyrektywy w czyszczeniu gwarantuja wykonanie bez wzgledu na tresc wyjscia kontroli. To jest przydatne, by chronic tymczasowe zmiany do globalnych zmiennych od mozliwych defektów. Na przyklad, ponizszy tekst zawsze przywróci poczatkowa wartosc wbudowanej zmiennej do_fortran_indexing nawet, jesli defekt zdarza sie wykonujcc rozkaz indeksowania. save_do_fortran_indexing = do_fortran_indexing; unwind_protect do_fortran_indexing = 1; elt = a (idx) unwind_protect_cleanup do_fortran_indexing = save_do_fortran_indexing; end_unwind_protect * Dyrektywa try Z unwind_protect, wartosc do_fortran_indexing nie bylaby przywrócona, jesli defekt zdarzylby sie wykonujac operacje indeksowania, poniewaz wyznaczanie wartosci zatrzymaloby sie w momencie defektu i dyrektywa, by przywrócic wartosc nie bylaby wykonana. W dodatku do unwind_protect, Octave popiera inna ograniczona forme operowania wyjatkiem. Ogólna forma bloku try wuglada tak: try tresc catch czyszczenie end_try_catch Gdzie tresc i czyszczenie sa opcjonalne i moga zawierac jakies wyrazenia Octave albo komendy. Dyrektywy w czyszczeniu sa wykonane tylko, jesli defekt zdarza sie w tresci. Zadne ostrzezenia albo meldunki bledu nie sa drukowane kiedy tresc jest wykonywana. Jesli defekt zdarza sie podczas wykonywania tresci, czyszczenie moze uzyskac dostep do tekstu wiadomosci, która bylaby drukowana w stalym budowaniu __error_text__. To jest to samo co eval (try, catch) (który moze teraz tez uzyc __error_text__) ale to jest skuteczniejsze odkad komendy nie musza byc parsowane za kazdym razem ocena dyrektyw try i catch. Zobacz BledneOperowanie? , dla wiekszych informacji o zmiennej __error_text__. * Linia ciagu dalszego Blok try Octavy jest bardzo zlimitowanym odchyleniem formy Lisp okolicznosc - przypadek (ograniczony, poniewaz nie moze poslugiwac sie rózniacymi sie klasami defektów oddzielnie). Byc moze w jakims momencie Octave moze miec jakis rodzaj klasyfikacji defektów i spróbuj - lap moze zostac ulepszone, tak by byc tak potezne jak okolicznosc - przypadek w Lisp. W jezyku Octave, wiekszosc dyrektyw konczy sie z symbolem nowej linii i musisz kazac Octave, by zignorowal symbol nowej linii, by kontynuowac dyrektywe z jednego lacza do nastepnego. Koniec linii z symbolami ... albo \ jest zlaczony z nastepna linia zanim zostana podzielone do leksemów przez parser Octave. Na przyklad , linie x = long_variable_name ... + longer_variable_name \ - 42 ksztaltuja prosta dyrektywe. Symbol backslash w drugiej linii powyzej jest interpretowany jako symbol kontynuacji. Dla linii kontynuacji to nie zdarza sie wewnatrz ciagu stalych, a komentarz moze znajdowac sie miedzy znakami kontynuacji a symbolem nowej linii. Na przyklad dyrektywa x = long_variable_name ... # pierwszy komentarz + longer_variable_name \ # drugi komentarz - 42 # ostatni komentarz jest ekwiwalentna do obu pokazanych. Wewnatrz ciagu stalych znak kontynuacji musi znajdowac sie na koncu linii tuz przed symbolem nowej linii. W tym zdarzaniu wewnatrz okraglych nawiasow mozna kontynuowac nowa linie z mozliwoscia uzycia znakow kontynuacji. Na przyklad mozliwe jest napisanie dyrektywy if (fine_dining_destination == on_a_boat || fine_dining_destination == on_a_train) suess (i, will, not, eat, them, sam, i, am, i, will, not, eat, green, eggs, and, ham); endif z mozliwoscia dodania znakow kontynuacji. </pre> ---+ 18 MatrixManipulations --------------------------------------------------- <pre> Operacje na macieżach < octave_toc.html > Jest pewna liczba funkcji przystosowanych do sprawdzania, czy elementy macierzy spelniaja pewne warunki i dla przestawiania elementów macieży. Na przykład , Octave może łatwo powiedzieć ci, czy wszystkie elementy macieży są ograniczone, albo są mniejsze od jakiejś określonej wartości. Oktava może też obrócić elementy, albo posortowac kolumny macierzy. Znajdując elementy i Sprawdzając Warunki < octave_toc.html > Funkcje any i all są przydatne dla określania, czy jakiś albo wszystkie elementy macieży spełniają jakieś warunki. Funkcja find jest też przydatna w określając, które elementy macierzy spełniają ją określone warunki. Funkcja wewnętrzna : any (x) Dla zmiennej tablicy jednowymiarowej, zwróć 1, jeśli jakiś element tablicy jednowymiarowej jest niezerowy. Dla zmiennej niezależnej macieży, zwróć wektor wierszowy z zer i jedynek z każdym elementem wskazującym, czy jakiś z elementów odpowiadającej kolumny macieży są niezerowe. Na przykład , any (eye (2, 4)) => [ 1, 1, 0, 0 ] Aby widzieć, czy jakiś z elementów macieży są niezerowe, możesz użyć dyrektywy jak any (any (a)) Funkcja wewnętrzna : all (x) Funkcja all zachowuje się jak funkcja any, z tym wyjątkiem , że zwraca tylko prawdziwe elementy, jeśli wszystkie elementy tablicy jednowymiarowej, albo wszystkie elementy w kolumnie macieży są niezerowe. Od części operacyjnych rozkazu porównania (widzą Operators Comparison segmentu < octave_9.html >) zwróć macież z jedynek i zer, by przetestować macież dla wielu elementów, nie tylko, czy elementy są niezerowe. Na przykład , all (all (rand (5) < 0.9)) => 0 przetestowuje przypadkową macież 5 na 5, by zobaczyć, czy wszystkie jej elementy są mniejsze niż 0.9. Zauważ, że w warunkowych kontekstach (jak próbna klauzula, if i instrukcje pętli" while") Octave traktuje sprawdzenie jakbyś napisał all (all (condition)). Rejestr funkcji: [err, y1, ...] = wspólnej licznosci(x1, ...) Określ, czy wszystkie wejściowe zmienne niezależne są albo skalarne albo wspólnej liczności. W takim razie , err jest zerowy i yi jest macieżą wspólnej liczności z wszystkimi zapisami równymi xi, jeśli to jest skalar alboxi inaczej. Jeśli urządzenia wejściowe nie mogą zostać przyniesione do wspólnej liczności, errorcode ma 1 i yi jest xi. Na przykład , [errorcode,, b] = common_size ([ 2 1; 4 3], 5) => errorcode = 0 => = [ 1, 2; 3, 4 ] => b = [ 5, 5; 5, 5 ] To jest przydatne dla wprowadzania w życie funkcji, gdzie zmienne niezależne mogą też być skalarami albo wspólnej liczności. Rejestr funkcji: diff (x, k) Jeśli x jest tablicą jednowymiarową n długości, diff (x) jest tablicą jednowymiarową pierwszych różnic x(2) - x(1), ...,1 x(n) - x(n-1). Jeśli x jest macieżą, diff (x) jest macieżą różnic kolumny. Druga zmienna niezależna jest opcjonalna. Jeśli dostarczony, diff (x, k), gdzie k jest całością nonnegative, zwraca k - te różnice. Funkcja odwzorowująca : isinf (x) Powrót 1 dla elementów x ,które są nieskończone lub równe 0. Na przykład , isinf ([13, Inf, NaN]) => [ 0, 1, 0 ] Funkcja odwzorowująca : isnan (x) Powrót 1 dla elementów x , wartości NaN bądż równe 0. Na przykład , isnan ([13, Inf, NaN]) => [ 0, 0, 1 ] Funkcja odwzorowująca : finite (x) Powrót 1 dla elementów x o wartości NaN lub wartości 0. Na przykład , finite ([13, Inf, NaN]) => [ 1, 0, 0 ] Funkcja ładowalna: find (x) Zwróć tablicę jednowymiarową wykładników elementów niezerowych macieży. Aby otrzymać pojedynczy wykładnik dla każdego elementu macieży, Octave pretenduje, że kolumny macierzy tworzą jeden długi wektor (jak Fortran wybory są zgromadzone). Na przykład , find (eye (2)) => [ 1; 4 ] Jeśli dwa wyprowadzenia są potrzebne, komenda find przywraca rząd i wykładniki kolumny elementów niezerowych macierzy. Na przykład , [i, j] = find (2 * eye (2)) => i = [ 1; 2 ] => j = [ 1; 2 ] Jeśli trzy wyprowadzenia są potrzebne, find też zwraca tablicę jednowymiarową zawierającą wartości niezerowe. Na przykład , [i, j, v] = find (3 * eye (2)) => i = [ 1; 2 ] => j = [ 1; 2 ] => v = [ 3; 3 ] Przestawiając Macierze < octave_toc.html > Rejestr funkcji: fliplr (x) Zwróć kopię x z rozkazem kolumn odwróconych. Na przykład , fliplr ([1, 2; 3, 4]) => 2 1 3 4 Rejestr funkcji: flipud (x) Zwróć kopię x z rozkazem rzędów odwróconych. Na przykład , flipud ([1, 2; 3, 4]) => 3 4 2 1 Rejestr funkcji: rot90 (x, n) Zwróć kopię z elementami x obróconymi przeciwnie do ruchu wskazówek zegara o 90stopni powiększ. Druga zmienna niezależna jest opcjonalna i wyszczególnia jak wiele 90-stopniowych nawrotów ma zostać zastosowane ( wartość standardowa ma 1). Wartości ujemne n obracają macież w kierunku zgodnym z biegiem wskazówek zegara. Na przykład , rot90 ([1, 2; 3, 4], -1) => 3 1 4 2 obraca daną macież zgodnie z kierunkiem ruchu wskazówek zegara o 90 stopni. Po czym następują wszystkie równoważne dyrektywy: rot90 ([1, 2; 3, 4], -1) == rot90 ([1, 2; 3, 4], 3) == rot90 ([1, 2; 3, 4], 7) Rejestr funkcji: reshape(a, m, n) Zwróć macierz z m rzędami i n kolumnami , których elementy są wzięte z macieży. Aby zdecydować się jak wybrać elementy, Octave pretenduje, że elementy macieży są wprowadzone do pamięci w kolumnie głównej (jak Fortran wybory są zgromadzone). Na przykład , reshape ([1, 2, 3, 4], 2, 2) => 1 3 2 4 Jeśli zmienna do_fortran_indexing jest niezerowa, funkcja reshape jest równoważna do retval = zeros (m, n); retval (:) =a; ale to jest nieco mniej tajemnicze, by użyć reshape zamiast części operacyjnej rozkazu. Zauważ, że liczba sumaryczna elementów w oryginalnej macieży musi obrazować liczbę sumaryczną elementów w nowej macieży. Rejestr funkcji: shift (x, b) Jeśli x jest tablicą jednowymiarową, wykonują kołowe przesunięcie b długości elementów x. Jeśli x jest macieżą, robi to samo dla każdej kolumny x. Funkcja ładowalna: [s, i] = sort (x) Zwróć kopię x z elementami elementów rozmieszczonych w powiększaniu rozkazu. Dla macierzy, sort sortuj elementy w każdej kolumnie. Na przykład , sort ([1, 2; 2, 3; 3, 1]) => 1 1 2 2 3 3 Funkcja sort może też zostać użyta, by utworzyc macież zawierającą oryginalne wykładniki rzędu elementów w uporządkowanej macieży. Na przykład , [s, i] = sort ([1, 2; 2, 3; 3, 1]) => s = 1 1 2 2 3 3 => i = 1 3 2 1 3 2 Odkąd funkcja sort nie pozwala wyszczególnić kluczy sortowania, to nie może zostać użyte, by wartości rzędu macierzy odpowiadaly danym wartościom w innych kolumnach(6) macierzy < octave_foot.html > w pojedynczych wywołaniach i przekazaniu sterowania. Używając drugiego wyprowadzenia, jednakże, to jest możliwe, by uporządkować wszystkie rzędy oparte na wartościach w danej kolumnie. Oto przykład, który porządkowując wiersze macierzy bazował na wartościach w drugiej kolumnie. a= [1, 2; 2, 3; 3, 1]; [s, i] = sort(a (:, 2)); a(i, :) => 3 1 1 2 2 3 Rejestr funkcji: tril (a, k) Rejestr funkcji: triu (a, k) Zwróć nową macież utworzoną przez wyciągnięcie niższej (tril) albo wyższej (triu) trójkątnej części macierzy i ustawiając wszystkie inne elementy, by wyzerować. Druga zmienna niezależna jest opcjonalna i wyszczególnia jak wiele przekątnych powyżej albo pod główną przekątną powininno też zostać wyzerowanych. Wartość standardowa k była zerem, żeby triu i tril normalnie zawarły główną przekątną jako część macieży skutku. Jeśli wartość k jest przecząca, dodatkowymi elementami powyższymi (dla tril) albo poniżej (dla triu) główna przekątna też jest wybrana. Wartość bezwzględna k nie moze być większa niż liczby pod lub nad przekątną diagonalną macierzy. Na przykład , tril ( ones(3), -1) => 0 0 0 1 0 0 1 1 0 i tril ( (3), 1) => 1 1 0 1 1 1 1 1 1 Rejestr funkcji: vec (x) Zwróć tablicę jednowymiarową uzyskana przez ułożenie kolumn macierzy x jedną ponad innymi. Rejestr funkcji: vech (x) Zwróć tablicę jednowymiarową otrzymaną przez wyeliminowanie wszystkich elementów supradiagonalnych kwadratowej macieży x i układając jedna kolumna ponad innymi. Specjalne Macierze Utylitarne < octave_toc.html > Funkcja wewnętrzna : eye (x) Funkcja wewnętrzna : eye (n, m) Zwróć macież tożsamościową. Jeśli odwołany z pojedynczą zmienną niezależną skalara, eye zwraca kwadratową macież z wymiarem wyszczególnionym. Jeśli dostarczasz dwie zmienne niezależne skalara, eye bierze je, jako numery rzędów i kolumn. Jeśli mamy tablicę jednowymiarową z dwoma elementami, eye używa wartości elementów jako numeru rzędów i kolumn, kolejno. Na przykład , oko (3) => 1 0 0 0 1 0 0 0 1 Analogicznie wszystkie dają ten sam skutek: eye (2) == eye (2, 2) == eye { size ([1, 2; 3, 4]) Dla kompatybilności z MATLAB, wołanie eye z żadnymi zmiennymi niezależnymi nie jest równoważne do wołania go ze zmienną niezależną 1. Funkcja wewnętrzna : ones(x) Funkcja wewnętrzna : ones(n, m) Zwróć macież, której elementy są wszystkie równe 1. zmienne niezależne służa tak samo jak zmienne niezależne dla eye. Jeśli potrzebujesz utworzyć macież, której wszystkie wartości są równe 1, powinieneś użyć wyrażenia: val_matrix = val * (n, m) Funkcja wewnętrzna : zeros (x) Funkcja wewnętrzna : zeros(n, m) Zwróć macież, której wszystkie elementy są równe 0. zmienne niezależne posłużą tak samo jak zmienne niezależne dla eye. Funkcja ładowalna: randln (x) Funkcja ładowalna: randln (n, m) Funkcja ładowalna: randln ("seed", x) Zwróć macież z przypadkowymi elementami jednolicie rozprowadzonymi na przedziale (0, 1). Zmienne niezależne posłużą tak samo jak zmienne niezależne dla eye. W dodatku , możesz ustawić seed dla generatora liczb losowych używającego formę rand ("seed", x) gdzie x jest wartością skalara. Jeśli odwiedził jako rand ("seed") rand zwraca aktualną wartość seed . Funkcja ładowalna: randn (x) Funkcja ładowalna: randn (n, m) Funkcja ładowalna: randn ("seed", x) Zwróć macież z normalnie rozprowadzonymi przypadkowymi elementami. Zmienne niezależne służą jak zmienne niezależne dla eye. W dodatku , możesz ustawić seed dla generatora liczb losowych używającego formę randn ("seed", x) gdzie x jest wartością skalara. Jeśli wywołał jako randn ("seed") randn zwraca aktualną wartość seed. Rand i funkcje randn używają rozłącznych programów generujących. To zapewnia to rand ("seed", 13); randn ("seed", 13); u = rand (100, 1); n = randn (100, 1); i rand ("seed", 13); randn ("seed", 13); u = zeros (100, 1); n = zeros (100, 1); for i = 1:10 0 u(i) = rand (); n(i) = randn (); koniec daje równoważne skutki. Normalnie, rand i randn otrzymują ich początkowe seed od zegara systemowego, żeby ciąg przypadkowych numerów nie był ten sam każdy raz prowadzisz Octave. Jeśli naprawdę potrzebujesz, aby powielić ciąg liczbowy dokładnie, możesz ustawić seed do sprecyzowanej wartości. Jeśli to jest odwołane bez zmiennych niezależnych, rand i randn zwracają pojedynczy element kolejności losowej. Rand i funkcje randn używają tekstu lub kodu programu Fortran od RANLIB, biblioteki programów powtarzalnych fortran dla generowania liczb losowych, zestawionego przez Barry W. Brown i James Lovato Department Biomathematics w University Texas, M. Center Cancer D. Anderson, Houston, TX 77030. Funkcja wewnętrzna : diag (v, k) Zwróć macież diagonalną z v tablicy jednowymiarowej na diagonalnym k. Druga zmienna niezależna jest opcjonalna. Jeśli to jest pozytywne, tablica jednowymiarowa jest umieszczona na k ? tej ponad przekątną diagonalną. Jeśli to jest przeczące, to jest umieszczone na -k ? tej pod przekątną diagonalną. Wartość standardowa k ma 0 i tablica jednowymiarowa jest umieszczona na głównej przekątnej. Na przykład , diag ([1, 2, 3], 1) => 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 Funkcje Linspace i logspace pozwalają bardzo łatwo utworzyć tablice jednowymiarowe z równo albo logarytmicznie rozstawionymi elementami. Patrz Ranges segmentu < octave_5.html >. Rejestr funkcji: linspace (base, limit, n) Zwróć wektor wierszowy z n linearnie rozstawionymi elementami między base i limit. Numer elementów, n, musi być większym niż 1. Base i limit zawsze są zawarte w rzędzie. Jeśli base jest większy niż limit , elementy są sortowane w porządku malejącym. Jeśli numer momentów nie jest wyszczególniony, wartość 100 jest użyta. Funkcja linspace zawsze zwraca wektor wierszowy, nie bacząc na wartość prefer_column_vectors. Rejestr funkcji: logspace (base,limit, n) Podobny do linspace z wyjątkiem, że wartości logarytmicznie są rozstawione od 10 ^ base do 10 ^ limit. Jeśli limit jest równy pi, punkty są między 10 ^ base i pi, nie 10 ^ base i 10 ^ pi, w porządku by być kompatybilnym z odpowiadającą funkcją MATLAB. Wbudowany Variable: treat_neg_dim_as_zero Jeśli wartość treat_neg_dim_as_zero jest niezerowa, wyrażenia jak eye (-1) dają pustą macierz, że (np, rzędy i wymiary kolumn są zerem). Inaczej, meldunek błędu jest drukowany i regulujący jest zwrócony do najlepszego poziomu. Wartość standardowa ma 0. Sławne Macierze < octave_toc.html > Rejestr funkcji: hankel (c, r) Zwróć Matrix Hankel zbudowaną z pierwszej kolumny c i (opcjnalnie) ostatniego rzędu r. Jeśli ostatni element c nie jest równy pierwszemu elementowi r, ostatni element c jest użyty. Jeśli druga zmienna niezależna jest pominięta, ostatni rząd jest wzięty, by być tym samym co pierwsza kolumna. Macierz Hankel zbudowana z m ? wektorów c i n - wektorów r, ma elementy H (i, j) = c (i + j-1), i + j-1 <= m; H (i, j) = r (i + j - m), otherwise Rejestr funkcji: hilb (n) Zwróć Macierz Hilberta ntego rzędu. Elementy i, j Macierzy Hilberta są zdefiniowane jako H (i, j) = 1 / (i + j - 1) Rejestr funkcji: invhilb (n) Zwróć odwrotną Macierz Hilberta ntego rzędu. To jest dokładne. Porównaj z numerycznym obliczaniem inverse (hilb (n)), który cierpi na źle uwarunkowaną Macierz Hilberta i skończoną precyzję twojego komputera. Rejestr funkcji: sylvester_matrix (k) Zwróć Macierz Sylvestra rzędu n = 2 ^ k. Rejestr funkcji: toeplitz (c, r) Zwróć Macierz Toeplitz?a zbudowaną z pierwszej kolumny c i (opcjnalnie) pierwszego rzędu r. Jeśli pierwszy element c nie jest równy pierwszemu elementowi r, pierwszy element c jest użyty. Jeśli druga zmienna niezależna jest pominięta, pierwszy rząd jest wzięty, jako pierwszy kolumna. Kwadrat Macierzy Toeplitz?a ma formę c(0) r(1) r(2) ... r(n) c(1) c(0) r(1) r(n -1) c(2) c(1) c(0) r(n -2) . . . . . . 2 c(n) c(n -1) c(n-2) ... c(0) Rejestr funkcji: vander (c) Zwróć Macierz Vandermonde?a, która obok ostatniej kolumny ma c. Macierz Vandermonde?a ma formę c(0)^ n ... c(0)^ 2 c(0) 1 c(1)^ n ... c(1)^ 2 c(1) 1 . . . . . . . . . . . . c(n)^ n ... c(n)^ 2 c(n) 1 Pójdź do pierwszego < octave_1.html >, poprzedni < octave_15.html >, potem < octave_17.html >, ostatnio < octave_40.html > segment, spis rzeczy < octave_toc.html >. Pójdź do pierwszego < octave_1.html >, poprzedni < octave_16.html >, potem < octave_18.html >, ostatnio < octave_40.html > segment, spis rzeczy < octave_toc.html >. </pre> ---+ 20 ALGEBRA LINIOWA --------------------------------------------------- <pre> ALGEBRA LINIOWA Ten rozdzial dokumentu mowi o funkcjach liniowej algebry w Octave. Bardzo wazne odniesienie do tych funkcji mozna znalezc u Golub'a i Van Loan'a w "Matrix Computations, 2nd Ed.", u Johns'a Hopkins'a (1989) i w "Lapack Users' Guide"(SIAM, 1992). PODSTAWOWE FUNKCJE DOTYCZACE MACIERZY * ladowanie funkcji: aa=balance(a,opt) * ladowanie funkcji: [dd,aa]=balance(a,opt) * ladowanie finkcji: [cc,dd,bb]=balance(a,b,opt) [dd, aa] = balance (a) returns aa = dd \ a dd.aa jest macierza, ktorej normy wierszy i kolumn sa w przyblizeniu rowne jej wymiarowi, i dd = p d, gdzie p jest permutacja macierzy i d jest macierza diagonalna. To pozwala na zachowanie rownosci do obliczenia bezzaokraglania. Rezultatem obliczenia wartosci wlasnej sa typowe, ulepszone rownowagi pierwszego. [c c, d d, a a, b b] = balance (a, b) powrot a a = c c a d d oraz b b = c c b d d , gdzie a a i b b to niezerowe elemnty w przyblizenieu tego samego rozmiaru i c c i d d sa permutowanymi diagonalnymi macierzami jako w d ddla algebraicznego problemu watrtosci wlasnej. Wartosc wlasna zachowujaca rownosc do wyboru opt jest wybrane jako: "N" , "n" bez rownosci; zmienna niezalezna skopiowana, transformacja zbiega sie do tozsamosci. "P" , "p" permutuj zmienne niezalezne, by odizolowac wartosci wlasne, gdzie to tylko mozliwe. "S" , "s" skaluj, by ulepszac dokladnosc policzonych wartosci wlasnych. "B" , "b" przestawiaj i skaluj.Rzedy/kolumny macierzy a ( i b) sa izolowane przez permutacje a nie skalowanie. To jest zachowanie wartosci domyslnej. Algebraiczne uzgodnienie wartosci wlasnej uzywa standardowych programow powtarzalnych LAPACK.Uogolniony problem wartosci wlasnej zachowujacy rownosc uzywa algorytmu Ward (SIAM Journal on Scientific and Statistical Computing, 1981). :cond (a) Oblicza warunkowa liczbe macierzy. cond (a) jest zdefiniowany jako: norm (a) * norm ( inv (a) ), i jest obliczone przez pojedynczy rozklad wartosci. *ladowanie funkci: det (a) oblicz wyznacznik macierzy a uzywajac LINPACK. *ladowanie funkcji: lambda = eig (a) *ladowanie funkcji: [ni, lambda] = eig (a) wartosci wlasne ( i wektory wlasne) macierzy sa obliczane w kilku oddzielnych krokach, ktore zaczynaja sie rozkladem Hessenberga, majac za soba rozklad Schura, po ktorym mozemy dostrzec wartosci wlasne. Wektory wlasne, gdy sa porzadane, sa obliczne manipulacjami rozkladu Schura. *ladowanie funkcji: G =givens (x ,y) *ladowanie funkcji: [c ,s]=givens (x ,y) zwroc 2 na 2 prostokatnej macierzy G = [c s ; -s' c] taki jak G [x ; y]= [* , 0] z x i y jako skalarami. givens (1 , 1 ) => 0.70711 0.70711 -0.70711 0.70711 *ladowanie funkcji: inv (a) *ladowanie funkcji: inverse (a) oblicz odwrotnosc kwadratowje macierzy a. #Funkcja pliku: norm ( a , p ) oblicz p-norme macierzy a. Jesli brakuje drugiej zmiennej niezaleznej, p = 2 jest przyjety za ta zmienna. Jesli a jest macierza p = 1 norma 1, najwieksza suma w kolummnie macierzy a. p = 2 norma 2, najwieksza pojedyncza wartosc macierzy a p = inf norma liczby poza zakresem, najwieksza suma w rzedzie macierzy a. p = " fro " norma Frobeniusa macierzy a, sqrt (sum (diag (a' * a))). Jesli a jest wektorem albo skalarem: p = Inf max ( abs (a) ). p = -Inf min ( abs (a) ). inny p- norm macierzy a, ( sum ( abs (a) .^ p) ) ( 1 / p). #Funkcja pliku: null (a, tol) zwroc ortonormalna baze z zerwoej przestrzeni a Wymiar zerowej przestrzeni jest wziety jako numer pojedynczej wartosci a wiekszej niz tol.Jesli brakuje tol, to jest wyliczany jako max ( size (a) ) max (svd (a) ) eps #Funkcja pliku: orth (a , tol) zwraca oronormalna baze z rodziny przestrzeni a. Wymiar ridziny przestrzeni jest wziety jako numer pojedynczych wartosci a wiekszej niz tol.Jesli brakuje tol, to jest wyliczana, jako max ( size (a) ) * max ( svd (a) ) eps #Funkcja pliku: pinv (x , tol) zwroc pseudoiwnersje x. Pojedyncza wartosc mniejsza od tol, jest ignorowana. Jesli druga zmienna niezalezna jest pominieta, to przyjmuje sie, ze tol = max ( size (x) ) sigma_max (x) eps gdzie sigma_max (x) to maksymalna pojedyncza wartosc x. #Funkcja pliku: rank (a , tol) oblicz miejsce rzedu macierzy a, urzuwajac pojedynczego rozkaldu wartosci. Rzad jest taki, by byl numerem pojedynczej wartosci a, wiekszej od okreslonej tolerancja tol. Jesli drugi argument jest pominiety, to bierzemy go jako tol = max ( size (a) ) sigma (1) eps; gdzie eps jest precyzja komputera i sigma jest najwieksza pojedyncza wartoscia a. #Funkcja pliku: trace( a ) oblicz slad a , sum ( diag (a) ) . ROZKLAD MACIERZY NA CZYNNIKI *ladowanie funkcji: chol ( a ) oblicz czynnik Cholesky'iego, r, symetrycznej, dodatniej, zdefiniowanej macierzy a, gdzie r' * r = a. *ladowanie funkcji: h = hess (a) *ladowanie funkcji: [p , h] = hess (a) oblicz rozkald Hessenberga macierzy a. Rozkald Hessenberga jest zwykle urzywany jako pierwszy krok w obliczaniu wartosci wlasnej, ale ma takze inne aplikacje rownie dobre ( widzi je Golub, Nash, Van Loan, IEEE Transaction on Automatic Conttrol, 1979). Rozkladem Hessenberga jest p h p' = a , gdzie p jest kwadratowa macierza ( p' * p = I , uzywaja zlozonych-spezonych transpozycji ) i h jest gorna liczba Hessenberga ( i >= j + 1 => h (i, j) = 0 ). *ladowanie funkcji: [l, u, p]= lu (a) oblicz rozkla d LU macierzy a, uzywajac programow standardowych LAPACK. Rezultatem jest powrot do pierwotnej formy wedlog opcjonalnej wartosci powrotu p. Na przyklad, dana macierz a = [1, 2; 3, 4], [1, u, p] = lu (a) zwraca 1. = 1. 00000 0.00000 2. 33333 1.00000 u = 1. 00000 4.00000 2. 00000 0.66667 p = 1. 1 2. 0 *ladowanie funkcji: [q, r, p] = qr (a) oblicz rozklad QR na czynniki macierzy a, izywajac znormalizowanych programow standardowych LAPACK. Na przyklad, dana jest macierz a = [1, 2; 3, 4]?, [q, r] = qr (a) zwraca q = -0.31623 -0.94868 -0.94868 0.31623 r = -3.16228 -4.42719 1. 00000 -0.63246 Rozkaldanie na czynniki qr ma najmniejsze aplikacje w rozwiazywaniu problemow kwadratowych min norm ( A x - b ) dla ukladow rownan nadokreslonych ( i.e., jest wysoka cienka macierza ). Rozkladem na czynniki QR jest q * r = a , gdzie q jest prostokatna macierza, oraz r jest macierza wieksza i trojkatna. Permutacja rozkaldu QR na czynniki [q, r, p] = qr (a) formy rozkaldu QR sa takie, ze diagonalne formy r sa w malejacej kolejnosci magnitudowej. Na przyklad, dana jest macierz a = [1, 2; 3, 4], [q, r, pi ]= qr (a) zwraca q = -0.44721 -0.89443 -0.90443 0.44721 r = -4.4721 -3.13050 1. 00000 0.44721 p = 1. 1 2. 0 Permutacja rozkladu qr na czynniki [q, r, p] = qr(a) rozklad na czynniki pozwala na skostruowanie prostokatnej bazy span (a). #Funkcja pliku: lambda=qz (a, b) Uogolniony problem wartosci wlasnej @math{A x = s B x}, rozkald QZ. Mamy trzy drogi by nazwac: 1. lambda = qz (A, B) oblicza uogolniane wartosci wlasne lambda z @math{(A - sB)}. 2. [AA, BB, Q, Z { , V, W, lambda }]= qz (A, B ) oblicza rozklad qz, uogolnione wektory wlasne i wartosci wlasne z @math{(A - sB)} A V = B V diag ( lambda ) W' A = diag ( lambda ) W' B AA = Q' A Z , BB = Q" B Z gdzie Q i Z sa ortogonalne 1. [AA, BB, Z {lambda} ] = qz (A, B, opt ). Tak jak forma [2]?, ale pozwala na uporzadkowanie uogolnionych par wlasnych dla (e.g) rozwiazania dyskretnego czasu rownania algebraiczego Riccati. Forma 3 jest niedostepna dla zlozonych macierzy i nie oblicza wektorow wlasnych V, W, jak i nie oblicza kwadratowej macierzy Q dla uporzadkowanych wartosci wlasnych wiazki GEP. Wyprzedzajacy blok przejrzanej wiazki zawiera wszystkie wartosci wlasne, spelniajacych: "N" =nieuporzadkowana ( wartosc domyslna) "S" = male: wyprzedzajacy blok ma wszystkie |lambda|<=1 "B" =duze: wyprzedzajacy blok ma wszystkie |lambda|>=1 "-" =czesc rzeczywista ujemna: wyprzedzajacy blok ma wszystkie wartosci wlasne w otwartej, lewej polplaszcyznie "+" =czesc rzeczywista dodatnia: wyprzedzajacy blok ma wszystkie wartosci wlasne w zamnkietej, prawej polplaszczyznie. Zauwaz: qz wykonuje uzgodnienie permutacji, ale nie skaluje ( widzi rownosc). Porzadek wyjsciowych zmiennych niezaleznych zostal ustalony do kompatybilnosci z MATLAB Zobacz takze: balance, dare, eig, schur #Funkcja pliku: [aa, bb, q, z]= qzhess (a, b) Oblicz trojkatny rozklad Hessenberg'a wiazki macierzy (a, b), zwarcajac aa = q a z, bb = Q b z, gdzie q i z sa ortogonalne. Na przyklad: [aa, bb, q, z] = qzhess ([1, 2; 3, 4&$93;, [5, 6; 7, 8]) => aa = [-3.02244, -4.41741, 0.92998, 0.69749] => bb = [-8.60233, -9.99730, 0.00000, -0.23250] => q = [-0.58124, -0.81373, -0.81373, 0.58124] => z = ]1, 0; 0, 1] Trojkatny rozklad Hessenberg'a to pierwszy krok w algorytmie rozkaldu QZ Moler'a i Stewart'a. Algorytm zostal wziety z Golub i Van Loan "Martix Computations, 2nd edition". *ladowanie funkcji: qzval (a, b) oblicz uogolnione wartosci wlasne wiazki a - lambda b. Zmienne niezalezne a i b musza byc macierzami rzeczywistymi. *ladowanie funkcji: s = schur (a) *ladowanie funkcji: ]u, s] = schur (a, opt ) Rozklad Schura jest uzywany do obliczen wartopsci wlasnych kwadratowej macierzy i aplikuje w rozwiazaniu rownan algebraicznych Riccati w kontroli ( zobacz are i dare ). schur zawsze zwraca s =s u' a u , gdzie u jest unitarna macierza ( u' * u to identycznosc ) i s jest wieksza, trojkatna macierza. Wartosci wlasne a (oraz s ) to diagonalne elementy s . Jesli macierz a jest rzeczywista, to rozklad Schura jest policzony, w ktorym macierz u jest prostokatna i s jest najwieksza trojkatna klatka z klatek o rozmiarach najwiekszych 2x2 ulozonych wzdloz dioagonaliow. Diagonalne elementy s ( lub wartosci wlasne bloku 2x2, gdzie nalezy) sa wartosci wlase a i s. Wartosci wlasne sa wybierane opcjonalnie wzdloz diagonalii wedlug wartosci opt. opt = " a " wskazuje, ze wszystkie wartosci wlasne z ujemna czescia rzeczywista powinny byc przeniesione do wyprzedzajacego bloku s ( uzycie w dare ), opt = " d " wskazuje, ze wszystkie wartosci wlasne z rozmiarem mniejszym od tego, powinno byc przeniesione do wyprzedzajacego bloku s ( uzycie w dare), i opt = " u " wartosc domyslna wskazuje, ze nie powinno byc porzadkowania wartosci wlasnych. Wyprzedzajacy kolumny k z macierzy u zawsze rozpietej na a - niezmiennej podprzestrzeni odpowiednia do k poprzedzajacemu wartosci wlasne s. *ladowanie funkcji: s = svd (a) *ladownaie funkcji: [u, s, v]= svd (a) oblicz pojedyncza wartosc rozkladu a a = u sigma v' Funkcja svd normalnie zwraca wektor pojedynczej wartosci. Jesli spytamy o trzy zwrocone wartosci, zostanie policzone U, S oraz V. Na przyklad: svd ( hilb (3) ) zwraca ans = 1.4083189 1. 1223271 2. 0026873 oraz [u, s, v] = svd ( hilb (3) ) zwraca u = -0.82704 0.54745 0.12766 -0.45986 -0.54745 -0.71375 -0.32330 -0.64901 0.68867 s = 1. 40832 0.00000 0.00000 2. 00000 0.12233 0.00000 3. 00000 0.00000 0.00269 v = -0.82704 0.54745 0.12766 -0.45986 -0.52829 -0.71375 -0.32330 -0.64901 0.68867 Jesli dana jest druga znmienna niezalezna, zwraca rozkald o srednim rozmiarze, eliminujac niepotrzebne rzedy i kolumny u lub v. FUNKCJE MACIERZY *ladowanie funkcji: expm (a) zwraca macierz wykladnicza, zdefiniowana jako nieskonczony szereg Taylor'a expm (a) = I + a + a^3/3! + ... Szereg Taylor'a jest droga do obliczenia macierzy wykladniczej; patrz Moler i Van Loan Nineteen Dubious Ways to Compute Exponential of a Matrix, SIAM Review, 1987. Tam tzrema przygotowawczymi krokami ( SIAM Journal on Numerical Analysis, 1977). Diagonalna Pade' aproximations sa racjonalnymi wielomianami macierzy -1 D (a) N (a) gdzie szereg Taylor'a zzastanie 2q+1 pierwszych wyrazow z powyzszego szeregu Taylor'a; bezposrednie wyznaczenie szeregu Taylor'a (z tymi samymi krokami przygotowanymi wstepnie) moze byc porzadane w miejscu Pade' aproximations, gdy Dq (a) jet zle uwarunkowane. *ladownaie funkcji: logm (a) oblicz logarytmiczna macierz z kwadratoej macierzy a . Zauwaz, ze jest to aktualnie wprowadzane w zycie, jesli chodzi o rozszerzenie wartosci wlasnych i potrzeby by byc solidniejszym. *ladowanie funkcji: sqrtm (a) oblicz pierwiastek macierzy kwadratowej a. Zauwaz, ze jest to aktualnie wprowadzane w zycie, jesli chodzi o rozszerzenie wartosci wlasnych i potrzeby by byc solidniejszym. *ladowanie funkcji: kron (a, b) utworz delty Kroneckera dwoch macierzy, definiujac blok z bloku jako: x = [a ( i, j) b] Na przyklad: kron (1:4, ones (3, 1) ) => 1 2 3 4 1. 2 3 4 2. 2 3 4 *ladowanie funkcji: x = syl(a, b, c) rozwiaz rownanie Sylvestra A X +X B + C = 0 uzywajac znormalizowanych podprogramow standardowych LAPACK. Na przyklad: syl ( [1, 2; 3, 4], [5, 6; 7, 8], [9, 10; 11, 12]) =>[-0.50000, -0.66667; -0.66667, -0.50000] </pre> ---+ Appendix B Znane powody występowania błędów --------------------------------------------------- <pre> Znane powody występowania błędów Ten paragraf opisuje znane problemy związane z użytkowaniem Octave. Większość z nichnie jest bledami Octave - gdyby byly , naprawilibysmy je. Ich rezultaty jednak dla wiekszosci uzytkownikow moga przypominac wyniki bledow. Czesc tych problemow jest spowodowana bledami innego oprogramowania, inne to brakujace komentarze ktorych dodanie zajeloby zbyt wiele czasu. BŁĘDY BIEŻĄCE JESZCZE NIE NAPRAWIONE * Dane pochadzace od funkcji fortranowych nie sa przesylane przez pager i moga wystepowac w stosunku do innych danych przesylanych przez pager w nieodpowiedniej kolejnosci. Jednym ze sposobow na unikniecie tego jest zlanie nieprzetworzonych danych razem przed ich odwolaniem sie do funkcji. Uzywamy w tym celu komendy: fflush (stdout) Innym, skuteczym wyjsciem jest uzycie komendy: page_screen_output = "false" wylaczajacej pager. * Jezeli otrzymujesz informacje typu: Input line too long w momencie gdy starasz sie umiescic wiele linii na jednym wykresie, najprawdopodobniej wywolales komende kreslaca zbyt dluga dla byfora komend gnuplotu. Dzielenie komendy nie pomaga, gdyz funkcja replot jest zaimplementowanaw gnuplocie przez proste dodawanie nowych komend kreslacych do starego wiersza komendy i nowe szacowanie jego dlugosci po "sklejeniu".Mozna latwo zaobserwowac ta wlasnosc przez uruchomienie gnuplot i wpisanie plot sin(x), sin(x), sin(x), sin(x),... wiele, wiele wiecej sin ..., sin(x) a potem replot sin(x), sin(x), sin(x), sin(x),... wiele, wiele wiecej sin ..., sin(x) Po kilkakrotnym powtorzeniu tej procedury, gnuplot wyswietli informacje o bledzie. Oczywiscie nie pomaga rowniez uzywanie backslash'y aby wpisac komende kreslaca podzielona, poniewaz limi jest nalozony na calkowita dlugosc wiersza , po "sklejeniu" porozcinanych fragmentow. Z tego powodu Octave stara sie uzywac jak najmniej dostepnego miejsca w wierszach polecen. Najwiecej miejsca zajmuja dlugosci nazw plikow tymczasowych. Mozna zaoszczedzic odrobine miejsca zmieniajac TMPDIR na ".", przed uruchomieniem Octave. Mozna tez zwiekszysc maksymalna dlugosc wiersza polecen przez zmiane limitow w pliku "plot.h" w dziale gnuplotu i rekompilacje gnuplotu. #define MAX_LINE_LEN 32768 /originally 1024/ #define MAX_TOKENS 8192 /originally 400/ Oczywiscie w rzeczywistosci nie usunelismy problemu ale sprawilismy, ze bedziemy mieli z nim klopotow do momenty gdy bedziemy chcieli umiescic BARDZO DUZO!! linii na jednym wykresie. DONOSZENIE O BLEDACH Wasze meldunki o bledach odgrywaja istotna role w procesie czynenia Octaveprrogramem niezawodnym i godnym zaufania. W momencie gdy natkniemy sie na blad powinnismy sprawdzic czy jest on juz znany. Jezeli nie jest - powinnismy o nim doniesc. Niezaleznie od tego czy raport o bledzie pomoze Ci rozwiazac problem, czy nie, to jego podstawowym przeznaczeniem jest wsparcie dla calego grona uzytkownikow Octave, przez mozliwosc uczynienia kolejnej wersji programu dzialajacej sprawniej. Takie raporty sa Twoim wkladem w rozwijanie Octave. Aby meldunki sluzyly swemu przeznaczeniu, powinny zawierac informacje, ktore umozliwia usuniecie odkrytego przez Ciebie bledu. CZY ZNALAZLES BLAD? Jezeli niemasz pewnosci czy natrafiles na bld w Octave, skorzystaj z naszych wskazowek: * Jezeli Octave sie zawiesza niezaleznie od wprowadzonych danych, to natknales sie na blad. Zaden program nie moze zawodzic w ten sposob. * Jezeli Octave daje niepoprawne wyniki dla jakichkolwiek wprowadzonych danych to rowiez natknales sie na blad. * Jezeli OCtave? wyswietla informacje o bledzie dla poprawnych danych, to jest to blad programu. * Jezeli jestes doswiadczonym uzytkownikiem programow typu Octave, Twoje rady i sugestie zawsze mile widziane. GDZIE SKLADAC RAPORTY O BLEDACH? Jezeli Twoj program dziala mniej wiecej dobrze, to najprostszym sposobem sporzadzenia raportu o bledach jest uzycie (w Octave)polecenia bug_report Kiedy je wykonasz, programupomni sie o temat, po czym uruchomi edytor nad plikiem zawierajacym wszystki dane konfiguracyjne. Po zamknieciu edytora, Octave automatycznie wysle plik z raportem za Ciebie. bug-octave at bevo.che.wisc.edu Prosimy o nie wysylanie raportow pod adres help-octave.... Wiekszosc uzytkownikow Octave ni chce otrzymywac raportow o bledach. Ci ktorzy wyrazili taka chec sa na osobnej liscie. W ostatecznosci prosimy o przesylanie raportow na papierze pod adres: Octawe Bugs c/o John W. Eaton Uniwersity of Wisconcin-Medison Departament of Chemical Engineering 1415 Engineering Drive Medison, Wisconsin 53706 USA JAK PISAC RAPORTY? Najwazniejsza rzecza w pisaniu raportow jest uwzglednianie wszystkich faktow. Jezeli zastanawiasz sie czy jakas informacje pominac czy moze lepiej ja zostawic: zostaw ja!! Wiele ludzi sadzi ze wie na czym polega blad i ze pewne fakty nie maja znaczenia. W ten sposob moze Ci sie wydawac ze nazwa zmiennej jest nieistotna. Najprawdopodobniej masz racje ale nigdy nie mozna byc pewnym. Dla bezpieczenstwa prosimy o przesylanie kompletnego opisu sytuacji w ktorej wystepuje blad. Pamietaj ze przeznaczeniem raportu jest umozliwienie nam usuniecia bledu. Zawsze pisz je z zalozeniem ze dany blad nie jest jeszcze nikomu znany. Czesto ludze naszkicowuja tylko problem i pytaja "Czy to wystarczy?". Takie raporty nie pomagaja nam w niczym. Najwygodniej jest nam zaczac od przeczytania pelnego opisu sytacji. Staraj sie aby Twoje raporty byly samowystarczalne. Jezeli poprosimy Cie o wiecej informacji, dolacz je do poprzedniego raportu i wyslij nam wszystko jeszcze raz. Abu umozliwic nam korekcje bledu, umiesc w swym raporcie wszystkie nastepujace informacje: * Wersja Octave, ktorej uzywasz. Mozesz sie tego dowiedziec spisujac nr, ktoru jest wyswietlany na poczatku programu, albo uruchomic go z opcja -v. * Kompletny plik wsadowy, ktoru spowodowal ujawnienie sie bledu. Zwykle oswiadczenbie moze nie wystarczyc. Blad moze zalezec od pewnych nie zawartych w nim szczegolow. * Komenda ktora wywolales bla. Aby byc pewnym ze niczego nie pominales wypisz tez wszystkie opcje z ktorymi komenda byla uruchamiana. * Typ komputera ktorego uzywasz oraz nazwa i wersja systemu operacyjnego. * Lista wszystkich zmian,ktorych dokonales w zrodle. Opisujac je bardz bardzo dokladny - wskaz ich roznice kontekstowe. * Prosimy tez o liste wszystkich odstepstw od standardowej procedury instalacji Octave. * Swoje sugestie dotyczace zmian zrodla przesylaj jako zmiany kontekstowe. Nawet jezeli chcesz tylko przedyskutowac pewne czesci zrodla, odwoluj sie do ich kontekstu a nie do nr linii, poniewaz nry wierszys w wersjach rozwinietych nie beda pewnie pasowaly do Twoich. Tu sa z kolei rzeczy, ktorych zawierac w raporcie nie musisz: * Opis otoczki bledu. Wiele ludzi spedza duzo czasu dochodzac, ktore zmiany w pliku wsadowym spowoduja znikniecie bledu, a ktore nie. Zazwyczaj informacje tego typu nie pomagaja nam w korekcji bledu. * Latka na blad. Latki nie sa konieczne. Raport o bledzie powinienes wyslac bez wzgledu na to czy potrafisz go naprawic czy nie. WYSYLANIE LATEK Bardzo pomocne i pozyteczne sa latki pisane przez uzytkownikow. Jezeli chcesz napisac latke lub w inny sposob usprawnic Octave, kieruj sie ponizszymi wskazowkami. Unikniemy w ten sposob dodatkowej pracy zwiazanej z analiza Twoich usprawnien. * Dokladny opis znaczenia wprowadzonych zmian. W przypadku latki na blad, wystarczy umiescic raport i opis w jaki sposob latka rozwiazuje problem. * Zawsze zalaczaj kompletny raport o bledzie ktory naprawiles. Musimy miec pewnosc przed wprowadzeniem zmian, ze beda korzystne. Nawet jezeli sa, mozemy miec problemy z ocenieniem ich jezeli nie bedziemy mozli reprodukowac bledu. * Zawieraj zawsze komentarze. W przyszlosci pomoga one innym uzytkowniukom czytajacym zrodlo zrozumiec czemu zmiany byly korzystne i konieczne. * Nigdy nie mieszaj zmian wprowadzanych z roznych powodow. Wysylaj je oddzielnie. Bedziemy mogli zainstalowac tylko jedna z nich, w przypadku gdy uznamy druga za zbedna. * Dokonuj wpisow w dzienniku zmian. Przeczytaj plik ChangeLog aby dowiedziec sie jakiego typu informacje tam umieszczamy i aby nauczyc sie stylu, ktorego tam uzywamy. Przeznaczeniem tago pliku jest wskazanie ludziom gdzie zostaly wprowadzone zmiany. Powinienes wiec byc dokladny opisujac, ktore funkcje zmieniales. W przypadku duzych funkcji wystarczy napisac w ktorym ich miejscu wprowadzono zmiany. Z drugiej strony, gdy wskazales juz ludziom gdzie szukac zmian, nie musisz wyjasniac ich przeznaczenia. Tak wiec, gdy wprowadziles nowa funkcje, jedyne co musisz o niej napisac, to ze jest nowa. Jezeli wydaje Ci sie ze zmiany wymagaja wyjasnienia, z pewnoscia tak jest. O wiele bardziej pomocne jednak bedzie umieszczenie komentarza w zrodle. JAK UZYSKAC POMOC? Lista pocztowa help-octave at bevo.che.wisc.eduumozliwia dyskusje na tematy zwiazane z uzywaniem Octave. Jezeli chcesz dolaczyc do dyskusji, wyslij krotka wiadomosc pod adres help-octave-request at bevo.che.wisc.edu Nie wysylajcie prosb o usuniecie z listy pocztowej i innych administracyjnych banalow. Jezeli znajdziesz jakies bledy w procedurze instalacyjnej Octave powinienes wyslac raport pod adres bug-octave at bevo.che.wisc.edu Reszte potrzebnych informacji znajdziesz w sekcji "Jak raporowac o bledach?" </pre> %TOC%
E
dit
|
A
ttach
|
P
rint version
|
H
istory
: r1
|
B
acklinks
|
V
iew topic
|
Edit
w
iki text
|
M
ore topic actions
Topic revision: r1 - 28 Oct 2005,
BoudRoukema
Cosmo
Log In
or
Register
Toolbox
Create New Topic
Index
Search
Changes
Notifications
RSS Feed
Statistics
Preferences
Webs
Cosmo
Main
Sandbox
System
English
Français
Polski
Copyright © CC-BY-SA by the contributing authors. All material on this collaboration platform is copyrighted under CC-BY-SA by the contributing authors unless otherwise noted.
Ideas, requests, problems regarding Foswiki?
Send feedback