Klases un objekti matlab: ātri un netīrās veids

link: http://www.cs.ubc.ca/~murphyk/Software/matlabObjects.html

Kevin Murphy, 19. Novembris 2005

Es atradu ļoti viegli veids, kā īstenot klases matlab, kas padara viņus rīkoties tāpat kā structs, bet ar pareizu nosaukumu, funkciju pārslodzes. Es īsi paskaidrotu zemāk. Lai iegūtu plašāku informāciju, sk. mathworks oficiālajiem dokumentiem uz objektu/klašu.
Skatīt arī daži ieteikumi, kā no CUED . Daži piemēri, programmatūras sistēmām, kas izmanto klases/ objekti, skat. BNT (Bayes neto kopums)(Bayes net toolbox) vai Spider (toolbox iid klasifikācijas un regresijas problēmas).

Kāpēc apgrūtināt ar objektu/ nodarbības?

Pastāv vairākas priekšrocības, izmantojot matlab klasēm.

Vairākas versijas par to pašu funkciju

Ar klasēm jūs varat ieviest 2 un vairāk vienas funkcijas vienā versijā un piešķirt tiem tādu pašu nosaukumu, un ļaujiet Matlab izlemt, kuru versiju izmantot. (To dēvē par dinamisko nosūtīšanu.) Parasti, ja jums ir 2 funkcijas ar tādu pašu nosaukumu, gan jūsu ceļš, ir redzams tikai viens (to sauc par nosaukumu un kosmosa piesārņojumu). Bet, ja izmantojat nodarbības, jums var būt privātas nosaukuma vietas. Pieņemsim, ka jums ir divas klases, vienu no kurām sauc par “manekenu” un otru “dummy2”. Abi īsteno funkciju ar nosaukumu “gradients”. Tad sekojošā secība zvana manekenu / gradient.m

d = manekens (...)% konstruē objekta 
gradientu (d, ...)

turpretī sekojošā secība izsauks dummy2 / gradient.m

d = dummy2 (...)% būvēt objekta 
gradientu (d, ...)

Iekšējā stāvokļa iekapsulēšana

Bieži vien mēs gribam nodot tādu funkciju kā “gradients” uz citu funkciju, piemēram, “minimizēt”, bet “gradients” prasa daudz papildu argumentus. Tās var tikt nodotas, lai mazinātu, izmantojot varargin (tāpat kā optimizācijas rīkjoslā), bet tīrāka metode ir izveidot objektu, piemēram, vienu no tipa manekenam, kurā ir visi dati, kas tam nepieciešami. Tad vienkārši izlaist manekenu, lai “samazinātu”, un, kad tas sauc par “gradientu”, gradienta funkcijai būs pieeja manekena objekta iekšējai stāvoklim. (Piezīme: Matlab 7, visbeidzot, ir iespējams veikt funkcijas ar leksisko apgabalu , tādējādi nedaudz samazinot šo īpašo iemeslu, lai izmantotu objektus.)

Kā uzrakstīt savu klasi

Pieņemsim, ka jūsu klase tiek saukta par “manekenu”. Jūs varat lejupielādēt minimālu failu kopu, lai īstenotu jebkuru klasi, piemēram, šeit . Mēs tos paskaidrosim tālāk.

  • Jums ir jāizveido @dummy direktorija. Visām metodēm jābūt .m failiem šajā direktorijā. Jūs varat paslēpt apakšfunkcijas privātajā apakšdirektorijā.
  • Jums ir jādefinē konstruktora funkcija dummy.m. Mēs to izskaidrosim tālāk. Ievadiet skaidras klases (nevis restartējot Matlab), ja maināt klases konstruktora definīciju.
  • Ieteicams definēt display.m funkciju. Šī versija tikai izdrukās objektu tā, it kā tas būtu nosaukts struct.
    funkcija display (obj) 
    disp (sprintf ('% s objekts', class (obj))) 
    disp (struct (obj))
    
  • Ieteicams definēt subsref.m . Turpmāk ļaus jums piekļūt objekta laukiem tā, it kā tas būtu struktūru (ti, visi lauki ir publiski pieejami).
    funkcija B = apakšref (A, S) 
    B = builtin ("subsref", A, S);
    
  • Ieteicams definēt subsasgn.m . Turpmāk ļaus mainīt objekta laukus tā, it kā tas būtu struktūru (ti, visi lauki ir publiski).
    funkcija B = subsasgn (A, S, B) 
    B = builtin ("subsasgn", A, S, B);
    
  • Ieteicams veikt demo.m vai test.m funkciju. Ar šo nosaukumu parasti ir tonnas failu. Bet, ja jūs to padarāt par metodi, jūs varat būt pārliecināti, ka jūs piezvanīsit pareizajam, kā norādīts turpmāk
    demo (manekens)
    

    Šis krats ir klases manekena objekts ar noklusējuma argumentiem; tas būtībā ir tukšs struktūras elements ar tagu “manekens”. Tad Matlab zina, ka tai vajadzētu piezvanīt manekenu / demo.m. Demo funkcija var darīt visu, ko tā vēlas; parasti tas ignorēs tā argumentus un izveidos jaunu objektu ar saprātīgiem parametriem.

Konstruktors

Konstruktors ir jāseko zemāk esošajam kontūram. Īsinājumtaustiņu lietošana šeit radīs problēmas (piemēram, jūs nevarēsiet saglabāt / ielādēt savus objektus – es kļūdījos BNT).

funk obj = manekens (varargin) 

% Iegulto klases objekta konstruktors. 
% Jums vienmēr ir jāpārsūta viens arguments, ja vēlaties izveidot jaunu objektu. 

ja nargin == 0% Lieto, kad objekti tiek ielādēti no diska 
  obj = init_fields; 
  obj = klases (obj, "dummy"); 
  atgriešanās; 
beigt 
firstArg = varargin {1}; 
ja ISA (firstArg, 'manekens')%, kas tiek izmantots, kad objekti tiek nodoti kā 
  arg obj = firstArg; 
  atgriešanās; 
beigas 

% Mēs vienmēr jākonstruē lauki tādā pašā secībā, 
% vai objekts ir jauns vai ielādēts no diska. 
Tādēļ mēs to saucam init_fields. 
obj = init_fields; 

Pievienojiet klases nosaukuma tagu, lai mēs varētu izsaukt dalībnieku funkcijas
% veikt jebkuru sākotnējo iestatīšanu 
obj = class (obj, "dummy"); 

% Tagad reālā inicializācija sākas 
obj.field1 = rand (2,3); 
obj.field2 = varargin {1}; 


%%%%%%%%% 

funkcija obj = init_fields () 
% Inicializēt visus laukus, lai dummy vērtības 
obj.field1 = []; 
obj.field2 = [];

Izmantošanas piemērs

>> d = lelles (55) 
manekena objekta 
    lauks1: [2x3 dubultā] 
    lauks2: 55 
>> demo (manekens) 
tas ir foršs demo 
>> d.field1 = 22 
dummy object 
    field1: 22 
    field2: 55 
>> d.field2 
ans = 
    55