exponenta event banner

cellfun

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

Описание

пример

A = cellfun(func,C) применяет функцию func к содержимому каждой ячейки массива ячеек C, по одной клетке за раз. cellfun затем объединяет выходные сигналы func в выходной массив A, так что для i-й элемент C, A(i) = func(C{i}). Входной аргумент func является дескриптором функции, который принимает один входной аргумент и возвращает скаляр. Выходные данные func может иметь любой тип данных, если объекты этого типа могут быть конкатенированы. Множество A и массив ячеек C имеют одинаковый размер.

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

пример

A = cellfun(func,C1,...,Cn) применяется func к содержимому ячеек C1,...,Cn, так что A(i) = func(C1{i},...,Cn{i}). Функция func должны принять n и возвращает скаляр. Массивы ячеек C1,...,Cn все должны иметь одинаковый размер.

пример

A = cellfun(___,Name,Value) применяется func с дополнительными опциями, указанными одним или несколькими Name,Value аргументы пары. Например, чтобы вернуть выходные значения в массиве ячеек, укажите 'UniformOutput',false. Вы можете вернуться A как массив ячеек, когда func возвращает значения, которые не могут быть объединены в массив. Вы можете использовать Name,Value объединение аргументов с входными аргументами любого из предыдущих синтаксисов.

пример

[A1,...,Am] = cellfun(___) возвращает несколько выходных массивов A1,...,Am когда func прибыль m выходные значения. func может возвращать выходные аргументы, которые имеют различные типы данных, но тип данных каждого вывода должен быть одинаковым каждый раз func вызывается. Этот синтаксис можно использовать с любым из входных аргументов предыдущих синтаксисов.

Число выходных аргументов из func не обязательно должно совпадать с числом входных аргументов, указанных C1,...,Cn.

Примеры

свернуть все

Создайте массив ячеек, содержащий числовые массивы различных размеров.

C = {1:10, [2; 4; 6], []}
C=1×3 cell array
    {[1 2 3 4 5 6 7 8 9 10]}    {3x1 double}    {0x0 double}

Вычислите среднее значение каждого числового массива и верните значение в массив.

A = cellfun(@mean,C)
A = 1×3

    5.5000    4.0000       NaN

Создайте два массива ячеек, содержащих числовые массивы разных размеров.

X = {5:5:100, 10:10:100, 20:20:100};
Y = {rand(1,20), rand(1,10), rand(1,5)};

Постройте графики массивов. Возвращает массив объектов строки диаграммы из plot и используйте их для добавления различных маркеров к каждому набору точек данных. cellfun может возвращать массивы любого типа данных, если объекты этого типа данных могут быть объединены.

figure
hold on
p = cellfun(@plot,X,Y);
p(1).Marker = 'o';
p(2).Marker = '+';
p(3).Marker = 's';
hold off

Figure contains an axes. The axes contains 3 objects of type line.

Создайте массив ячеек, содержащий числовые массивы различных размеров.

C = {1:10, [2; 4; 6], []}
C=1×3 cell array
    {[1 2 3 4 5 6 7 8 9 10]}    {3x1 double}    {0x0 double}

Вычислите размеры каждого массива в C. Количество строк и столбцов в числовых массивах 1 на 3.

[nrows,ncols] = cellfun(@size,C)
nrows = 1×3

     1     3     0

ncols = 1×3

    10     1     0

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

Создайте массив ячеек из векторов символов, содержащих имена будней.

C = {'Monday','Tuesday','Wednesday','Thursday','Friday'}
C = 1x5 cell
    {'Monday'}    {'Tuesday'}    {'Wednesday'}    {'Thursday'}    {'Friday'}

Создайте трехбуквенные сокращения для имен с помощью cellfun функция. Укажите функцию, извлекающую первые три символа и возвращающую их в виде символьного вектора. Чтобы вернуть сокращения в массиве ячеек, укажите 'UniformOutput',false пара имя-значение.

A = cellfun(@(x) x(1:3),C,'UniformOutput',false)
A = 1x5 cell
    {'Mon'}    {'Tue'}    {'Wed'}    {'Thu'}    {'Fri'}

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

Создание сокращений для имен в строковом массиве с помощью cellfun.

str = ["Saturday","Sunday"]
str = 1x2 string
    "Saturday"    "Sunday"

B = cellfun(@(x) x(1:3),str,'UniformOutput',false)
B = 1x2 cell
    {'Sat'}    {'Sun'}

Входные аргументы

свернуть все

Функция, применяемая к содержимому ячеек массивов входных ячеек, указанных как дескриптор функции, символьный вектор или строковый скаляр.

func может соответствовать более чем одному файлу функций и, следовательно, может представлять набор перегруженных функций. В этих случаях MATLAB ® определяет, какую функцию следует вызвать, на основе класса входных аргументов.

Обратная совместимость

Можно указать func в виде символьного вектора или строкового скаляра, а не дескриптора функции, но только для ограниченного набора имен функций. func могут быть: 'isempty', 'islogical', 'isreal', 'length', 'ndims', 'prodofsize', 'size', или 'isclass'.

Если указано имя функции, а не дескриптор функции:

  • cellfun не вызывает перегруженные версии функции.

  • size и isclass функции требуют дополнительных входных данных для cellfun функция:

    A = cellfun('size',C,k) возвращает размер вдоль k-й размер каждого элемента C.

    A = cellfun('isclass',C,classname) возвращает логический 1 (true) для каждого элемента C который соответствует classname аргумент. Этот синтаксис возвращает логическое значение 0 (false) для объектов, которые являются подклассом classname.

Пример: A = cellfun(@mean,C) возвращает средства элементов C.

Входной массив, заданный как массив ячеек или строковый массив. Если C является строковым массивом, то cellfun обрабатывает каждый элемент C как если бы это был символьный вектор, а не строка.

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: A = cellfun(@mean,C,'UniformOutput',false) возвращает выходные данные из mean в массиве ячеек. Используйте 'UniformOutput',false пара имя-значение, если C содержит числовые матрицы и mean возвращает векторы.

True или false, задается как разделенная запятыми пара, состоящая из 'UniformOutput' и либо true (1) или false (0).

Значение 'UniformOutput'

Описание

true (1)

func должен возвращать скаляры, которые cellfun объединяется в массивы.

false (0)

cellfun возвращает выходные данные func в массивах ячеек. Выходные данные func может иметь любые размеры и различные типы данных.

Функция для обнаружения ошибок, указанная как разделенная запятыми пара, состоящая из 'ErrorHandler' и дескриптор функции. Если func выдает ошибку, а затем обработчик ошибок, указанный 'ErrorHandler' перехватывает ошибку и выполняет действие, указанное в функции. Обработчик ошибок должен либо выдать ошибку, либо вернуть то же количество выходов, что и func. Если значение 'UniformOutput' true, то выходные аргументы обработчика ошибок должны быть скалярами и иметь тот же тип данных, что и выходные данные func.

Первым входным аргументом обработчика ошибок является структура со следующими полями:

  • identifier - Идентификатор ошибки

  • message - Текст сообщения об ошибке

  • index - Линейный индекс во входные массивы, при котором func вызвал ошибку

Остальные входные аргументы обработчика ошибок являются входными аргументами для вызова func сделанный func выдать ошибку.

Предположим func возвращает два двойника в качестве выходных аргументов. Можно указать обработчик ошибок как 'ErrorHandler',@errorFunc, где errorFunc - функция, которая вызывает предупреждение и возвращает два выходных аргумента.

function [A,B] = errorFunc(S,varargin)
    warning(S.identifier, S.message); 
    A = NaN; 
    B = NaN;
end

Если не указать 'ErrorHandler', то cellfun возвращает ошибку, вызванную func.

Выходные аргументы

свернуть все

Выходной массив, возвращаемый как массив любого типа данных или как массив ячеек.

По умолчанию cellfun объединяет выходные данные func в массив. func должен возвращать скаляры. Если func возвращает объекты, затем класс, которому принадлежат объекты, должен соответствовать этим требованиям.

  • Поддержка назначения путем линейного индексирования в массиве объектов

  • Иметь reshape метод, который возвращает массив, имеющий тот же размер, что и входной

Если значение 'UniformOutput' аргумент пары имя-значение false (0), то cellfun возвращает выходные данные в массиве ячеек. В этом случае результаты func может иметь любые размеры и различные типы данных.

Расширенные возможности

Представлен до R2006a