Как изменить свойства объекта Matlab

Я создал класс MATLAB, например:

classdef myclass

  properties
      x_array = [];
  end

  methods
    function increment(obj,value)
       obj.x_array = [obj.x_array ; value);
    end
  end
end

Проблема в том, что свойство x_array никогда не изменяется, когда я вызываю функцию increment(): например:

>>s = myclass
>>increment(s,5)

>>s.x_array
ans = []

Я провел некоторое исследование и пришел к выводу, что это связано с тем, что MATLAB использует отложенное копирование для объектов, поэтому мой класс наследует класс HANDLE, что должно было решить эту проблему, но это не так. Кто-нибудь знает, почему это происходит? И если расширение класса дескриптора действительно является решением, разве это не правильный способ сделать это:

classdef myclass < handle

или есть какие-то дополнительные действия?


person user34830    schedule 07.11.2008    source источник


Ответы (2)


Это похоже на этот вопрос. Короче говоря, все, что вам нужно сделать, это наследовать от класса handle.

Быстрый пример

Содержимое файла myclass.m

classdef myclass<handle
    properties
        x_array = []
    end
    methods
        function obj=increment(obj,val)
            obj.x_array=[obj.x_array val];
        end
    end
end

Теперь из командной строки Matlab вы можете сделать следующее

>> s=myclass;
>> s.increment(5)
>> s.increment(6)
>> s

s = 

myclass handle

properties:
    x_array: [5 6]

lists of methods, events, superclasses
person Azim J    schedule 07.11.2008
comment
Чтобы сделать сравнение, конструктор класса дескриптора действует как традиционный класс Python? - person Lautaro Parada Opazo; 17.04.2020

Есть более простой способ. Вам нужно только перезаписать исходный экземпляр s следующим образом:

s = increment(s,5);

Дополнительная информация в документации.

PS: хотя использовать дескриптор можно, функция копирования работает по-другому, и вы должны быть осторожны при ее использовании. Когда вы используете дескриптор, фактически вы создаете новый адрес/ссылку на объект.

person Meisam Jalalvand    schedule 08.09.2016