Предполагая, что методы, связанные с моделью 1, всегда используются вместе, а не смешиваются с методами для модели 2 или 3, вы можете настроить код со всеми функциями для одной модели в одном файле:
% MODEL1 Methods that implement model 1
function [boundary_left,boundary_right,flux,source] = model1
boundary_left = @boundary_left_method;
boundary_right = @boundary_right_method;
flux = @flux_method;
source = @source_method;
function [out, args] = boundary_left_method(input, args)
% [implementation]
end
function [out, args] = boundary_right_method(input, args)
% [implementation]
end
function [out, args] = flux_method(input, args)
% [implementation]
end
function [out, args] = source_method(input, args)
% [implementation]
end
end
По сути, здесь у вас есть функция, которая возвращает дескрипторы для набора функций, которые реализуют один метод.boundary_left_method
является частной функцией, поэтому к ней нельзя получить прямой доступ, но model1
может возвращать дескрипторы этих функций, что делает их доступными.
Теперь вы можете делать:
[boundary_left,boundary_right,flux,source] = model1;
Solution = numerical_scheme_1(boundary_left,boundary_right,flux,source,parameters);
Это решение довольно похоже на решение пользовательского класса, предложенное OP, но несколько проще.Я не думаю, что будет большая разница в производительности, но единственный способ узнать наверняка - это реализовать и синхронизировать различные варианты.Что наиболее эффективно со временем меняется, так как улучшается JIT MATLAB.
Обратите внимание, что предложенная здесь схема также позволяет включать данные (parameters
) в следующие функции:
% MODEL1 Methods that implement model 1
function [boundary_left,boundary_right,flux,source] = model1(parameters)
boundary_left = @boundary_left_method;
boundary_right = @boundary_right_method;
flux = @flux_method;
source = @source_method;
function [out, args] = boundary_left_method(input, args)
out = input * parameters; % You can use PARAMETERS here, note that it is not
% an input argument to this nested function, it is
% found in the parent scope.
end
% ...
end % This end here is important now, this way `boundary_left_method` is an
% nested function, not simply a separate function within the same file.
Теперьвозвращаемый дескриптор функции boundary_left
содержит данные parameters
.См. соответствующую документацию .
Если вы также управляете кодом функций числовой схемы, которые используют эти функции, вы можете написать method1
et al.вместо этого возвращать массив ячеек, а numerical_scheme_1
и др.функции, чтобы взять массив ячеекЗатем вы можете просто сделать:
numerical_scheme_1(method1,parameters);
numerical_scheme_1(method2,parameters);
numerical_scheme_1(method3,parameters);
numerical_scheme_2(method1,parameters);
numerical_scheme_2(method2,parameters);
numerical_scheme_2(method3,parameters);
% etc.
Затем вы можете использовать цикл для прохождения всех комбинаций:
schemes = {@numerical_scheme_1, @numerical_scheme_2, ... };
methods = {method1, method2, method3, ... };
for ii=1:numel(schemes)
for jj=1:numel(methods)
schemes{ii}(methods{jj},parameters);
end
end
[Отказ от ответственности: этот код не проверен, но я не вижупочему это не сработает ...]