2015-05-05 13 views
4

短版是否有比`〜isempty(x)`更简单的方式将非标量`x`转换为布尔标量?

有一个不太麻烦的方式(如在其他语言中常见的),以“booleanize”非标x~isempty(x)


TL;博士版本

在许多语言中,例如Python,当变量/符号在布尔上下文进行评估它们被自动转换为一个布尔标量。具体来说,在这种情况下,如果列表类数据结构x被自动转换为假,否则为空。

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

>>> 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 

是否有一个不太繁琐的符号比~isempty(...)为“booleanizing”一   MATLAB阵列?

+3

缩短小幅我不明白你的问题完全。你有多个数组,你想比较是否所有非空? – thewaywewalk

+0

重要的是你能够在不同长度的列表上进行布尔运算,或者更多的是关于操作符本身的简洁表示法的问题? – xenoclast

+0

@xenoclast:两者都很重要。基本上,我正在寻找与Python能做什么相当的最接近的符号,如我的问题的tl; dr版本所示。 – kjo

回答

0

短:不,没有和〜isempty()是很好的编码。 您可以通过

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

欢呼

2

isempty实际上没有错。

你可以用这种方法来得到它有点不太cumbersume:

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应该是非常快的,尽管我现在缺乏这个声明的来源。

+0

@xenoclast我会说,如果从头开始使用单元阵列的第二种方法是一个整洁的选项。应该比每个之后的每个数组都比较快。 – thewaywewalk

+1

不那么麻烦,绝对非常优雅的解决方案,尤其是如果您将数据组织到“单元格”数组中。只有当你有大量的列表时,这可能不是最好的解决方案,因为'cellfun'将函数'isempty'应用于所有元素(如果'cell'数组开始处有一个空列表,我会避免在其他地点搜索)。 – lmillefiori

相关问题