2010-05-15 15 views
1

Auparavant, j'ai implémenté les mutateurs comme suit, mais il fonctionnait lentement sur un algorithme OO récursif sur lequel je travaillais, et je pensais que c'était parce que je dupliquais des objets à chaque appel de fonction ... est-ce correct?Comment créer des mutations de variable d'instance efficaces dans Matlab?

%% Example Only 
obj2 = tripleAllPoints(obj1) 
    obj.pts = obj.pts * 3; 
    obj2 = obj1 
end 

J'ai ensuite essayé la mise en œuvre muteurs sans utiliser l'objet de sortie ... cependant, il semble que dans Matlab je ne peux pas le faire - les changements ne seront pas « coller » à cause d'un problème de portée? Pour l'application, une version extrêmement simplifiée de mon code (qui utilise OO et récursion) est ci-dessous. Pour l'application, une version extrêmement simplifiée de mon code (qui utilise OO et récursion) est ci-dessous.

classdef myslice 

properties 
    pts  % array of pts 
    nROW % number of rows 
    nDIM % number of dimensions 
    subs % sub-slices 
end % end properties 

methods 
    function calcSubs(obj) 
     obj.subs = cell(1,obj.nROW); 
     for i=1:obj.nROW 
      obj.subs{i} = myslice; 
      obj.subs{i}.pts = obj.pts(1:i,2:end); 
     end 
    end 

    function vol = calcVol(obj) 
     if obj.nROW == 1 
     obj.volume = prod(obj.pts); 
     else 
     obj.volume = 0; 
     calcSubs(obj); 
     for i=1:obj.nROW 
       obj.volume = obj.volume + calcVol(obj.subs{i}); 
     end 
     end 
    end 

end % end methods 

end % end classdef 

Répondre

3

Matlab a deux types de classes: handle and value.

Une classe de valeurs est transmise par valeur et doit donc être copiée chaque fois que vous y écrivez. En outre, les appels de méthode doivent être de la forme obj = method(obj); pour que les modifications puissent se "coller". Par contre, les objets handle sont transmis par référence, et donc, chaque fois que vous modifiez un objet dans un espace de travail - espace de travail de base ou espace de travail d'une fonction - l'objet est modifié partout. Ainsi, un appel method(obj); modifie également obj dans l'espace de travail appelant, même si obj n'est pas retourné explicitement.

La classe par défaut est l'objet valeur. Si vous souhaitez utiliser des objets de poignée, votre classdef ligne doit être:

classdef myslice < handle 

dire que vous êtes sous-classement de la classe de poignée.

1

Dans cette situation, vous pouvez donner à MATLAB un indice supplémentaire sur ce qui se passe en utilisant le même nom pour votre sortie que l'entrée. Dans votre exemple, cela évite de créer une copie de obj. Cela peut ne pas toujours être approprié (par exemple, si vous avez besoin de l'ancienne et de la nouvelle valeur de obj.pts pour mettre à jour une autre propriété).

%% Example Only 
obj = tripleAllPoints(obj) 
    obj.pts = obj.pts * 3; 
end 

(voir aussi: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/)