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:

  • The 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' 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