如何在MATLAB中将短路逻辑运算符作为函数调用?

3

MATLAB操作符通常被翻译成函数形式,例如以下示例:

  • ~A => not(A)
  • A + B => plus(A,B)
  • A(...) => subsref(...)
  • A(...) = ... => subsasgn(...)
  • 等等。

现在请考虑运算符 &&||

各种文档(1-或运算符的文档, 2-与运算符的文档, 3-MATLAB编程基础电子书)都没有对此进行解释,而help andhelp orhelp relop也没有。这个也没有帮助:profile('on','-detail','builtin')
我可以说的是,根据以下示例,|似乎被重定向到or()
>> 1 || [0,0]    
ans =    
     1

>> 1 | [0,0]    
ans =    
     1     1

>> or(1,[0,0])    
ans =    
     1     1

>> 1 && [0,0]
Operands to the || and && operators must be convertible to logical scalar values.

所以我的问题是:假设可能的话,如何显式调用&&||的基础函数?(注意:这个问题涉及“如何”的方面,而不是“为什么”)

3
我怀疑函数式调用 AND 时无法避免执行参数。 - knedlsepp
2
@Dev-iL:如果你想要一种功能性的短路运算符,你需要使用一种具有惰性求值模型的语言。 - Amro
@Amro - 你可能知道MATLAB提供了某种形式的延迟计算(例如在Daniel的答案中演示)。尽管如此,我还是感谢你的见解。顺便说一句 - &&||就是MATLAB具有惰性求值能力的“活生证明”...问题是为什么我们不能像这样轻松地利用MATLAB的这些能力来做其他事情呢? - Dev-iL
1
这个链接sAND(@() expr1, @() expr2, ...)可能是最接近的了。 - knedlsepp
@knedlsepp:这让我想起了几年前在Loren Shure的博客上作为MATLAB中函数式编程技术系列之一展示的iif.m - Amro
@Amro:是的,我读了Loren的帖子,讲述了内联if,当OP问这个问题时。这就是为什么它非常相似的原因。;-) - knedlsepp
1个回答

2

无法使用函数实现基本功能。假设有一个实现此运算符的函数scor,那么调用scor(true,B)将在调用scor之前评估B,但运算符不会评估B

显然,可以定义scor=@(x,y)(x||y),但在上述情况下它将评估B

/关于使用函数句柄的注释,这可能是一种解决方法:

%not printing a:
true||fprintf('a')
%printing a:
scor=@(x,y)(x||y)
scor(true,fprintf('a'))
%not printing a:
scor(true,@()(fprintf('a')))

1
@Dev-iL:逻辑短路运算符&&||没有功能形式,这是有充分理由的...在调用此类函数之前必须评估参数,这违背了短路行为的目的。 - Amro
1
也许是 builtin('&&',a,@()b) - Dev-iL
1
@Dev-iL:看起来你在安装Matlab的时候本来想得到Haskell。;-) - knedlsepp
2
顺便提一下 - 我刚刚注意到SO建议查看类似主题的以下相关问题,我觉得非常有启发性。 - Dev-iL
1
(我接受这个答案的前提是,尊敬的丹尼尔和@Amro不符合克拉克第一定律的假设 :)) - Dev-iL
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接