Может ли "s {1} раздражение" при повторении итерации по массиву ячеек?
"s{1}
раздражение" заголовка относится к первой строке внутри блока:
for s = some_cell_array
s = s{1}; % unpeel the enclosing cell
% do stuff with s
end
Этот бизнес s = s{1}
необходим, потому что итерация над some_cell_array
на самом деле не перебирает содержимое some_cell_array
, а скорее над ячейками из 1 элемента, каждая из которых содержит элемент из some_cell_array
.
Отбросив вопрос о том, кто, возможно, захочет, чтобы это поведение было по умолчанию, есть ли какой-либо способ перебрать содержимое без заголовка some_cell_array
?
Ответы
Ответ 1
Я не думаю, что есть способ избежать этой проблемы в общем случае. Но есть способ, если ваш массив ячеек имеет все числа или все символы. Вы можете преобразовать в массив и пропустить цикл for
.
Например, это:
some_cell_array = {1,2,3}
for s = [some_cell_array{:}] % convert to array
s
end
дает:
s =
1
s =
2
s =
3
Другой вариант - создать функцию, которая работает в каждой ячейке массива. Затем вы можете просто вызвать cellfun
и вообще не иметь петли.
У меня нет никаких идей о том, кому нужно это поведение или как это может быть полезно. Мое предположение о том, почему оно работает таким образом, однако, заключается в том, что оно является реализацией. Таким образом, итератор цикла не меняет тип на разных итерациях. Это ячейка каждый раз, даже если содержимое этой ячейки имеет разные типы.
Ответ 2
Просто небольшое дополнение к комментарию Сэма Роберса к исходному вопросу, почему вы должны предпочесть s{:}
over s{1}
: упростить отслеживание ошибок.
Представьте, что вы по ошибке сохранили ячейку s
в качестве столбца вместо строки. Тогда
for s = some_cell_array
просто вернет ячейку s
, которая равна some_cell_array
. Тогда синтаксис s{1}
вернет первый элемент some_cell_array
, тогда как s{:}
создаст список всех элементов в some_cell_array
. Этот второй случай намного увереннее приведет к ошибке выполнения в следующем коде. В то время как первый случай может иногда создавать жесткую ошибку для обнаружения.