Ohjeita Matlabin käyttöön - CSC
Ohjeita Matlabin käyttöön - CSC
Ohjeita Matlabin käyttöön - CSC
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-