Kapittel 5 Matriseoperasjoner Det viktigste dataelementet som MATLAB benytter, er matriser, som også gjerne betegnes arrays. I det etterfølgende vil begrepet vektor bli benyttet enkelte steder som betegnelse på en matrise som bare har 1 kolonne eller bare 1 linje. Vektor kan også betegnes én-dimensjonalt array. Spesielle funksjoner for matriser (arrays) listes opp med kommandoen help elmat. 5.1 Representasjon av data med matriser (arrays) Hvordan lage matriser Vi kan konstruere matriser ved å bruke blank (space) for å skille mellom elementene i en linje (eller mellom kolonnene) og semikolon for å skille mellom linjene. Et eksempel er A=[1 2;3 4] A = 1 2 3 4 53
54 LærMATLABtrinnfortrinn Alternativt kan vi skille elementene i en linje med komma: A=[1,2;3,4] som gir samme A som ovenfor. Linjer kan også skilles med return(-tasten) slik: A=[1 2 (return) 3 4] med samme resultat. Et matriseelement kan godt være et uttrykk (her: 2+4): C=[1 2;3 2+4] C = 1 2 3 6 En matrise i form av en linjevektor kan konstrueres slik: linvek=[2:4] linvek = 2 3 4 En matrise i form av en kolonnevektor kan konstrueres som den transponerte av en linjevektor (transponering utføres altså med fnutt ): kolvek=[2:4] kolvek = 2 3 4
Lær MATLAB trinn for trinn 55 Element-inkrementet kan være forskjellig fra 1: v1=[2:.5:4] v1 = 2.0000 2.5000 3.0000 3.5000 4.0000 Element-inkrementet kan være negativt: v2=[4:-1:2] v2 = 4 3 2 MATLAB-funksjonen linspace definerer en linjevektor med et gitt antall elementer med lik element-avstand: vlin=linspace(0,1,5) vlin = 0 0.2500 0.5000 0.7500 1.0000 MATLAB-funksjonen logspace definerer en linjevektor med et gitt antall elementer med lik logaritmisk element-avstand. La oss konstruere en vektor med 5 elementer fra og med 0 til og med 1: vlog=logspace(0,1,5) vlog = 1.0000 1.7783 3.1623 5.6234 10.0000 Vi kan konstruere en matrise ved hjelp av eksisterende matriser eller vektorer. La oss som eksempel lage en matrise K hvis kolonner er de to vektorene x hhv. y:
56 LærMATLABtrinnfortrinn x=[1,2,3] ; y=[4,5,6] ; K=[x,y] K = 1 4 2 5 3 6 Og så kan vi lage en matrise L som består av x i første rad og y i andre rad: L=[x;y] L = 1 2 3 4 5 6 Noen spesielle matriser En identitetsmatrise av orden 3 konstrueres med idmat=eye(3) idmat = 1 0 0 0 1 0 0 0 1 En 3x2 ener-matrise (bestående av bare 1-ere) konstrueres med enermat=ones(3,2) enermat =
Lær MATLAB trinn for trinn 57 1 1 1 1 1 1 En 2x3 null-matrise konstrueres med nullmat=zeros(2,3) nullmat = 0 0 0 0 0 0 En diagonalmatrise med elementene 1, 2 og 3 på diagonalen konstrueres med diagmat=diag([1,2,3]) diagmat = 1 0 0 0 2 0 0 0 3 Hererentom matrise: tom=[] tom = [] Merk at en tom matrise eksisterer som en hvilken som helst annen matrise, men den inneholder altså ingen elementer. Et eksempel på bruk av en tom matrise er for å fjerne deler av en matrise: P=[1 2;1 2],P(:,1)=[];P Her blir hele 1. kolonne i B fjernet.
58 LærMATLABtrinnfortrinn P = P = 1 2 1 2 2 2 Hva er dimensjonen? Dimensjonen for matrisen nullmat definert ovenfor finnes med [m,n]=size(nullmat) m = n = 2 3 En linje- eller kolonnevektors lengde kan finnes med length(vlin) ans = 5 Adressering av matriseelementer Vi kan adressere et matriseelement slik: w=a(1,2) w = 2 Vi kan gi et bestemt matriseelement verdi slik:
Lær MATLAB trinn for trinn 59 A(1,2)=7 A = 1 7 3 4 Som utgangspunkt for de etterfølgende oppgaver, skal vi konstruere følgende (3x3)-matrise: B=[10 20 30;40 50 60;70 80 90] B = 10 20 30 40 50 60 70 80 90 Vi kan adressere øvre høyre (2x2)-undermatrise slik: B1=B(1:2,2:3) B1 = 20 30 50 60 Vi kan adressere kolonne 2 i B slik: B2=B(:,2) B2 = 20 50 80 Alle elementene i en matrise kan ramses opp i en vektor slik:
60 LærMATLABtrinnfortrinn Balt=B(:) Balt = 10 40 70 20 50 80 30 60 90 Merk at i MATLAB benyttes 1 som laveste element-indeks i vektorer. Prøv Balt(0)??? Index into matrix is negative or zero. Mens Balt(1) gir ans = 10 5.2 Matriseberegninger Vi skal gjøre oss kjent med noen grunnleggende funksjoner for matriseberegninger eller -operasjoner. Aktuelle funksjoner listes opp med help elfun. Noen av disse funksjonene kan anvendes på matriser, men de fleste kan anvendes kun på skalare størrelser eller element-for-element i matriser (elementvise beregninger beskrives nedenfor). Addisjon, subtraksjon og multiplikasjon av matriser forgår på vanlig måte, men matrisene må selvsagt ha riktige (kompatible) dimensjoner, ellers gir
Lær MATLAB trinn for trinn 61 MATLAB feilmelding. La oss som utgangspunkt for de etterfølgende beregninger utføre clear, A=[1 2;3 4], B=[5 6;7 8] A = B = 1 2 3 4 5 6 7 8 A og B adderes slik: addmat=a+b addmat = 6 8 10 12 A og B multipliseres slik: multmat=a*b multmat = 19 22 43 50 Elementvise beregninger MATLAB kan utføre elementvise beregninger med matriser (og vektorer). Som utgangspunkt for de etterfølgende oppgaver definerer vi følgende to vektorer: x=[1,2,3], y=[4,5,6]
62 LærMATLABtrinnfortrinn x = y = 1 2 3 4 5 6 MATLAB utfører elementvise beregninger når et punktum er skrevet foran operatoren. Her er et eksempel på elementvis multiplikasjon: elmult=x.*y elmult = 4 10 18 svarende til at elmult(1)=x(1)*y(1), elmult(2)=x(2)*y(2), osv. Hvis vi prøver x*y (uten punktum foran *-operatoren) gir MATLAB feilmelding siden x og y ikke kan multipliseres med vanlig matrisemultiplikasjon. Her er et eksempel på elementvis divisjon: eldiv=x./y eldiv = 0.2500 0.4000 0.5000 svarende til at eldiv(1)=x(1)/y(1), eldiv(2)=x(2)/y(2), osv. Elementvise beregninger er svært nyttige dersom du skal utføre en matematisk operasjon på alle elementene i en vektor (eller generelt matrise). Her er et eksempel der det beregnes sinus av hvert element i vektoren x: sinvektor=sin(x)
Lær MATLAB trinn for trinn 63 sinvektor = 0.8415 0.9093 0.1411 svarende til sinvektor=[sin(x(1),sin(x(2)), sin(x(3)]. 5.3 Flerdimensjonale matriser (arrays) Flerdimensjonale matriser er en generalisering av 2-dimensjonale matriser eller arrays ved at dimensjonen kan være være vilkårlig stor. Figur 5.1 illustrerer et 3-dimensjonalt array. De tre dimensjonene utspennes slik: side (page) (1,1,3) (1,2,3) (2,1,3) (2,2,3) kolonne (column) (1,1,2) (1,2,2) (2,1,2) (2,2,2) rad (row) (1,1,1) (1,2,1) (2,1,1) (2,2,1) Figur 5.1: Illustrasjon av et 3-dimensjonalt array. Radene utgjør 1. dimensjon Kolonnene utgjør 2. dimensjon Sidene (eng. page) utgjør 3. dimensjon
64 LærMATLABtrinnfortrinn (For en mulig 4. dimensjon kunne vi kanskje snakke om bok.) La oss som eksempel lage et 2x2x2-array (3-dimensjonalt array): A3(:,:,1)=[111 121;211 221]; A3(:,:,2)=[112 122;212 222]; A3 A3(:,:,1) = 111 121 211 221 A3(:,:,2) = 112 122 212 222 Flerdimensjonale arrays benyttes i MATLAB til bl.a. å lagre frekvensresponsdata (3 dimensjoner: amplitude, fase, frekvens).