arrayfun

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

Описание

пример

B = arrayfun(func,A) применяет функциональный func к элементам A, один элемент за один раз. arrayfun затем конкатенирует выходные параметры от func в выходной массив B, так, чтобы для iэлемент th 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 должен возвратить массив типа double.

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

  • Поддержите присвоение линейной индексацией в объектный массив

  • Имейте a 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