【问题标题】:Matlab: Passing all arguments to a function handleMatlab:将所有参数传递给函数句柄
【发布时间】:2014-01-17 20:50:59
【问题描述】:

我在一系列文件上运行了很多函数。因此,创建一个在文件上运行我的函数的函数是合乎逻辑的,而不是在每个文件中重复该过程。问题是每个函数的参数数量不同! 所以伪代码是:

function [out1, out2]=batchDo(@func,adrs,arg1,arg2,...,argn)

files=ls(adrs);
for i=1:length(files)
    raw=load([adrs files(i)]);
    [out1, out2]=func(raw,arg1,arg2,...,argn)
    out1s=out1+out1s;
    out2s=out2+out2s;
end
out1=out1s/length(files);
out2=out2s/length(files);

幸运的是,在我的情况下,输出几乎相似,我可以添加一些假人以使它们都相似。但如果有类似的方法来解决它们,我将不胜感激。

【问题讨论】:

  • 我不想使用 varargin,因为我的数据很大,而且对字段进行寻址会使例程非常慢。
  • 如果您只使用arg1 等来表示func,您是否可以只使用varargin 而无需单独寻址单元格,即func(raw,varargin{:})?或者创建一个匿名函数来捕获相关参数并将其传入,例如func2=@(raw)func(raw,arg1,arg2,...,argn)。我不确定任何人应该如何回答这个问题——它接近于“不清楚你在问什么”。
  • 我认为您需要解释您对 varargin 的反对意见。它不应该很慢,并且显然是 MATLAB 中用于不同数量参数的明显机制。

标签: matlab arguments function-handle


【解决方案1】:

如果输入按某种顺序(或可以重新排序),例如:

  • 所有函数都采用参数 1 到 3
  • 接受附加参数的函数按顺序排列:arg4 到 arg8、arg4 到 arg10 等。

然后您可以通过将varargin 添加到不使用完整参数集的每个函数,但仅代替未使用的参数(就像定义可选参数一样),然后在其中忽略它来非常简单地做到这一点实际功能。所以一个函数可能是:

function myfunction(raw, arg1, arg2, arg3, arg4, arg5, varargin)

实际上这只使用了 arg1...arg5 而其他的都被忽略了。

【讨论】:

    【解决方案2】:

    Horchler 的答案是正确的,如果我只是将 varargin 作为 varargin{:} 传递,它会自动提供我需要的东西。 如果您在每个函数中都使用 varargin,然后尝试处理 varargin.arg1 而不是 arg1,它会减慢您的代码速度。有很多文章比较了性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 2018-01-07
      • 2014-04-10
      • 2020-02-23
      • 1970-01-01
      相关资源
      最近更新 更多