27.04.2013 Views

Ohjeita Matlabin käyttöön - CSC

Ohjeita Matlabin käyttöön - CSC

Ohjeita Matlabin käyttöön - CSC

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Alkioiden valinta<br />

K: Haluaisin löytää vektorista x ensimmäisen alkion,<br />

jonka arvo on suurempi kuin edeltävän alkion.<br />

V: Funktio diff laskee peräkkäisten alkioiden erotukset:<br />

>> x = [7 6 5 6 7 4 5 3];<br />

>> diff(x)<br />

ans =<br />

-1 -1 1 1 -3 1 -2<br />

Funktio find palauttaa loogista ehtoa vastaavat vektorin<br />

alkion indeksit. Ratkaisun voi koodata vaikkapa<br />

seuraavasti:<br />

>> ind = min(find(diff(x) > 0)) + 1<br />

ind =<br />

4<br />

Tässä esimerkissä neljäs alkio oli edeltäjäänsä suurempi.<br />

K: Haluaisin löytää arvoja nolla ja yksi sisältävästä<br />

vektorista maksimimäärän peräkkäisiä ykkösiä.<br />

V: Seuraavassa eräs ratkaisu:<br />

>> x = [1 1 1 1 0 1 1 0 1 1 1];<br />

>> ind = find([0 x 0] ~= 1);<br />

>> maxnr = max(diff(ind)) - 1<br />

maxnr =<br />

4<br />

Tässä haettiin vertailuoperaattorin ~= avulla paikat,<br />

joissa vektori arvo ei ollut yksi. Lisäksi täytyy käsitellä<br />

vektorin alku ja loppu, jonka vuoksi lisättiin<br />

nolla vektorin kumpaankin päähän. Funktion<br />

diff avulla lasketiin nollien välimatkat, jonka jälkeen<br />

vastaukseksi otetaan maksimiarvo välimatkoista.<br />

Seuraavassa toinen esimerkki ja yhteen lauseeseen<br />

lyhennetty ratkaisu:<br />

>> x = [1 0 1 0 0 0 1 1 0 1];<br />

>> max(diff(find([0 x 0] ~= 1))) - 1<br />

ans =<br />

2<br />

Silmukoiden vektorointi<br />

K: Haluaisin nopeuttaa ehtolauseen sisältävän silmukan<br />

toimintaa. Seuraavassa x ja x2 ovat vektoreita.<br />

for ind=1:length(x),<br />

if (x(ind)>pi)<br />

x2(ind)=x(ind);<br />

else<br />

x2(ind)=(2*pi)-x(ind);<br />

end<br />

end<br />

V: Silmukoiden kirjoittamisen voi usein välttää ko-<br />

<strong>Ohjeita</strong> <strong>Matlabin</strong> <strong>käyttöön</strong><br />

46<br />

mentoa find käyttämällä:<br />

ind = 1:length(x);<br />

x2(ind) = x(ind);<br />

idx = find(x(ind) > m = 4*diag(ones(n,1)) ...<br />

- diag(ones(n-1,1),1) ...<br />

- diag(ones(n-1,1),-1)<br />

m =<br />

4-1 0 0<br />

-1 4-1 0<br />

0 -1 4 -1<br />

0 0 -1 4<br />

Harvat diagonaalimatriisit<br />

K: Lasken N × N-matriisin J, jolla on nollasta<br />

eroavia alkioita vain päädiagonaalilla ja määrätyillä<br />

M − 1 sivudiagonaaleilla. Haluaisin laskea vain<br />

nämä alkiot ja tallettaa J:n harvana matriisina.<br />

V: Laske pää- ja sivudiagonaalit N × M-apumatriisin<br />

B pystyriveihin siten, että B:n rivi-indeksi vastaa<br />

matriisin J sarakeindeksiä. Muunna B komennolla<br />

spdiags harvamatriisiksi J. Olkoon esimerkkinä<br />

edellinen yksinkertainen tridiagonaalimatriisi:<br />

>> N = 4;<br />

>> B = zeros(N,3);<br />

>> B(1:N-1,1) = -ones(N-1,1);<br />

>> B(1:N,2) = 4*ones(N,1);<br />

>> B(2:N,3) = -ones(N-1,1);<br />

>> J = spdiags(B,-1:1,N,N);<br />

Funktion spdiags toisena argumenttina oleva vektori<br />

siis kertoo diagonaalien etäisyydet päädiagonaa-

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!