Ошибка cellfun: вход № 2, который должен быть массивом ячеек, вместо этого был двойным - PullRequest
0 голосов
/ 07 апреля 2020
field1 = 'f1';  value1 = [1 2];
field2 = 'f2';  value2 = {1, 2, 32, 'text'};
field3 = 'f3';  value3 = [pi pi.^2];
field4 = 'f4';  value4 = [1 2 3];
s = struct(field1,value1,field2,value2,field3,value3,field4,value4);

x = cellfun(@(u) numel(u), value2); %%% WORKS FINE
x = cellfun(@(u) numel(u), s.f2); %%%% THROWS ERROR
x = cellfun(@(u) numel(u.f2), s); %%%% THROWS ERROR

Может кто-нибудь объяснить, почему последние 2 строки выдают ошибку? Ошибка:

Error using cellfun
Input #2 expected to be a cell array, was double instead.

Ответы [ 2 ]

1 голос
/ 07 апреля 2020

Первая строка cellfun документации говорит (выделено мое):

Применить функцию к каждой ячейке в массив ячеек .

При втором и третьем использовании cellfun у вас нет массивов ячеек, поэтому они не работают.


При вашем втором использовании cellfun т.е. x = cellfun(@(u) numel(u), s.f2);
s.f2 возвращает список через запятую. Чтобы получить тот же результат, используя cellfun, вы можете объединить список через запятую в массиве ячеек, а затем cellfun следующим образом:

x = cellfun(@(u) numel(u), {s.f2});

При третьем использовании cellfun, Вы вводите векторную структуру. В этом случае, чтобы получить тот же результат, вы можете применить arrayfun более удобно, как это:

x = arrayfun(@(u) numel([u.f2]), s);
0 голосов
/ 07 апреля 2020

для третьего вызова созданная структура s называется " Nonscalar Struct Array ", потому что ваш элемент f2 является массивом ячеек нескалярных элементов. Помимо решения, предоставляемого @Sandar, вы также можете сделать

x=cellfun(@numel, {s(:).f2})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...