Трябва да дефинирам променлива в matlab, като използвам много дълъг низ, нека го наречем S. S съдържа резултата от символно изчисление и искам да използвам този резултат в моя код на matlab. S е твърде дълго, за да се копира директно в кода, така че вместо това го чета от файл. Мога да оценя израза в S с помощта на eval и той работи добре, но е наистина бавен (отнема около 15 секунди). Трябва да получа стойността на S за различни стойности на променливите в него 1000 пъти, така че имам нужда от по-бърз начин да направя това. Всякакви идеи биха били чудесни.
Matlab алтернатива на eval за голям низ
comment
За подобрена производителност можете да внедрите eval като функция MEX. Също така, погледнете това: mathworks.se/help/matlab/ matlab_prog/string-evaluation.html
- person PurpleAlien   schedule 02.05.2013
comment
Да, видях тази страница, когато се опитвах да разбера това, но не мисля, че някой от тези случаи се отнася за това, което се опитвам да направя. Бихте ли обяснили какво представлява функцията MEX? Благодаря.
- person user1504686   schedule 03.05.2013
comment
Функциите MEX са имплементации на естествен код на функция като eval() в C/C++ или Fortran и по този начин могат да бъдат силно оптимизирани. Вашият основен проблем е, че eval() е наистина бавен, така че трябва да намерите начин да напишете оптимизирана версия за вашите конкретни нужди и след това да използвате тази от Matlab.
- person PurpleAlien   schedule 03.05.2013
Отговори (1)
В зависимост от основната ви цел можете да направите няколко неща.
- конвертирайте израза в скрипт и го извикайте от вашата функция (подобряването на скоростта ще зависи от израза)
- ако изразът е относително гладка функция без особени точки, тогава можете да го изчислите предварително за няколко стойности на входните параметри. След това интерполирате тази таблица за останалите точки. Все пак трябва да е по-бързо от 15 секунди.
- можете да комбинирате и двата начина с превключване чернова/крайно във вашия код, като използвате интерполация за чернови изчисления и точен код за „окончателно“ изпълнение (евентуално за една нощ ;o)
person
anandr
schedule
01.05.2013