2013-05-08 18 views
7

Ho trovato alcune domande correlate, ma non ho trovato una risposta.Metodo Matlab: troppi argomenti

Sto scrivendo una semplice piccola classe MATLAB per apprendere la sintassi OOP in MATLAB. Ho molta familiarità con Python e mi sto strappando i capelli cercando di lavorare con MATLAB. Ecco la definizione:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(obj,x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition(obj) 
      position = obj.position 
     end 

     function start(obj) 
      obj.running = true 
     end 

     function stop(obj) 
      obj.running = false 
     end 
    end 

end 

questo non è certo fatto, ma poi sto usando un piccolo script di pasticciare con l'oggetto:

foo = Car([1,1],[0,2]) 
foo.start 
foo.accelerate(2,3) 

la creazione di istanze funziona, ma qualsiasi metodo che io chiamo genera un errore . foo.start, ad esempio:

Error using Car/start 
Too many input arguments. 

Cosa mi manca ??

+0

vorrei chiarire che è sempre lo stesso errore "Troppi argomenti di input" per qualsiasi metodo che ho prova a chiamare su un oggetto. – mrKelley

+0

Quale versione di MATLAB? Il tuo codice funziona per me su R2011b. – Praetorian

+0

Interessante, R2013a – mrKelley

risposta

22

Poiché non riesco a capire come eliminare questa domanda, farò del mio meglio per rispondere. Come altri linguaggi, la programmazione orientata agli oggetti in MATLAB vuole vedere obj come il primo parametro nei metodi di classe (come self in python). Questo riferimento all'oggetto è necessario per modificarne gli attributi. Non stavo includendo questo nelle definizioni dei metodi, quindi quando ho chiamato il metodo stavo ottenendo l'errore "troppi argomenti". Questo perché se si esegue foo.method(a,b), l'oggetto foo viene effettivamente passato come parametro, quindi la funzione in realtà sta ricevendo 3 input, ad esempio method(foo,a,b).

Ho passato il mio codice e aggiunto obj nei luoghi appropriati, ma NON RIUSCITO A UTILIZZARE IL COMANDO clear nella finestra di comando MATLAB. Dato che sono nuovo di MATLAB, non ero a conoscenza della sua importanza. Ho solo pensato di salvare il file e riattivare la mia classe sarebbe stato sufficiente. Non è.

Spero che questo aiuti chiunque incontri questa domanda.

+5

+1 per aver pubblicato a beneficio di altri – hAcKnRoCk

0

Hai risposto alla tua domanda che è grandiosa. Ma sembra che la tua domanda includa proprio il codice che hai faticato ad eseguire all'inizio. Avrei pensato che il codice in principio sembrava:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition() 
      position = obj.position 
     end 

     function start() 
      obj.running = true 
     end 

     function stop() 
      obj.running = false 
     end 
    end 

end 

e, solo più tardi, è diventato quello che hai scritto nella tua domanda:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(obj,pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(obj,x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition(obj) 
      position = obj.position 
     end 

     function start(obj) 
      obj.running = true 
     end 

     function stop(obj) 
      obj.running = false 
     end 
    end 

end 

Nota che mi eseguire il codice nella tua domanda permette per accedere ed eseguire tutti i metodi dichiarati nella tua classe. Cercando di accedere ai metodi dichiarati nel primo blocco di codice si otterrebbe l'errore "troppi argomenti". Cercare di accedere ai metodi dichiarati nel secondo blocco funziona esattamente come previsto.

1

Non è necessario passare l'obj all'ingresso se si dichiara i metodi come statica:

classdef class1 
    methods (Static) 
     function y=aPLUSb(a,b) 
      y=a+b; 
     end 
    end 
end 
Problemi correlati