exponenta event banner

arrayfun

Применить функцию к каждому элементу массива

Описание

пример

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

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

B = arrayfun(func,A1,...,An) применяется func к элементам массивов A1,...,An, так что B(i) = func(A1(i),...,An(i)). Функция func должны принять n и возвращает скаляр. Множества A1,...,An все должны иметь одинаковый размер.

пример

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

пример

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

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

Примеры

свернуть все

Создайте нескалярный структурный массив. Каждая структура имеет поле, которое содержит вектор случайных чисел. Векторы имеют разные размеры.

S(1).f1 = rand(1,5);
S(2).f1 = rand(1,10);
S(3).f1 = rand(1,15)
S=1×3 struct array with fields:
    f1

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

A = arrayfun(@(x) mean(x.f1),S)
A = 1×3

    0.6786    0.6216    0.6069

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

S(1).X = 5:5:100; S(1).Y = rand(1,20);
S(2).X = 10:10:100; S(2).Y = rand(1,10);
S(3).X = 20:20:100; S(3).Y = rand(1,5)
S=1×3 struct array with fields:
    X
    Y

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

figure
hold on
p = arrayfun(@(a) plot(a.X,a.Y),S);
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.

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

S(1).f1 = rand(3,5);
S(2).f1 = rand(6,10);
S(3).f1 = rand(4,2)
S=1×3 struct array with fields:
    f1

Вычислите среднее значение для каждого поля в S с помощью arrayfun функция. mean возвращает векторы, содержащие среднее каждого столбца, поэтому средство не может быть возвращено в виде массива. Чтобы вернуть средства в массиве ячеек, укажите 'UniformOutput',false пара имя-значение.

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)
A=1×3 cell array
    {1x5 double}    {1x10 double}    {[0.3534 0.5603]}

Создайте нескалярный структурный массив.

S(1).f1 = 1:10;
S(2).f1 = [2; 4; 6];
S(3).f1 = []
S=1×3 struct array with fields:
    f1

Вычислите размеры каждого поля S с помощью arrayfun функция. Количество строк и столбцов в числовых массивах 1 на 3.

[nrows,ncols] = arrayfun(@(x) size(x.f1),S)
nrows = 1×3

     1     3     0

ncols = 1×3

    10     1     0

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

свернуть все

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

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

Пример: B = arrayfun(@round,A) возвращает целую часть каждого элемента A.

Входной массив. A может быть массивом, который принадлежит любому из фундаментальных типов данных, за исключением table и timetableили к любому классу, поддерживающему линейное индексирование.

Чтобы применить функцию к содержимому таблицы или расписания, используйте varfun, rowfun, splitapply, или groupsummary функции.

Если определить класс, который A принадлежит, и вы также перегружаете subsref или size методы A, то arrayfun размещает эти требования на A:

  • size способ A должен возвращать массив двойников.

  • A должна поддерживать линейную индексацию.

  • Продукт размеров, возвращаемый size метод не должен превышать предел A, как определено линейным индексированием в A.

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

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

Пример: A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false) возвращает значение в массиве ячеек. S - массив структуры, в котором каждая структура имеет поле с именем f1.

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

Значение 'UniformOutput'

Описание

true (1)

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

false (0)

arrayfun возвращает выходные данные 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', то arrayfun возвращает ошибку, вызванную func.

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

свернуть все

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

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

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

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

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

Ограничения

  • Различие в поведении входных массивов комплексных чисел

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

    Чтобы проиллюстрировать разницу в поведении, сначала создайте массив комплексных чисел.

    A = zeros(2,1); A(1) = 1; A(2) = 0 + 1i
    
    A =
    
       1.0000 + 0.0000i
       0.0000 + 1.0000i
    

    Затем создайте массив ячеек и назначьте элементы A к нему. При индексации в A(1), его значение возвращается как вещественное число, поскольку его мнимая часть равна нулю. И вы можете хранить реальные и сложные значения в различных ячейках C1 потому что в массивах ячеек могут храниться данные разных типов.

    C1 = cell(2,1); C1{1} = A(1); C1{2} = A(2)
    
    C1 =
    
      2×1 cell array
    
        {[               1]}
        {[0.0000 + 1.0000i]}
    

    Звонить arrayfun и доступ к элементам A. Назначьте его значения массиву ячеек. Когда arrayfun доступы A(1), он рассматривает это значение как комплексное число и присваивает его C2{1}.

    C2 = arrayfun(@(x) x, A, 'UniformOutput', false)
    
    C2 =
    
      2×1 cell array
    
        {[1.0000 + 0.0000i]}
        {[0.0000 + 1.0000i]}
    

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

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