arrayfun

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

Синтаксис

B = arrayfun(func,A)
B = arrayfun(func,A1,...,An)
B = arrayfun(___,Name,Value)
[B1,...,Bm] = 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 = 1x3 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 = 1x3 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

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

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

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

A = arrayfun(@(x) mean(x.f1),S,'UniformOutput',false)
A = 1x3 cell array
    {1x5 double}    {1x10 double}    {1x2 double}

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

S(1).f1 = 1:10;
S(2).f1 = [2; 4; 6];
S(3).f1 = []
S = 1x3 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 принадлежит, и вы также перегружаете subsref или методы size A, то arrayfun помещает эти требования к A:

  • Метод size A должен возвратиться, массив удваивается.

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

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

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

Укажите необязательные аргументы в виде пар ""имя, значение"", разделенных запятыми. Имя (Name) — это имя аргумента, а значение (Value) — соответствующее значение. Имя должно появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

TRUE или FALSE, заданный как пара, разделенная запятой, состоящая из 'UniformOuput' и или true (1) или false (0).

Значение 'UniformOutput'

Описание

true (1)

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

false (0)

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

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

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

  • identifier — Ошибочный идентификатор

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

  • 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 могут иметь любые размеры и различные типы данных.

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

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

Была ли эта тема полезной?