zobacz także

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.

1 KROTKIE WPROWADZENIE DO PROGRAMU OCTAVE :



 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.



1.1 URUCHAMIANIE OCTAVE





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.




1.2 PROSTE PRZYKLADY




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).


1.3 Konwencje



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'.


5 Łancuch



********************
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.



3 TYPY DANYCH




**
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.


9 Zmienne



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 (( )).


10 Wyrazenia




 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.


12 DYREKTYWY.




    * 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.



18 MatrixManipulations




 

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 >.




20 ALGEBRA LINIOWA




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]



Appendix B Znane powody występowania błędów



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?"

This topic: Cosmo > WebPreferences > WebHome > OctavePl
Topic revision: 28 Oct 2005, BoudRoukema
 
This site is powered by FoswikiCopyright © 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