2017-02-06 1 views
1

Ich habe eine benutzerdefinierte Matrix-Klasse, dass ich Index der Lage sein wollen, wie:Matlab subsref und Ende

x = myobj(1,2).d(3,4)  % myobj(1,2,3,4) 
x = myobj(2, 3).d(3, end) % myobj(1,3,1,end) 

Ich möchte diese auch für die Zuordnung zu arbeiten.

Ich habe angefangen mit:

class MyClass < double 
    methods 
    function obj = MyClass(x) 
     obj = [email protected](x); 
    end 
    function obj = subsref(obj, s) 
     varargout{:} = [email protected](obj, subsintercept(obj, s)); 
    end 
    function obj = subsasgn(obj, s, b) 
     obj = [email protected](obj, subsintercept(obj, s), b); 
    end 
    end 
end 

und dann kann ich Schlamassel mit der Indizierung in subsintercept. Ich habe jedoch ein Problem gefunden. Mit einer minimalen Implementierung:

function s = subsintercept(obj, s) 
    disp('subsintercept'); 
    for i = 1:length(s) 
     disp(s(i)); 
    end 
end 

bekomme ich dieses erwartete Verhalten

>> myobj = MyClass(zeros(1,2,3,4)) 
>> myobj(1,2).d(3,4) 
subsintercept 
type: '()' 
subs: {[1] [2]} 
type: '.' 
subs: 'd' 
type: '()' 
subs: {[3] [4]} 
<error due to not having finished subsintercept yet> 

Aber diesen unerwarteten

>> myobj(1,2).d(3,end) 
subsintercept 
type: '()' 
subs: {[1] [2]} 
type: '.' 
subs: 'd' 
<error due to not having finished subsintercept yet> 
  1. Warum Hinzufügen des end Ursache ich nicht die 3 zu erhalten?
  2. Ist dieses Verhalten dokumentiert?
+0

Kann man ein wenig mehr Informationen darüber, was Sie Klasse aussieht. Ist "d" eine dynamische Eigenschaft oder was? – Suever

+0

@Suever: 'd' existiert nicht. Die Klasse ist eine Unterklasse von 'double'. Es gibt keine Eigenschaften oder andere Methoden außer einem uninteressanten Konstruktor. Ich habe jetzt das Muster für all das hinzugefügt, aber ich denke, es verdeckt die Übersicht etwas. – Eric

+0

Da 'd' nicht existiert, hat MATLAB keine Möglichkeit,' end' in etwas Nützliches umzuwandeln. Was erwarten Sie von 'end'? – Suever

Antwort

0

Einige Tests zeigt, dass dies:

result = myobj(1,2).d(3,end) 

zu übersetzt:

end_ = str2func('end'); 
d_temp = subsref(myobj, substruct('()', {1 2}, '.', 'd')); 
ei = end_(d_temp, 2, 2); 
result = subsref(myobj, substruct('()', {1 2}, '.', 'd', '()', {3, ei})); 

das heißt, dass subsref zweimal aufgerufen wird! *

* Und überraschenderweise nicht als subsref(d_temp, substruct('()', {3, ei})) das zweite Mal

+0

Ich denke, das macht Sinn, da' myobj (1,2) .d' aufgelöst werden muss, bevor es überhaupt möglich ist zu bestimmen, was zu tun ist mit einem 'Ende'. Es kann sich lohnen, dies ein bisschen zu verfeinern, um es ein bisschen klarer zu machen, wie Sie Ihren 'subsref' schreiben können, um damit fertig zu werden. – Suever

+0

@suever: Ich werde es tun, wenn ich es umsetze. Scheint, dass ich ein Proxy-Objekt irgendeiner Art in "d" brauche – Eric