Метод Matlab как свойство - PullRequest
2 голосов
/ 22 мая 2019

Есть ли способ написать класс Matlab, который имеет один из своих собственных методов в качестве свойства? Я пишу код симуляции, в котором метод класса (который фактически является уравнением физики) может измениться в будущем, поэтому я хотел бы, чтобы заархивированные экземпляры класса включали метод.

Вот немного псевдокода Matlab-ish.

classdef foo
   properties
      bar % some property
      baz % a property that contains the method baz
   end
   methods
       function out = baz() % the method I want to store
          stuff
       end
   end
end

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

Желательно, чтобы он был общедоступным, а также не являлся статическим свойством. Я хотел бы сериализовать экземпляры.

Ответы [ 3 ]

2 голосов
/ 22 мая 2019

Если ваша функция представляет собой одно выражение, вы можете использовать анонимную функцию. Он будет сохранен в MAT-файл (Спасибо gnovice за указание на это).Так, например:

classdef foo
   properties
      bar = 0
      baz = @(x)sqrt(x)
   end
end

Теперь я могу сделать:

f = foo;
f.baz(2)  % returns 1.4142
save foo_test f
clear

И затем изменить определение baz в foo.m на baz = @(x)x.^2, а затем:

f2 = foo;
f2.baz(2) % returns 4
load foo_test
f.baz(2)  % still returns 1.4142
f2.baz(2) % still returns 4

Если у вас есть более сложные функции, вы можете настроить их следующим образом:

classdef foo
   properties
      bar = 5
      baz_func = @(obj,x) baz_2019_05_22(obj,x) % could be private
   end
   methods
      function out = baz(obj,x)
         out = obj.baz_func(obj,x);
      end
      function out = baz_2019_05_22(obj,x) % could be private
         out = obj.bar * sqrt(x);
      end
   end
end

А теперь:

f = foo;
f.baz(2) % returns 7.0711
save foo_test f
clear

В будущем вы 'измените функцию, но вы сохраните код и создадите новую (приватную) функцию, которая выполняет вычисления:

classdef foo
   properties
      bar = 5
      baz_func = @(obj,x) baz_2022_08_04(obj,x) % could be private
   end
   methods
      function out = baz(obj,x)
         out = obj.baz_func(obj,x);
      end
      function out = baz_2019_05_22(obj,x) % could be private
         out = obj.bar * sqrt(x);
      end
      function out = baz_2022_08_04(obj,x) % could be private
         out = obj.bar * x.^2;
      end
   end
end

Сложность заключается в том, чтобы сохранить старый код без его изменения ... Но вы можетесделайте функцию baz настолько сложной, насколько вы хотите.Сейчас:

f2 = foo;
f2.baz(2) % returns 20
load foo_test
f.baz(2)  % still returns 7.0711
1 голос
/ 23 мая 2019

Основываясь на комментариях Dev-iL и Криса, вот что я сделал, сохранив весь файл classdef в виде простого текста в свойстве class_definition.

classdef foo
   properties
      class_definition
   end
   methods
       function obj = foo()
         obj.class_definition = fileread([mfilename(),'.m']);
       end
       function out = baz() % the method I want to store
          stuff
       end
   end
end

Как предлагает Dev-iL, написание функции, которая принимает имя файла и дескриптор функции / метода и возвращает код этой функции (в отличие от всего файла classdef) в виде простого текста, вероятно, лучше ответит на исходный вопрос, поэтому я приму такой ответ, если он будет опубликован. Этого решения было достаточно для моих целей.

1 голос
/ 22 мая 2019
classdef foo
    properties (Dependent, SetAccess = 'private')
        baz % a property that contains the method baz
    end
    methods
       function out = bazMethod() % the method I want to store
          stuff
       end

       function bazOut = get.baz(self)
           bazOut = bazMethod();
       end
    end

end

Он не будет сериализовать текущее определение метода bazMethod, но если то, что вы хотите, это просто определение, это звучит так, как будто вы хотите, чтобы baz был зависимым свойством.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...