То же понятие справедливо и для элементов массива клеток, если они являются числовыми массивами.
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 для такого рода вещей, поскольку он, скорее всего, более эффективен, чем решение здесь.
В чем причина избегания цикла? – Crowley