【问题标题】:How to determine if an output is being ignored with ~ [duplicate]如何确定输出是否被 ~ [重复]
【发布时间】:2017-10-10 13:21:52
【问题描述】:

在 Matlab 中,您可以忽略带有以下 syntax 的输出:

[~, ixMax] = max(foo);

我有一个函数,有签名

[out, out1, out2, out3] = function foo(in1, in2, in3)

out1out2out3 是可选输出,每个输出仅在非常特定(不寻常)的情况下需要。 Foo 的计算成本很高,out1/out2/out3 的计算成本更高,但依赖于 foo 生成的中间状态。如果调用者使用~ 忽略它们,我希望能够避免计算out1/out2/out3。如何在foo 的定义中检查?

【问题讨论】:

  • nargout 是您所需要的。如果你做[out,~,~,~]=不确定它是否有效,但如果你做[out]=它会有效
  • @AnderBiguri 与 nargout 是对的 - 如果用户请求 [out,~,~,~],它将返回 4。我认为没有任何(肯定记录在案)方法来确定用户是否指定了 var 名称而不是 ~
  • @m7913d,看起来不像是骗子。 OP 询问他是否可以通过避免使用~ 调用输出来节省计算资源。
  • @Bebs 但为此他需要确定输出是否未使用(因此用户是否使用了~
  • @Bebs 标题显然相同(并且正确反映了主要问题)。请注意,部分答案可能在重复的问题中。

标签: matlab function reflection


【解决方案1】:

它不会加速这个过程。 ~ 是一种让读者告诉他你不需要这些输出的方式。它还节省了这个变量的内存使用量。

Matlab documentation 说:

但是,某些函数返回的结果会占用更多内存。如果您不需要这些变量,它们会浪费您的系统空间。

因此它不会提高性能,因为无论如何这些值都是在内部计算的。

Yair M. Altman 所著的加速 MATLAB 性能:加速 MATLAB 程序的 1001 个技巧一书说 (p187):

但是,如果不使用~,如果需要第一个输出,用户只需删除~ 和括号并写入即可获得计算时间。

out = function foo(in1, in2, in3)

【讨论】:

  • 没什么,误读了一些。 ~ 操作确实如此,但是可以编写检查所要求的输出数量的函数,因此如果 OP 执行 [out]= 那么他们可以解决问题
  • @AnderBiguri,是的,我的回答只关注~ 部分。如果只需要第一个输出,那你是对的。
  • @Irreducible 它回答了 OP 要求的情况,当输入被 询问,但未存储时,即~。该函数不知道输出是否被存储,只是被调用。但是,是的,我认为答案应该更清楚地说明这一点
  • @Irreducible,Matlab 说使用~ 输出仍然是计算的,但不是存储的。
  • 不错的答案!只是一个警告:Altman 书中引用的文字说尾随~ 符号应在出现时从代码中删除。这并不总是正确的。当使用两个输出调用某些函数时,它们会返回不同的第一个输出。例如比较 a = find(1:3)[a,~] = find(1:3)
猜你喜欢
  • 2011-01-02
  • 2010-11-13
  • 2010-09-24
  • 2015-06-12
  • 2019-05-05
  • 2014-02-10
  • 2014-03-15
  • 2014-01-27
  • 2015-02-27
相关资源
最近更新 更多