2016-03-18 2 views
1

При работе с регулярными массивами в Matlab очень легко выполнить логические тесты и установить ячейки, которые не прошли эти тесты, до нужного значения, такого как NaN, без необходимости использовать для циклов.Логические тесты на ячеистых массивах

TestA=[1 2 10 45]; 
TestA(TestA<=2)=NaN; 

У меня есть массив ячеек, где я могу сделать логический тест КИ, но как я могу затем включить элементы массива ячеек, которые не тест на NaN без использования для цикла?

TestCell{1}=[1 2 10 45]; 
TA=TestCell{1} <= 2; 

Благодаря

Баз

+0

В чем причина избегания цикла? – Crowley

ответ

3

То же понятие справедливо и для элементов массива клеток, если они являются числовыми массивами.

TestCell{1}(TestCell{1} <= 2) = NaN; 

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

Альтернативой является создание некоторого выражения, которое вернет массив, где есть NaN, когда ваше условие истинно и исходные значения в другом месте.

Такое выражение может выглядеть следующим образом:

x .* ~(x <= 2) ./ ~(x <= 2); 

Это приведет к тому, что элемент умножить на 0/0 (NaN), когда условие истинно, и умножается на 1/1 (1), когда условие ложно. Таким образом, все значения, соответствующие условию, будут установлены в NaN.

Если попробовать это на примере данных:

x = [1 2 10 45]; 
x .* ~(x <= 2) ./ ~(x <= 2) 

    NaN NaN 10 45 

Мы получаем Нэн, где ваше условие истинно. Итак, теперь мы можем подключить его к cellfun, чтобы выполнить эту операцию для всего содержимого.

output = cellfun(@(x)x .* ~(x <= 2)./~(x <= 2), TestCell, 'uni', 0); 

В качестве альтернативы можно написать условие в обратном направлении, так что все элементы, которые не отвечают критериям будет установлено значение NaN. Это не позволит свести к минимуму оба условных выражения в приведенных выше уравнениях.

x = [1 2 10 45] 
x .* (x > 2) ./ (x > 2) 

И мы можем подключить его к cellfun, как мы это делали выше.

output = cellfun(@(x)x .* (x > 2) ./ (x > 2), TestCell, 'uni', 0); 

Основным недостатком такого подхода является то, что она требует от вас, чтобы оценить условную дважды, поскольку не существует хороший способ для хранения промежуточного результата в cellfun. Это может быть или не быть проблемой в зависимости от того, насколько велик каждый элемент. Нет ничего постыдного в том, что у вас есть цикл for для такого рода вещей, поскольку он, скорее всего, более эффективен, чем решение здесь.

+0

Разве это не что-то вроде взлома против самозащиты MATLAB? Ячейка ячеек, в отличие от обычных массивов, может содержать элементы с разными типами. При работе с элементами того же типа нет необходимости использовать массивы ячеек. – Crowley

+2

@Crowley Могут быть элементы одного и того же типа, но разные размеры. – Suever

+0

Если вы берете вектор или строку как тип, вы правы. Но строка - это массив 'char', а vector - массив' double'. – Crowley

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

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