2013-09-04 9 views
10

Ich debugge etwas MATLAB-Code und möchte sicherstellen, dass zwei Verweise auf ein Objekt sich tatsächlich auf dasselbe Objekt beziehen. Gibt es eine Möglichkeit, eine eindeutige Kennung für die Objekte (z. B. eine Speicheradresse) zu erhalten?Können Sie eine eindeutige ID für ein MATLAB-Objekt erhalten?

Soweit ich weiß, kann ich meinen Objekten keine eigenen IDs hinzufügen, da es sich um MATLAB-Zufallszahlenströme handelt.

+2

verwenden Sie MATLABs "RandStream"? Wenn ja, ist es bereits eine Handle-Klasse und erbt den Gleichheitsoperator '==' ('eq'). Die Regel besteht darin, beim Vergleichen von Handle-Objekten mit dem Operator "eq" zu testen, ob Objekte dasselbe Handle sind. Verwenden Sie 'isequal', um zu testen, ob Objekte gleiche Eigenschaftswerte haben, selbst wenn diese Objekte unterschiedliche Handles sind. Durch das Ignorieren der Referenzsemantik können Sie den Algorithmus, den Startwert und den internen Status von zwei Zufallszahlenströmen vergleichen. – Amro

Antwort

0

Mit dem Feld UserData, das in jedem grafischen Objekt vorhanden ist, können Sie eine von Ihnen generierte eindeutige Identität speichern. Wenn Sie mit einer benutzerdefinierten Klasse arbeiten, können Sie ein ähnliches Feld in Ihrer Klasse hinzufügen.

Die Identitäten können eindeutig gehalten werden, indem ein globaler Zähler verwendet wird, um jede neue Identität zuzuweisen.

+1

'UserData' ist nicht in jedem Objekt vorhanden. Es ist in allen Handle Graphics-Objekten vorhanden, aber darum hat das OP nicht gebeten. –

+0

@SamRoberts Danke, ich erkannte und korrigierte die Antwort –

5

Wenn Sie OOP verwenden, können Sie eine Eigenschaft ID hinzufügen und während der Konstruktion des Objekts festlegen.

java.rmi.server.UID() ist eine schöne Art und Weise einzigartig durch

jedoch die Prüfung der ID zu erhalten == werden die tatsächlichen Griffe überprüfen, so ist dies eher ein Usability-Problem.

classdef yourClass < handle 

properties  
    ID 
end 

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

end 

end 

Es wird dann ziemlich einfach sein, Ihre Objekte zu überprüfen.

5

Wenn die Objekte, die Sie vergleichen möchten, MATLAB-Zufallszahlenströme sind (d. H. Sie sind der Klasse RandStream), dann handelt es sich um Handle-Objekte. In diesem Fall benötigen Sie keine eindeutigen IDs: Wenn Sie sie mit eq oder == vergleichen und sie gleich sind, dann sind sie das gleiche Objekt.

Wie Sie sagen, Sie sind nicht in der Lage, ein Objekt der Klasse RandStream Ihre eigenen Eigenschaften hinzuzufügen, aber wenn Sie wirklich wollten, könnten Sie RandStream Unterklasse und fügen Sie eine eigene Eigenschaft der Unterklasse hinzu. Sie könnten eine eindeutige ID in der Eigenschaft speichern, die mit char(java.util.UUID.randomUUID) generiert wurde.

+0

Ich kann nicht einfach die Referenzen vergleichen, weil sie in verschiedenen Teilen des Codes leben. Es scheint, als ob ich entweder Code hinzufügen muss, um den Vergleich durchführen zu können, oder ich muss RandStream ableiten. (Ich hatte auf eine einfachere/schnellere Lösung gehofft.) – jgosmann

+2

Ich denke, es gibt wahrscheinlich einen einfacheren Weg. Beispielsweise können Sie den Code im Debugmodus ausführen und an jedem der zwei Punkte anhalten, an denen Sie die beiden Referenzen haben, die Sie vergleichen möchten. Dann speichern Sie sie mit 'assignin ('base', ...)' in den Basis-Arbeitsbereich. Dann beenden Sie den Debugger und vergleichen Sie sie. –

Verwandte Themen