【问题标题】:How to determine if a Matlab function returns no values?如何确定 Matlab 函数是否没有返回值?
【发布时间】:2014-06-10 15:44:09
【问题描述】:

f.m:

function [] = f(the_only_argument)
% Do awesome things here
end

g.m:

function [value] = g(the_only_argument)
% Do awesome things here
value = awesome_value;
end

是否存在某种 ReturnsNothing,例如:

assert(ReturnsNothing(@f) & ~ReturnsNothing(@g))

附:我希望能够调用arrayfun(@f, [1,1,1]),目前返回错误:

??? Error using ==> f
Too many output arguments.

【问题讨论】:

  • 第二部分(顺便说一句,它与第一部分有什么关系?):您不能将输入参数(这是arrayfun 尝试做的)传递给不接受输入参数的函数
  • 你不能直接返回NaN 并使用它吗?
  • 我为问题中的一个错误道歉:而不是 f() 它应该是 f(the_only_arg)。
  • @mezhaka:我无法重现您的问题,您可以将 f 与 arrayfun 一起使用。你怎么称呼arrayfun
  • 也无法重现,除非您使用输出调用arrayfun,例如out = arrayfun(@f, [1,1,1]),在这种情况下删除输出,例如arrayfun(@f, [1,1,1]) 会解决这个问题

标签: matlab reflection metaprogramming


【解决方案1】:

nargout('f')nargout('g') 做你需要的吗?

如果您的函数具有可变数量的输出参数,请小心,因为nargout 将针对该特殊情况返回负数。

【讨论】:

    【解决方案2】:

    第二部分

    arrayfun(@f, [1,1,1]) 抛出上述错误,因为f 没有定义输入,arrayfun 将为数组中的每个值调用f(使用该值作为输入)。所以错误与f(1)引起的错误相同

    如果您需要在 arrayfun 中运行不接受输入的函数,您可以将其包装在一个匿名函数中,该函数会丢弃输入。
    例如

    arrayfun(@(~)f,[1,1,1])
    

    不会导致错误,因为 arrayfun 不需要输出!

    第一部分

    nargout 可以在函数外部使用,通过传递包含函数名称的字符串来检查它有多少定义的输出

    例如使用问题中的函数

    nargout('f')
    
    ans =
    
         0
    
    nargout('g')
    
    ans =
    
         1
    

    此外,如果varargout 存在,则将其视为单个输出,但返回负值以指示其存在

    例如下面的函数

    function [value,varargout] = h()
    ...code
    end
    

    返回

    nargout('h')
    
    ans =
    
         -2
    

    【讨论】:

    • 我真诚地为这个问题中的一个错误道歉:而不是 f() 它应该是 f(the_only_arg)。而不是“输入参数太多”。它应该是“输出参数过多”。
    • 不用担心,在这种情况下我无法使用 Matlab 2013a 进行复制
    猜你喜欢
    • 2016-10-16
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2021-09-10
    相关资源
    最近更新 更多