Если ваша функция представляет собой одно выражение, вы можете использовать анонимную функцию. Он будет сохранен в 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