2013-09-04 17 views
10

Sto eseguendo il debug di un codice MATLAB e desidero assicurarmi che due riferimenti a un oggetto si riferiscano effettivamente allo stesso oggetto. C'è un modo per ottenere un identificatore univoco per gli oggetti (come un indirizzo di memoria)?È possibile ottenere un identificativo univoco per un oggetto MATLAB?

Per quanto ne so, non sono in grado di aggiungere i miei ID agli oggetti, poiché sono flussi di numeri casuali MATLAB.

+2

stai usando 'RandStream' di MATLAB? in tal caso è già una classe handle e eredita l'operatore di uguaglianza '==' ('eq'). La regola è quando si confrontano gli oggetti handle, usando l'operatore 'eq' per verificare se gli oggetti sono lo stesso handle. Usa 'isequal' per verificare se gli oggetti hanno valori di proprietà uguali, anche se questi oggetti sono maniglie differenti. Ignorando la semantica di riferimento, è possibile confrontare l'algoritmo, il seed e lo stato interno di due flussi di numeri casuali. – Amro

risposta

0

È possibile utilizzare il campo UserData, presente in ogni oggetto grafico, per memorizzare un'identità univoca generata dall'utente. Se lavori con una classe definita dall'utente, puoi aggiungere un campo simile nella tua classe.

Le identità possono essere mantenute univoche utilizzando un contatore globale per assegnare ogni nuova identità.

+1

'UserData' non è affatto presente in ogni oggetto. È presente in tutti gli oggetti Handle Graphics, ma non è quello che l'OP chiedeva. –

+0

@SamRoberts Grazie, ho appena realizzato e corretto la risposta –

5

Se si utilizza OOP, è possibile aggiungere una proprietà ID e impostarla durante la costruzione dell'oggetto.

java.rmi.server.UID() è un bel modo per ottenere di ID univoco

Tuttavia testando da == controllerà le maniglie reale, quindi questo è più di un problema di usabilità.

classdef yourClass < handle 

properties  
    ID 
end 

methods 
    function obj = yourClass() 
     obj.ID = java.rmi.server.UID(); 
    end 

end 

end 

Sarà quindi piuttosto semplice per controllare gli oggetti.

5

Se gli oggetti che si desidera confrontare sono flussi di numeri casuali MATLAB (vale a dire sono di classe RandStream), quindi sono oggetti di gestione. In questo caso non hai bisogno di ID univoci: se li paragoni usando eq o == e sono uguali, allora sono lo stesso oggetto.

Come dici tu, che non sono in grado di aggiungere i propri oggetti da un oggetto della classe RandStream, ma se si voleva davvero a voi potrebbe sottoclasse RandStream e aggiungere una proprietà del proprio alla sottoclasse. È possibile memorizzare un identificativo univoco nella proprietà, generato con char(java.util.UUID.randomUUID).

+0

Non riesco a confrontare facilmente i riferimenti perché vivono in diverse parti del codice. Sembra che sia necessario aggiungere codice per essere in grado di fare il confronto o devo sottoclasse RandStream. (Speravo in una soluzione più semplice/più rapida.) – jgosmann

+2

Direi che probabilmente c'è un modo più semplice di così. Ad esempio, è possibile eseguire il codice in modalità debug, fermandosi in ciascuno dei due punti in cui si hanno i due riferimenti che si desidera confrontare. Quindi salvali nell'area di lavoro di base con 'assignin ('base', ...)'. Quindi esci dal debugger e confrontali. –

Problemi correlati