Přeskočit na obsah

Pole

Pole je v programovacích jazycích běžná konstrukce. O co jde?. Pole ve fortran je seznam hodnot stejného typu ke kterým přísupujeme pomocí indexu. Pole můžeme deklarovat dvěma způsoby. Buď pomocí specifikace ,dimension() :: nebo pomocí závorky za názvem proměnné.

    integer,parameter :: n = 50, m = 30
    real(8) vektor(3), matice(m,n)
    real(8),dimension(n) :: data
    					

V příkladu jsme vytvořily pole vektro, které má 3 prvky, které jsou vektro(1), vektor(2), vektor(3). Dále pole data pomocí dimension a konstanty n. Pozor pokud by n nebyla konstanta kompilátor by hlásil chybu. A také jsme vytvořily tzv. dvourozměrné pole (má dva indexy) s názvem matice. Tato matice má m sloupečků a n řádků. Maximální počet dimenzí (počet indexů pole) je omezen kompilátorem ve většině případů na hodnotě převyšující 7.

Fortran narozdíl od mnoha jiných jazyků používá číslování polí od 1 do n. Pokud nám tato definice nevyhovuje můžeme pole definovat obecněji real pole(n:m), kde máme pole s indexy od n do m např.

    real a(0:2)
    real b(-2:2)
    					

konstrukce pole

Pole můžeme konstruovat čtyřmi způsoby.

    vektor(1) = 1.d0
    vektro(2) = 2.d0
    vektro(3) = 3.d0
    
    vektor = [ 1.d0 , 2.d0 , 3.d0 ]
    
    vektor = (/ 1.d0 , 2.d0 , 3.d0/)
    
    vektor = (/ (i*1.d0 , i=1,3) /)
    						

Zde používáme pole vektor z předchozího příkladu. V každé části uděláme to samé. První dvě části by měly být jasné. Třetí část je cyklus, kde v druhé části říkáme, že proměnná i bude nabývat hodnot od 1 do 3 a v první části říkáme jak se má spočítat hodnota prvku pole. Pokud vám to zatím není jasné, tak nezoufejte vše se vyjasní až se dostanete k cyklům.

    program priklad_11
    implicit none
    
    	integer,parameter :: n = 5, m = 4
    	integer i
    	real(8), dimension(3) :: vektor! vektor s tremi prvky
    	real(8) matice(m,n)! matice ma m sloupecku a n radku
    
    	matice = 1.d0
    
    	write(*,*) "Zadejte vektor: "
    	read(*,*) vektor 
    	write(*,*) "dekuji, vektor je: ",vektor
    
    	vektor(1) = 1.d0
    	vektor(2) = 2.d0
    	vektor(3) = 3.d0
    	write(*,*) vektor
    
    	vektor = [ 1.d0 , 2.d0 , 3.d0]
    	write(*,*) vektor
    
    	vektor = [ (i*1.d0 , i=1,3) ]
    	write(*,*) vektor
    
    end program
    					

části pole

    program priklad_12
    implicit none
    
    	integer matice(5,4)! matice ma 5 sloupecku a 4 radky
    
    	matice = 1! nastavime kazdy prvek matice na 1
    	write(*,*) matice
    	write(*,*) ! prazdny radek kvuli prehlednosti
    
    	matice(:,1:2) = 2! nastavime prvni dva radky na 2 tj. kazdy sloupecek od 1 do 2 radku
    	write(*,*) matice
    	write(*,*) ! prazdny radek kvuli prehlednosti
    
    	matice(2:4,:) = 3! nastavime 2.-4. sloupecek na 3 tj. kazdy radek v 2.-4. sloupecku
    	write(*,*) matice
    	write(*,*) ! prazdny radek kvuli prehlednosti
    
    end program
    					

K poli nemusíme přistupovat prvek po prvku ale můžeme volit celé části pole se kterými chceme pracovat.

    vektro(1:2) = 1.d0             
    matice(1:10 , :) = 7.d0
    matice(11:19 , 5) = 11.d0
    						

V tomto příkladě nastavujeme 1. a 2. prvek pole vektor na hodnotu 1.d0. Všechny řádky ve sloupcích 1-10 pole matice na 7.d0 atd.

Dvoujtečkový operátor chápeme tak, že nalevo máme od a napravo do, přičemž vynechání hodnoty znamená od začatku popř. až dokonce. např. můžu také napsat matice(5:,:), kde mám všechny sloupce od pěti dál.

operace s poli

S polem můžeme ve většině případů zacházet jako s proměnou. Můžeme k nim příčítat, odčítat číslo nebo proměnnou, násobit je či dělit číslem nebo proměnnou. V takovém případě se příslušná operace aplikuje na každý prvek.

Můžeme také sčítat(+), odčítat(-), nasobit(*), dělit(/) a umocňovat(**) pole mezi sebou. V takovém případě je důležitá aby pole měli stejnou velikost. A operace se provádějí prvek po prvku.

Stejně tak můžeme aplikovat na pole vnitření funkce a tyto funkce se aplikůjí prvek po prvku.

    program priklad_13
    implicit none
    
    	real,dimension(3) :: v,u
    
    	u=[1. , 2., 3.]
    	v=[4. , 5., 6.]
    
    	write(*,*) u+v! vypise 5.0 7.0 9.0 
    	write(*,*) v-u! vypise 3.0 3.0 3.0 
    	write(*,*) v*u! vypise 4.0 10.0 18.0 
    	write(*,*) v/u! vypise 4.0 2.5 2.0 
    	write(*,*) v**u! vypise 4.0 25.0 216.0 
    	write(*,*) sin(v)
    
    end program
    					

funkce s poli

Zde následuje výčet funkcí, které fortran podporuje. Tento seznam nemusí být úplný a některé funkce používájí další volitelné argumenty. V případě, že budete potřebovat podrobnější informace, doporučuji se podívat do manuálu kompilátoru, který používáte. (V hranatých závorkách [] jsou vepoviné argumenty)

  • dot_product(A,B) - skalární součin
  • matmul(A,B) - násobení matic, kde A(m,n), B(n,k) a výsledek je (m,k)
  • transpose(A) - vrátí transponovanou matici
  • maxval(A) - maximální hodnota v poli
  • minval(A) - minimální hodnota v poli
  • maxloc(A) - index (poloha) maximální hodnoty v poli
  • minloc(A) - index (poloha) minimální hodnoty v poli
  • sum(A) - sečte všechny prvky pole
  • product(A) - vynásobí všechny prvky pole mezi sebou
  • size(A) - vrátí počet prvnků pole, pokud máme pole(n,m) výsledek bude n*m
  • shape(A) - vráti tvar pole, pokud máme pole(n,m) vrátí pole integerů o vekosti 2 s hodnotami n a m
  • reshape(A,shape) - změní tvar pole
  • Cshift(A, n) - posune prvky pole cyklic doleva o n prvků
  • Eoshift(A, n [, x]) - posune prvky pole doleva o n prvků na konci pole se doplňují hodnoty na 0 nebo x