MATLAB Class 效率

MATLAB Class Efficiency

我尽量缩短。我遇到了一个涉及气体管道流动数值模拟的问题。我使用不同的模型模拟从一个边界到另一个边界(即从右到左)的气流(传输方程)。 问题是,因为我使用不同的模型来表示所述气体流量和边界条件,所以我得到了很多函数,例如:

boundary_left_model_1
boundary_right_model_1
boundary_left_model_2
boundary_right_model_2
boundary_left_model_2b
boundary_right_model_2b
....
flux_model_1
flux_model_2
....
source_model_1
source_model_2
.....

我在数字方案之前通过(例如)分配了所需的功能:

boundary_left = @[needed function];
boundary_right=@ [needed function];
flux = @[needed function];
source=@ [needed function];

接下来是这样的:

Solution = numerical_scheme_#1(boundary_left,boundary_right,flux,source,parameters);

你明白了。

现在,构建程序的最有效方法(在结构化时)是什么?据我所知,我有三个选择:

1) 我在matlab函数文件中定义了每个函数(会产生很多文件)

2) 我在脚本中为数字方案定义了每个函数(将导致文件很长,adjust/read 不太清楚)

3) 我使用包含所有模型的方法为边界条件创建了一个 class,一个 class 用于包含相应函数的通量和源。在我的数值方案的函数分配中,我然后调用我需要的方法。 (看起来复杂且效率低下,不确定在matlab中调用方法所需的时间,但对我来说是最结构化的方式)

我可能应该注意到我对matlab和数值模拟(学生)比较陌生,我也在问一般如何解决这类问题。提前致谢! 另外作为奖励:如果有人喜欢使用 matlab 对 PDE 系统进行实际模拟 - 我会收到类似 "How do I decide on a numerical scheme - which criteria should I consider?"

的问题

再次感谢,祝大家有个愉快的一天!

假设与模型 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

基本上,这里有一个函数 return 是一组实现一个方法的函数的句柄。 boundary_left_method 是一个私有函数,所以不能直接访问,但是 model1 可以 return 处理这些函数,这使得它们可以访问。

您现在可以:

[boundary_left,boundary_right,flux,source] = model1;
Solution = numerical_scheme_1(boundary_left,boundary_right,flux,source,parameters);

此解决方案与 OP 建议的自定义 class 解决方案非常相似,但更简单一些。我不认为性能会有很大差异,但唯一可以确定的方法是实施和安排各种选项。随着 MATLAB 的 JIT 改进,什么是最有效的随着时间的推移而变化。

请注意,此处提出的方案还允许将数据 (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 returned 中嵌入了 parameters 的数据。参见 the relevant documentation


如果您还控制采用这些函数句柄的数字方案函数的代码,您可以编写 method1 等。改为 return 句柄单元格数组,而 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

[免责声明:此代码未经测试,但我不明白为什么它不起作用...]