Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 08. 09. 2011 18:36 — Editoval FliegenderZirkus (08. 09. 2011 18:40)

FliegenderZirkus
Příspěvky: 544
Škola: RWTH Aachen
Reputace:   25 
 

Rychlost výpočtů v Matlabu

Ahoj,
potřeboval bych v Matlabu pracovat s matematickými funkcemi, které se v programu vícekrát opakují. Zkoušel jsem je uchovat jako string:

Code:

f1='x^2+3*y';
x=2;
y=3;
vysledek=eval(f1);

jenže se neúnosně zpomalí výpočet, myšleno oproti

Code:

x=2;
y=3;
vysledek=x^2+3*y;

To zpomalení je řádově desetinásobné, což je pro mě nepoužitelné. Ještě o něco pomalejší je práce se symbolickými proměnnými:

Code:

syms xs ys;
x=2;
y=3;
f1=xs^2+3*ys;
vysledek=subs(f1,{xs,ys},{x,y})

Víte někdo o způsobu, jak se vyhnout ručnímu přepisování všech matematických funkcí použitých v kódu? Mohl bych ke každé matematické funkci vytvořit odpovídající programátorskou funkci, ale to je (alespoň v Matlabu) dost nepohodlné, protože by každá potřebovala vlastní .m soubor. Předem díky:)

EDIT: Jenom pro upřesnění, i když je to asi jasné - chtěl bych na začátku kódu definovat nějakou mat. funkci (popř. ji načíst od uživatele) a dále ji používat bez úprav dalších částí kódu.

Offline

 

#2 18. 09. 2011 17:20

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Rychlost výpočtů v Matlabu

↑ FliegenderZirkus:

ja by som to riesil cez m-subor. ta nepohodlnost je skor subjektivna. proste funkcie sa robia v matlabe ako m-subory.
este mas moznost vytvorit si anonymnu funkciu. na tu nepotrebujes m-subor.

nazyva sa sice "anonymna" hoci je jasne, ze musi mat vlastne meno.

napr:

Code:

my_func = @(x, y) x.^2 - y.^2;

volanie funkcie

Code:

my_func(x, y)

Offline

 

#3 18. 09. 2011 19:30

FliegenderZirkus
Příspěvky: 544
Škola: RWTH Aachen
Reputace:   25 
 

Re: Rychlost výpočtů v Matlabu

↑ etchie:

To se mi líbí, dík za tip.

Zkusím ještě doplnit kontext: na začátku mám dvě funkce dvou proměnných f1(x,y) a f2(x,y) a v kódu pracuji s těmito funkcemi a s maticí jejich parciálních derivací (Jakobiánem). V tuto chvíli mám všech šest funkcí (f1,f2 a čtyři parcální derivace) uložené v jednotlivých .m souborech, které musím vždy při změně vstupu ručně editovat. Pokud bych ale ty funkce měl uložené symbolicky, tak ten Jakobián Matlab spočítá sám. Na vstupu jsou pak potřeba jen ony dvě funkce místo nynějších šesti. Problém je ale, jak už jsem napsal, v rychlosti.
Ideální by tedy bylo načíst funkce f1, f2 symbolicky, nechat Matlab spočítat Jakobián a pak je nějak převést do „běžných“ výrazů, se kterými by pak kód běžel rychle. Jde to? :)

Ten tvůj tip mi ušetří editování různých souborů, což je to, na co jsem se původně ptal, takže díky. Teď mi ale navíc přijde zbytečné pokaždé ručně počítat derivace, když to Matlab umí. V případě zájmu posílám odkaz na konkrétní kód.

Offline

 

#4 18. 09. 2011 23:07 — Editoval etchie (18. 09. 2011 23:22)

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Rychlost výpočtů v Matlabu

↑ FliegenderZirkus:

nie som expert na matlab, ale mam pocit, ze iny sposob ako docielit to co chces, asi nebude

matlabu (pri vyhodnocovani dynamickeho kodu, ktory je zapisany v retazci), by mohlo pomoct zapisat ten tvoj riadok kodu takto:

Code:

f1='x^2+3*y;';

je tam o jednu bodkociarku naviac,
ked to matlab vyhodnoti, tak bez tej podkociarky bude vysledok posielat aj na obrazovku
a ty to chces asi skor IBA do premennej 'vysledok'
ukoncenie podkociarkou by malo dost pomoct lebo sa nezapoji narocny graficky subsystem pri kazdom volani eval(f1);

tiez by som mozno skusil nieco v zmysle:

Code:

dyn_code='vysledok = x^2 + 3*y;';
eval(dyn_code);
vysledok

v retazci si mozes vyskladat aky len chces kod - akurat musi byt syntakticky spravny
myslim si, ze celkovo je mozne lubovolne kombinovat staticky kod s dynamickym

Offline

 

#5 19. 09. 2011 23:13

etchie
Příspěvky: 159
Pozice: študent
Reputace:   
 

Re: Rychlost výpočtů v Matlabu

este ma napadlo, ze v matlabe je velky vykonnostny rozdiel podla sposobu zapisu vypoctov do kodu.
cely matlab je optimalizovany pre vektory a matice. nasledovny priklad ukazuje rozne zapisane vypocty. vysledkom su diametralne odlisne casy.

Code:

clc; clear;
max=100000;
x=linspace(1,50*pi,max);
y=1:1:max;
yy=1:1:max;

% vektor
tic;
y=x.^4+x.*pi+10;
toc

% cyklus
tic;
for i=1:max
yy(i)=x(i)^4+x(i)*pi+10;
end
toc

casy vektor vs. cyklus vyzeraju takto:

Elapsed time is 0.009714 seconds.
Elapsed time is 2.266 seconds.

z coho je jasne, ze co sa da zapisat ako vektor, tak treba urobit ako vektor (pripadne maticu) a cykly pouzivat iba tam, kde je to nevyhnutne

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson