Подтвердить что ты не робот

Может ли "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?

4b9b3361

Ответ 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. Этот второй случай намного увереннее приведет к ошибке выполнения в следующем коде. В то время как первый случай может иногда создавать жесткую ошибку для обнаружения.