【问题标题】:Is there something simpler than `~isempty(x)` to cast a non-scalar `x` into a boolean scalar?有没有比 `~isempty(x)` 更简单的方法来将非标量 `x` 转换为布尔标量?
【发布时间】:2015-05-05 12:00:37
【问题描述】:

短版

有没有比~isempty(x)“布尔化”非标量x 更简单的方法(在其他语言中很常见)?


tl;dr 版本

在许多语言(例如 Python)中,当变量/符号在布尔上下文中求值时,它们会自动转换为布尔标量。特别是,在这种情况下,类似列表的数据结构x 如果为空,则自动转换为 false,否则为 true。

这意味着可以使用列表作为操作数编写任意布尔表达式。例如:

>>> list1 = [1, 1]
>>> list2 = [2, 2, 2]
>>> list3 = [3, 3, 3, 3]
>>> yesno = list1 and list2 and list3
>>> if yesno:
...   print True
... else:
...   print False
... 
True

在 MATLAB 中,这并不完全有效。例如

>> list1 = [1 1];
>> list2 = [2 2 2];
>> list3 = [3 3 3 3];
>> yesno = list1 && list2 && list3;
Operands to the || and && operators must be convertible to logical scalar values. 
>> yesno = list1 & list2 & list3;
Error using  & 
Matrix dimensions must agree. 

我能想到的最好的方法是这样的:

>> yesno = ~isempty(list1) && ~isempty(list2) && ~isempty(list3);
>> if yesno
  true
else
  false
end
ans =
     1

对于“布尔化”a,有没有比 ~isempty(...) 更简洁的表示法? MATLAB 数组?

【问题讨论】:

  • 我不完全明白你的问题。你有多个数组,你想比较它们是否都是非空的?
  • 能够对不同长度的列表进行布尔运算是否重要,或者问题更多的是关于运算符本身的干净符号?
  • @xenoclast:两者都很重要。基本上,我正在寻找与 Python 中可以做的最接近的符号,如我的问题的 tl;dr 版本所示。
  • 好吧,我的回答无效,我删除了它并对@thewaywewalk 的回答发表了评论。
  • 完全同意其他答案:isempty 绝对没有问题。您所说的布尔化更广为人知的是 Truth Value Testing‌​。在 Python 中,空列表在布尔条件下隐式计算为 False,我同意你的观点,它不那么麻烦,但另一方面,当事情不工作时,了解真正发生的事情就不那么直接了。

标签: matlab syntax casting shortcut notation


【解决方案1】:

isempty 其实没什么问题。

您可以使用这种方法来减少麻烦:

list1 = [1, 1];
list2 = [2, 2, 2];
list3 = [3, 3, 3, 3];
list4 = [];

yesno = all(~cellfun(@isempty, {list1,list2,list3,list4}))

如果您不介意重新组织数据,这是一个非常方便的选择:

lists{1} = [1, 1];
lists{2} = [2, 2, 2];
lists{3} = [3, 3, 3, 3];
lists{4} = [];

yesno = all(~cellfun(@isempty,lists))

cellfunisempty 的组合应该非常快,尽管我现在缺少此声明的来源。

【讨论】:

  • @xenoclast 我想说从头开始使用元胞数组的第二种方法是否是一个不错的选择。应该比每次比较每个数组都要快。
  • 不那么繁琐且绝对非常优雅的解决方案,特别是如果您将数据组织在cell 数组中。仅当您有大量列表时,这可能不是最佳解决方案,因为cellfun 将函数isempty 应用于所有元素(如果cell 数组的开头有一个空列表,我会避免在其他位置搜索)。
【解决方案2】:

简短:不,没有,~isempty() 是很好的编码。 你可以稍微缩短它

yesno = ~isempty(l1)*~isempty(l2)*~isempty(l3)

干杯

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 2011-02-07
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多