Matlab алтернатива на eval за голям низ

Трябва да дефинирам променлива в matlab, като използвам много дълъг низ, нека го наречем S. S съдържа резултата от символно изчисление и искам да използвам този резултат в моя код на matlab. S е твърде дълго, за да се копира директно в кода, така че вместо това го чета от файл. Мога да оценя израза в S с помощта на eval и той работи добре, но е наистина бавен (отнема около 15 секунди). Трябва да получа стойността на S за различни стойности на променливите в него 1000 пъти, така че имам нужда от по-бърз начин да направя това. Всякакви идеи биха били чудесни.


person user1504686    schedule 01.05.2013    source източник
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