2015-05-05 6 views
4

короткой версияЕсть ли что-то более простое, чем `~ isempty (x)`, чтобы отличить нескалярный `x` в булевском скаляре?

Есть ли менее громоздкий способ (как это имеет место обычно в других языках) к «booleanize» не-скалярной x чем ~isempty(x)?


ТЛ; др версия

Во многих языках, таких как 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 

Есть менее громоздкими, чем обозначение ~isempty(...) для «booleanizing» в   MATLAB массив?

+3

Я не понимаю ваш вопрос полностью. У вас несколько массивов, и вы хотите сравнить, если все не пустое? – thewaywewalk

+0

Важно ли, чтобы вы могли выполнять логические операции в списках разной длины или это вопрос о чистой нотации для самих операторов? – xenoclast

+0

@xenoclast: оба важны. В основном, я ищу ближайшую нотацию, эквивалентную тому, что можно сделать в Python, как показано в версии tl; dr моего вопроса. – kjo

ответ

0

Короткие: Нет, нет и ~ непусто() - это точное кодирование. Вы можете сократить его немного по

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

Комбинация cellfun и isempty должно быть очень быстро, хотя сейчас у меня нет источника для этого утверждения.

+0

@xenoclast Я бы сказал, что если второй подход с использованием ячеек массивов с нуля - это опрятный вариант. Должно быть определенно быстрее, чем сравнивать каждый массив каждый после каждого. – thewaywewalk

+1

Менее громоздкое и, безусловно, очень элегантное решение, особенно если вы упорядочиваете данные в массиве 'cell'. Только если у вас большое количество списков, это может быть не лучшим решением, потому что 'cellfun' применяет функцию' isempty' ко всем элементам (если в начале массива 'cell' имеется пустой список, я бы избегал поиск в других местах). – lmillefiori

 Смежные вопросы

  • Нет связанных вопросов^_^