Анонимді-функционалдық тарылулармен матлау кодының жұмысын жақсарту

Менде matlab 2011a-дағы анонимді функцияларымен күрделі өнімділікке қатысты проблемалар туындайды, онда анонимді контейнер функциясы арқылы енгізілген үстеме ақысыз функцияның өзі қабылдайтын уақыттан көп.

Пайдаланушылар анонимді контейнерлерден бас тарта отырып, өнімділікті арттыра алатынымды көрсетіп, басқалардың тәжірибесі бар екенін түсіндіріп, бірнеше сұрақ тудырды. Өкінішке орай, менің кодым көптеген нәрселерді бұзбай қалай жасауға болатынын білмеймін.

Мәселен, анонимді функцияларды толықтай орындамай-ақ жақсартуға болатын шешімдер бар ма, әлде менің кодты күлдірместен және уақытты рефакторингке жұмсамай, оларды жойып жіберуге мүмкіндік беретін дизайн үлгілері бар ма?

Мүмкіндік беретін кейбір мәліметтер:

Төменде сынып сипаты ретінде сақталатын анонимді функциялардың жиынтығы. Коммутатор арқылы қолданылатын int массивін қолданып, жиі алмастыруға болады, бірақ GP-лердің мазмұны өзгеруі мүмкін - сол жерде қолданылуы мүмкін тректер сияқты дәлел құрылымы бар басқа функциялар бар. Дәрігерлердің мазмұны кейбір жағдайларда іске қосу уақытында анықталуы мүмкін.

m3.GPs = {@(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[1  0]');
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,1,params,[-1 1]');
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,2,params,0);
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,3,params,0);
       @(X,ytrain,xStar,noisevar,params)traingp(X,ytrain,xStar,noisevar,4,params,[0 0 0]')};

Кейінірек дәрігерлердің элементтері сыныптың мүше функциясы арқылы шақырылады, мысалы:

GPt = GPs{t(j)}(xj,yj,gridX(xi),thetaT(1),thetaT(2:end));

Профессордың айтуынша, анонимді қаптаманың өзіндік уақыты жалпы уақыттың 95% -ын (44 қоңырау үшін 1,7 секунд) алады, бұл функция үшін 5% -ды құрайды. Мен ұқсас көзқарасты басқа жерде пайдаланамын, онда анонимді қаптаманың бағасы одан да көп, пропорционалды түрде сөйлейді.

Анонимді қоңыраулардың құнын төмендету туралы қандай да бір ойлар бар ма, әлде жоқ, олар ұсынған икемділікті сақтай отырып, анонимді функцияны қалай ауыстыруға болады (және қосымша бухгалтерлік есеп пен аргументті жібермейсіз)?

Рахмет!

6
@ChrisLucas: Сіз өзіңізді сынап көретін ең төменгі жұмыс үлгісін ұсына аласыз ба?
қосылды автор Amro, көзі
неге бүтін және массив парамилерге қосылмайды? Менің ойымша, бұл мәселені функция массивінен индексті массивке параметр ретінде пайдалану арқылы пайдаланудан аулақ бола отырып, көп жеңілдетуге болады деп ойлаймын.
қосылды автор stardt, көзі
@ChrisLucas Мен функцияның дәлел құрылымын өзгерту әдісін жарияладым, бірақ бұл сіздің сұрағыңызға шынымен жауап бермейді.
қосылды автор stardt, көзі
@stardt: өкінішке орай, сол дәлел құрылымымен басқа, әлі белгісіз функциялар берілген функцияларды алмастыра алатын жағдайларға қорытындылау мүмкіндігін сақтап қалғым келеді. Егер функция жиынын жою кезінде мұны істеу тәсілі болса, мен оны сынап көргім келеді.
қосылды автор Chris, көзі
@amro: Мен конференциядан оралғаннан кейін көп кешікпей істеуге тырысамын. Байланысты кодты шығару оңай емес, бірақ ол құнды болар еді.
қосылды автор Chris, көзі

2 жауаптар

Мүмкін, «зауыт» функциясы көмектеседі:

>> factory = @(a,b,c) @(x,y,z) a*x+b*y+c*z;
>> f1 = factory(1,2,3);
>> f2 = factory(0,1,2);
>> f1(1,2,3)
ans =
    14
>> f1(4,5,6)
ans =
    32
>> f2(1,2,3)
ans =
     8
>> f2(4,5,6)
ans =
    17

Мұнда factory - бұл жаңа функцияны аргументтермен қайтаратын функция. Басқа мысал:

 factory = @(a,b,c) @(x,y,z) some_function(x,y,z,a,b,c)

x, y, z функциясын қайтаратын a, b, c функциясы көрсетілген.

1
қосылды

Мұның бәрі өнімділікті жақсарту үшін қаншалықты ауырсынуға болатындығына байланысты. Анонимді функциялардан аулақ тұрған бір ойын. Сізге қалай бейімделетінін білмеймін. Сіз бұл «кішкене» функцияларды сынып файлдарының соңына қоямын деп санаймын (мен оларды қалыпты функционалдық файлдардың соңына қоя аласыз деп білемін).

function [output] = GP1(x,ytrain,xstar,noisevar,params)
   output = traingp(X,ytrain,xStar,noisevar,1,params,[1  0]);
end
...

m3.GPS = {@GP1, @GP2, ...}; 
1
қосылды