编写函数的表面包装[MATLAB]

编写函数的表面包装[MATLAB],matlab,Matlab,我在Matlab中有一个函数: function [runs,balls]=batting(form,team_flag,weather_flag) form是一个1x13双倍数组。这些标志只是布尔值运行、球只是标量。上面的函数进行一些复杂的数学模拟,以获得其输出值。现在我写一个包装器: function [runs,balls]=wrapper1(form) [runs,balls]=batting(form,false,false); 然后我写另一个包装: function runs_v

我在Matlab中有一个函数:

function [runs,balls]=batting(form,team_flag,weather_flag)
form
是一个
1x13
双倍数组。这些标志只是布尔值<代码>运行、球只是标量。上面的函数进行一些复杂的数学模拟,以获得其输出值。现在我写一个包装器:

function [runs,balls]=wrapper1(form)
[runs,balls]=batting(form,false,false);
然后我写另一个包装:

function runs_vector=wrapper2(form_vector)
for i=1:size(form_vector,1)
    form_cell{i}=form_vector(i,:);
end
runs_vector=cellfun(@wrapper1, form_cell)';

我要达到的目标必须是显而易见的。我试图利用
cellfun
的行为来实现自定义函数
batting
。这里需要将标志参数设置为false,但一般来说,它们在作为其一部分的项目中是不同的。因此,如果不编写中间包装,即
wrapper1
,我就无法消除
batting
函数的标志输入。我的问题是,是否有一种不那么丑陋或更聪明的方法可以做到这一点?

您可以通过创建一个匿名函数来消除
wrapper1
,该函数将打击减少为两个参数:

runs_vector = cellfun(@(form) batting(form, false, false), form_cell)';
此外,该回路可替换为如下所示:

将这两者结合起来,我们就能

function runs_vector = wrapper2(form_vector)
form_cell = num2cell(form_vector, 2);
runs_vector = cellfun(@(form) batting(form, false, false), form_cell)';

你应该修改
batting
,这样它就需要一个
nx13
矩阵作为输入,这使得两个包装器都过时了。但问题是复杂的数学模拟是采用1x13向量的函数batting。将其推广到nx13矩阵需要在击球功能中运行for循环
n
次。相反,我是用包装纸做的。这似乎比for循环方法更优雅。我想把复杂的数学模拟作为一个单独的黑匣子,我不想偷窥,更不用说修改了!请注意,
cellfun
(以及所有的*fun)在几乎所有情况下都比显式循环慢。
function runs_vector = wrapper2(form_vector)
form_cell = num2cell(form_vector, 2);
runs_vector = cellfun(@(form) batting(form, false, false), form_cell)';