[Edellinen] [Seuraava] [Sisällys]

Matriisit

Matriisin muodostaminen, osat ja kokoaminen

Opiskele Yhteenvetokertaus esimerkkien valossa.

Jokainen ihminen aloittaa kokeilut näin (voit osoittaa omaperäisyytesi tekemällä muuta).

 >> A=[1 2 3;4 5 6;7 8 9]  
A =
     1     2     3
     4     5     6
     7     8     9
>> A(1,:)               % 1. rivi (sarakeindeksi saa kaikki arvonsa)
ans =
     1     2     3
>> A(:,1)               % 1. sarake (rivi-indeksi saa kaikki arvonsa)
ans =
     1
     4
     7
>> A(:)   % Kukin indeksi saa kaikki arvonsa (sarakejärjestyksessä).
          % (Matriisi jonoutetaan sarakkeittain pitkäksi vektoriksi.)
ans =
     1
     4
     7
     2
     5
     8
     3
     6
     9
>> reshape(ans,3,3)  % Muotoillaan takaisin 3x3-matriisiksi.
ans =                % (A ei muutu, tulos vain näytetään, kuten
                     %  edelläkin.)
     1     2     3
     4     5     6
     7     8     9

>> A(1:2,2:3)    % Osamatriisi.
ans =
     2     3
     5     6
>> 
>> B=[A [1;1;1]]            % Liitetään A:n perään sarake (tai useampi).
B =
     1     2     3     1
     4     5     6     1
     7     8     9     1

>> [m,n]=size(B)            % Kätevä tapa muodostaa "koko"-muuttujat.
m =
     3
n =
     4
>> C=[B;ones(1,n)]         % Liitetään alle, ykkösiä saa ones-funktiolla.
C =
     1     2     3     1
     4     5     6     1
     7     8     9     1
     1     1     1     1

Taulukointi

Usein esiintyvä tehtävä on funktion arvojen taulukointi annetuissa pisteissä. Homma hoituu tätä esimerkkiä mukaillen:
Halutaan muodostaa taulukko, jossa on tasavälisin astein laskettu cos- ja sin-funktion arvoja
>> asteet=(0:10:90)';       % Asteissa 10:n välein,
>>                          %  transponoimalla pystyyn.
>> rad=pi*asteet/180;       % Radiaaneiksi.
>> taulukko=[asteet rad cos(rad) sin(rad)]
taulukko =
         0         0    1.0000         0
   10.0000    0.1745    0.9848    0.1736
   20.0000    0.3491    0.9397    0.3420
   30.0000    0.5236    0.8660    0.5000
   40.0000    0.6981    0.7660    0.6428
   50.0000    0.8727    0.6428    0.7660
   60.0000    1.0472    0.5000    0.8660
   70.0000    1.2217    0.3420    0.9397
   80.0000    1.3963    0.1736    0.9848
   90.0000    1.5708    0.0000    1.0000
Tehtävä: Poimi yllä olevasta taulukosta 2. ja 3. sarake, ts, kulmat radiaaneissa ja vastaavat cos-arvot. Piirrä taulukkopisteet vaikka o-merkeillä ja suorita graafisesti lineaarinen interpolaatio taulukkopisteiden välillä eli piirrä taulukkopisteiden kautta murtoviiva samaan kuvaan. Laske taulukkopisteitä käyttäen cos:n arvojen likiarvot pisteissä, jotka ...

Matriisi- ja taulukko-operaatiot

Kts. taas yllä olevia viitteitä.

Esim.

>> A=ones(2,4)
A =
     1     1     1     1
     1     1     1     1
>> B=A'
B =
     1     1
     1     1
     1     1
     1     1
>> A*B             % Matriisitulo
ans =
     4     4
     4     4
>> B*A             % kuin myös.
ans =
     2     2     2     2
     2     2     2     2
     2     2     2     2
     2     2     2     2
>> A=reshape(1:9,3,3)'  % "Jokapojan/tytön matriisi" elegantimmin.
A =
     1     2     3
     4     5     6
     7     8     9
>> A*A                 % Neliömatriisi voidaan kertoa itsellään.
ans =
    30    36    42
    66    81    96
   102   126   150
>> A^2                % Sama asia.
ans =
    30    36    42
    66    81    96
   102   126   150
>> A.*A               % Pisteittäinen tulo (ei vaadi neliömatriisia).
ans =
     1     4     9
    16    25    36
    49    64    81
>> A.^2               % Ja sama.
ans =
     1     4     9
    16    25    36
    49    64    81
Tehtävä Muodosta jokin matriisi A, jonka alkiot > 0 (vaikkapa se jokapojantytön).
Muodosta matriisi L, joka koostuu A:n alkioiden logaritmeista (luonnollisista).
Muodosta A:n kokoinen matriisi E, jonka kaikki alkiota ovat = e (Neperin luku).
Korota E:n alkiot L:n alkioiden osoittamiin potensseihin ja totea, että käy, kuten pitää.

Matriisin muodostaminen diagonaaleittain

Monissa sovelluksissa syntyy "nauhamaisia" matriiseja, joiden muodostaminen on luontevinta diagonaaleittain. Esimerkiksi 1-ulotteisen Laplacen operaattorin diskretoinnissa (4 osaan) syntyy matriisi:
>> A=[2 -1 0 0; -1 2 -1 0;0 -1 2 -1;0 0 -1 2]

A =
     2    -1     0     0
    -1     2    -1     0
     0    -1     2    -1
     0     0    -1     2
Vähänkin isomman matriisin (tiheämmän diskretoinnin) tapauksessa riveittäin muodostaminen on vaivalloista. Funktio diag tarjoaa hyvän keinon.
>> N=4
>> osa1=2*eye(N,N)     % eye muodostaa yksikkömatriisin.

osa1 =

     2     0     0     0
     0     2     0     0
     0     0     2     0
     0     0     0     2

>> osa2=diag(-ones(1,N-1),1)  % päälävistäjän yläpuolinen lävistäjä
osa2 =

     0    -1     0     0
     0     0    -1     0
     0     0     0    -1
     0     0     0     0

>> osa3=diag(-ones(1,N-1),-1) % päälävistäjän alapuolinen lävistäjä

osa3 =

     0     0     0     0
    -1     0     0     0
     0    -1     0     0
     0     0    -1     0

>> A=osa1+osa2+osa3

A =

     2    -1     0     0
    -1     2    -1     0
     0    -1     2    -1
     0     0    -1     2

>> diag(A)  % Lopuksi näytetään, että diag toimii myös toiseen suuntaan:
            % poimii matrisiisin päälävistäjän.
ans =

     2
     2
     2
     2

Harvat matriisit, sparse matrices

Oikeissa isoissa tehtävissä, joissa suurin osa matriisin alkioista on nollia, hyödynnetään matriisin "harvuutta", "sparsity". Kts. help sparse, doc sparse, sparse, spdiags, ... Matlab-funktio





[Edellinen] [Seuraava] [Alkusivu]