Как создать эффективные мутаторы переменных экземпляра в Matlab? - PullRequest
2 голосов
/ 15 мая 2010

Ранее я реализовал мутаторы следующим образом, однако он работал невероятно медленно на рекурсивном алгоритме OO, над которым я работаю, и я подозревал, что это могло быть из-за того, что я дублировал объекты при каждом вызове функции ... это правильно?

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

Затем я попытался реализовать мутаторы без использования выходного объекта ... однако, похоже, что в MATLAB я не могу этого сделать - изменения не будут "зависать" из-за проблемы с областью действия?

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

Для целей приложения ниже приведена чрезвычайно упрощенная версия моего кода (которая использует OO и рекурсию).

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

Ответы [ 2 ]

4 голосов
/ 17 мая 2010

Matlab имеет два типа классов: handle и value .

Класс значения передается по значению и, следовательно, должен копироваться всякий раз, когда вы пишете в него. Кроме того, вызовы методов должны иметь форму obj = method(obj); для того, чтобы изменения стали «палкой».

Напротив, объекты дескриптора передаются по ссылке, и, таким образом, всякий раз, когда вы изменяете объект в любом рабочем пространстве - базовом рабочем пространстве или рабочем пространстве функции - объект изменяется везде. Таким образом, вызов method(obj); также изменяет obj в рабочей области вызова, даже если obj явно не возвращается.

Класс по умолчанию является объектом значения. Если вы хотите использовать дескрипторные объекты, ваша строка classdef должна быть:

classdef myslice < handle

т.е. вы подкласс класса дескриптора.

1 голос
/ 08 сентября 2011

В этой ситуации вы можете дать MATLAB дополнительную подсказку о том, что происходит, используя то же имя для вашего вывода, что и для ввода. В вашем примере это позволяет избежать создания копии obj. Это может не всегда подходить (например, если вам нужно как старое, так и новое значения obj.pts для обновления какого-либо другого свойства).

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

(см. Также: http://blogs.mathworks.com/loren/2007/03/22/in-place-operations-on-data/)

...