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činmatmul(A,B)
- násobení matic, kde A(m,n), B(n,k) a výsledek je (m,k)transpose(A)
- vrátí transponovanou maticimaxval(A)
- maximální hodnota v poliminval(A)
- minimální hodnota v polimaxloc(A)
- index (poloha) maximální hodnoty v poliminloc(A)
- index (poloha) minimální hodnoty v polisum(A)
- sečte všechny prvky poleproduct(A)
- vynásobí všechny prvky pole mezi sebousize(A)
- vrátí počet prvnků pole, pokud máme pole(n,m) výsledek bude n*mshape(A)
- vráti tvar pole, pokud máme pole(n,m) vrátí pole integerů o vekosti 2 s hodnotami n a mreshape(A,shape)
- změní tvar poleCshift(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