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
[免责声明:此代码未经测试,但我不明白为什么它不起作用...]
我尽量缩短。我遇到了一个涉及气体管道流动数值模拟的问题。我使用不同的模型模拟从一个边界到另一个边界(即从右到左)的气流(传输方程)。 问题是,因为我使用不同的模型来表示所述气体流量和边界条件,所以我得到了很多函数,例如:
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
[免责声明:此代码未经测试,但我不明白为什么它不起作用...]