2009 m. rugsėjo 7 d., pirmadienis

MatLAB pastebėjimai

Sveiki. Vasara prabėgo, aš neparašiau apie savo išvyką į Klodzką, neparašiau ir apie drugelių, strėliukių, skruzdžių fotosesiją, neparašiau ir apie kokių dviejų trijų savaičių laikotarpį su kasdieniniu degustavimu. Atėjo ruduo, aš ir atėjau į univerą. Vėl grįžau prie savo skaičiavimų tematikos. C++ per vasaą programuoti neišmokau, tad tiesiog pradėjau ieškoti būdų kaip paspartinti savos programos veiksmingumą MatLAB aplinkoje.
Koks antras žingsnis būna, kai išsiklausinėji draugų patarimų? Ir neįgyvendini jų pasiūlymo perrašyti pragramą į C++ kalbą? Paklausi google.
Paklausiau, jis atsakė: vektorizuok savo visą programą, naikink ciklus, nes jie programos mirtis. Na, pakraipiau galvą, galvoju, jei pakeisiu ir pora kartų pagreitės programa, bus puiku.
Praeitas ketvirtadienis ir buvo didžioji mano apšvitimo diena, optimizavau programą ir savo akimis nepatikėjau, ji skaičiavimus dabar atlieka 50 KARTŲ SPARČIAU. Tai, ką anksčiau suskaičiuodavau per 5 valandas, dabar galiu suskaičiuoti per 6 minutes.
Taigi, žmonės, jei naudojate MatLAB, kaip įmanoma mažiau naudokite ciklų, jų dažnai galima išvengti veiksmus užrašant skaičių eilutėmis ir matricomis.
O šiuo metu toliau tobulinu programą, darau ją universalesnę, user-friendlesnę ir apskritai, šiuo metu mano moralė išaugo. Tuo ir džiaugiuosi, nes nežinau kuriuo artimiausiu metu ji kris žemyn.

3 komentarai:

Martynas rašė...

Lauksiu kito suolio i prieki :)

P.S. 50 tau jau daug...

id rašė...

Skamba įdomiai, apie ką programa?
Beje, gal turi nuorodų su pvz, kaip ten iš ciklų į matricas?

Justinas rašė...

Programa modeliuoja tokį atvejį: Šauni lazerio pluoštu į netiesinį kristalą ir skaičiuoja išėjime visomis kryptimis sklindančias naujo dažnio bangas. Ir skaičiuoju aš erdvinį išėjime esančių bangų pasiskirstymą.
O vektorizavimo vienas paprastesnių pavyzdžių: šitą ciklą
for k=1:100
y(k) = sin(x(k));
end
galima pakeisti paprasčiausiu sakiniu:
y(:) = sin(x(:));
Gana elementaru - for ciklai dažniausiai skirti indeksavimui, bet tą patį galima užrašyti paprasčiau, be ciklo. Tokiu būdu mano programoje vietoj šešių liko keturi vidiniai ciklai.