matlab.tall.reduce

Редуцируйте массивы путем применения алгоритма сокращения к блокам данных

Синтаксис

tA = matlab.tall.reduce(fcn,reducefcn,tX)
tA = matlab.tall.reduce(fcn,reducefcn,tX,tY,...)
[tA,tB,...] = matlab.tall.reduce(fcn,reducefcn,tX,tY,...)
[tA,tB,...] = matlab.tall.reduce(___,'OutputsLike',{PA,PB,...})

Описание

пример

tA = matlab.tall.reduce(fcn,reducefcn,tX) применяет функциональный fcn к каждому блоку массива tX, чтобы сгенерировать частичные результаты. Затем функция применяет reducefcn к вертикальной конкатенации частичных результатов неоднократно, пока это не имеет один конечный результат, tA.

пример

tA = matlab.tall.reduce(fcn,reducefcn,tX,tY,...) задает несколько массивов tX,tY,..., которые являются входными параметрами к fcn. Те же строки каждого массива управляются fcn; например, fcn(tX(n:m,:),tY(n:m,:)). Входные параметры с высотой каждый передается каждому вызову fcn. С этим синтаксисом fcn должен возвратить один выходной параметр, и reducefcn должен принять вход того и возвратить один выходной параметр.

пример

[tA,tB,...] = matlab.tall.reduce(fcn,reducefcn,tX,tY,...) , то, где fcn и reducefcn являются функциями, которые возвращают несколько выходных параметров, возвращает массивы tA,tB,..., каждый соответствующий одному из выходных аргументов fcn и reducefcn. Этот синтаксис имеет эти требования:

  • fcn должен возвратить то же количество выходных параметров, как требовались от matlab.tall.reduce.

  • reducefcn должен иметь то же количество вводов и выводов как количество выходных параметров, которые требуют от matlab.tall.reduce.

  • Каждый вывод fcn и reducefcn должен быть тем же типом как первый вход tX.

  • Соответствующие выходные параметры fcn и reducefcn должны иметь ту же высоту.

пример

[tA,tB,...] = matlab.tall.reduce(___,'OutputsLike',{PA,PB,...}) указывает, что выходные параметры tA,tB,... имеют совпадающие типы данных как прототипные массивы PA,PB,..., соответственно. Можно использовать любую из комбинаций входных аргументов в предыдущих синтаксисах.

Примеры

свернуть все

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

Составьте длинную таблицу для набора данных airlinesmall.csv. Данные содержат информацию о прибытии и время отправления рейсов США. Извлеките переменную ArrDelay, которая является вектором задержек прибытия.

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA');
ds.SelectedVariableNames = {'ArrDelay' 'DepDelay'};
tt = tall(ds);
tX = tt.ArrDelay;

Используйте matlab.tall.reduce, чтобы считать общее количество non-NaN элементов в высоком векторе. Первый функциональный numel считает число элементов в каждом блоке данных, и второй функциональный sum добавляет вместе все счета для каждого блока, чтобы привести к скалярному результату.

s = matlab.tall.reduce(@numel,@sum,tX)
s =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :

Соберите результат в память.

s = gather(s)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.2 sec
Evaluation completed in 1.4 sec
s = 123523

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

Составьте длинную таблицу для набора данных airlinesmall.csv. Данные содержат информацию о прибытии и время отправления рейсов США. Удалите строки недостающих данных из таблицы и извлеките ArrDelay, DepDelay и переменные Year. Эти переменные являются векторами задержек прибытия и отъезда и связанных лет для каждого рейса в наборе данных.

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA');
ds.SelectedVariableNames = {'ArrDelay' 'DepDelay' 'Year'};
tt = tall(ds);
tt = rmmissing(tt);

Используйте matlab.tall.reduce, чтобы применить две функции к длинной таблице. Первая функция комбинирует переменные ArrDelay и DepDelay, чтобы найти общую среднюю задержку каждого рейса. Функция определяет, сколько уникальных лет находится в каждом фрагменте данных, и затем циклах в течение каждого года, и вычисляет среднюю общую задержку рейсов в том году. Результатом является 2D таблица переменных, содержащая год и среднюю общую задержку. Эти промежуточные данные должны уменьшаться далее, чтобы прибыть в среднюю задержку в год. Сохраните эту функцию в своей текущей папке как transform_fcn.m.

type transform_fcn
function t = transform_fcn(a,b,c)
ii = gather(unique(c));

for k = 1:length(ii)
    jj = (c == ii(k));
    d = mean([a(jj) b(jj)], 2);
    
    if k == 1
        t = table(c(jj),d,'VariableNames',{'Year' 'MeanDelay'});
    else
        t = [t; table(c(jj),d,'VariableNames',{'Year' 'MeanDelay'})];
    end
end

end

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

type reduce_fcn
function TT = reduce_fcn(t)
[groups,Y] = findgroups(t.Year);
D = splitapply(@mean, t.MeanDelay, groups);

TT = table(Y,D,'VariableNames',{'Year' 'MeanDelay'});
end

Применяйте преобразование и уменьшайте функции до высоких векторов. Поскольку входные параметры (вводят double) и выходные параметры (вводят table) имеют различные типы данных, используют пару "имя-значение" 'OutputsLike', чтобы указать, что вывод является таблицей. Простой способ задать тип вывода состоит в том, чтобы вызвать функцию преобразования с фиктивными входными параметрами.

a = tt.ArrDelay;
b = tt.DepDelay;
c = tt.Year;
d1 = matlab.tall.reduce(@transform_fcn, @reduce_fcn, a, b, c, 'OutputsLike',{transform_fcn(0,0,0)})
d1 =

  Mx2 tall table

    Year    MeanDelay
    ____    _________

     ?          ?    
     ?          ?    
     ?          ?    
     :          :
     :          :

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

d1 = gather(d1)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.9 sec
Evaluation completed in 2.2 sec
d1=22×2 table
    Year    MeanDelay
    ____    _________

    1987     7.6889  
    1988     6.7918  
    1989     8.0757  
    1990     7.1548  
    1991     4.0134  
    1992     5.1767  
    1993     5.4941  
    1994     6.0303  
    1995     8.4284  
    1996     9.6981  
    1997     8.4346  
    1998     8.3789  
    1999     8.9121  
    2000     10.595  
    2001     6.8975  
    2002     3.4325  
      ⋮

Альтернативный подход

Другой способ вычислить ту же статистику группой состоит в том, чтобы использовать splitapply, чтобы вызвать matlab.tall.reduce (вместо того, чтобы использовать matlab.tall.reduce, чтобы вызвать splitapply).

Используя этот подход, вы вызываете findgroups и splitapply непосредственно на данных. Функциональный mySplitFcn, который работает с каждой группой данных, включает вызов matlab.tall.reduce. Преобразование и уменьшает функции, используемые matlab.tall.reduce, не должны группировать данные, таким образом, те функции только выполняют вычисления на предварительно сгруппированных данных, которые splitapply передает им.

type mySplitFcn
function T = mySplitFcn(a,b,c)
T = matlab.tall.reduce(@non_group_transform_fcn, @non_group_reduce_fcn, ...
    a, b, c, 'OutputsLike', {non_group_transform_fcn(0,0,0)});

    function t = non_group_transform_fcn(a,b,c)
        d = mean([a b], 2);
        t = table(c,d,'VariableNames',{'Year' 'MeanDelay'});
    end

    function TT = non_group_reduce_fcn(t)
        D = mean(t.MeanDelay);
        TT = table(t.Year(1),D,'VariableNames',{'Year' 'MeanDelay'});
    end

end

Вызовите findgroups и splitapply, чтобы работать с данными и применить mySplitFcn к каждой группе данных.

groups = findgroups(c);
d2 = splitapply(@mySplitFcn, a, b, c, groups);
d2 = gather(d2)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 2: Completed in 0.51 sec
- Pass 2 of 2: Completed in 1.1 sec
Evaluation completed in 2 sec
d2=22×2 table
    Year    MeanDelay
    ____    _________

    1987     7.6889  
    1988     6.7918  
    1989     8.0757  
    1990     7.1548  
    1991     4.0134  
    1992     5.1767  
    1993     5.4941  
    1994     6.0303  
    1995     8.4284  
    1996     9.6981  
    1997     8.4346  
    1998     8.3789  
    1999     8.9121  
    2000     10.595  
    2001     6.8975  
    2002     3.4325  
      ⋮

Вычислите взвешенное стандартное отклонение и отклонение длинного массива с помощью вектора весов. Это - один пример того, как можно использовать matlab.tall.reduce, чтобы работать вокруг функциональности, которую длинные массивы еще не поддерживают.

Создайте два высоких вектора случайных данных. tX содержит случайные данные, и tP содержит соответствующие вероятности, таким образом, что sum(tP) является 1. Эти вероятности подходят, чтобы взвесить данные.

rng default
tX = tall(rand(1e4,1));
p = rand(1e4,1);
tP = tall(normalize(p,'scale',sum(p)));

Запишите тождественное отображение, которое возвращает выходные параметры, равные входным параметрам. Этот подход пропускает шаг преобразования matlab.tall.reduce и передает данные непосредственно шагу сокращения, где функция сокращения неоднократно применяется, чтобы уменьшать размер данных.

type identityTransform.m
function [A,B] = identityTransform(X,Y)
  A = X;
  B = Y;
end

Затем, запишите функцию сокращения, которая работает с блоками высоких векторов, чтобы вычислить взвешенное отклонение и стандартное отклонение.

type weightedStats.m
function [wvar, wstd] = weightedStats(X, P)
  wvar = var(X,P);
  wstd = std(X,P);
end

Используйте matlab.tall.reduce, чтобы применить эти функции к блокам данных в высоких векторах.

[tX_var_weighted, tX_std_weighted] = matlab.tall.reduce(@identityTransform, @weightedStats, tX, tP)
tX_var_weighted =

  tall double

    0.0832


tX_std_weighted =

  tall double

    0.2885

Входные параметры

свернуть все

Преобразуйте функцию, чтобы применяться, заданный как указатель на функцию или анонимная функция. Каждый вывод fcn должен быть тем же типом как первый вход tX. Можно использовать опцию 'OutputsLike', чтобы возвратить выходные параметры различных типов данных. Если fcn возвращает больше, чем один выходной параметр, то выходные параметры должны все иметь ту же высоту.

Общая функциональная подпись fcn

[a, b, c, ...] = fcn(x, y, z, ...)
fcn должен удовлетворить эти требования:

  1. Входные параметры — входные параметры [x, y, z, ...] являются блоками данных, которые умещаются в памяти. Блоки производятся путем извлечения данных из соответствующих входных параметров длинного массива [tX, tY, tZ, ...]. Входные параметры [x, y, z, ...] удовлетворяют эти свойства:

    • Весь [x, y, z, ...] имеет тот же размер в первой размерности после любого позволенного расширения.

    • Блоки данных в [x, y, z, ...] прибывают из того же индекса в высокой размерности, принимая, что длинный массив является неодиночным элементом в высокой размерности. Например, если tX и tY являются неодиночным элементом в высокой размерности, то первым набором блоков может быть x = tX(1:20000,:) и y = tY(1:20000,:).

    • Если первая размерность какого-либо [tX, tY, tZ, ...] имеет размер 1, то соответствующий блок [x, y, z, ...] состоит из всех данных в том длинном массиве.

  2. Выходные аргументы Выходные параметры [a, b, c, ...] являются блоками, которые умещаются в памяти, чтобы быть отправленными в соответствующие выходные параметры [tA, tB, tC, ...]. Выходные параметры [a, b, c, ...] удовлетворяют эти свойства:

    • Весь [a, b, c, ...] должен иметь тот же размер в первой размерности.

    • Весь [a, b, c, ...] вертикально конкатенирован с соответствующими результатами предыдущих вызовов fcn.

    • Весь [a, b, c, ...] отправляется в тот же индекс в первой размерности в их соответствующих целевых выходных массивах.

  3. Функциональные Правилаfcn должен удовлетворить функциональное правило:

    • F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]: Применение функции к конкатенации входных параметров должно совпасть с применением функции к входным параметрам отдельно и затем конкатенации результатов.

  4. Пустые Входные параметры — Гарантируют, что fcn может обработать вход, который имеет высоту 0. Пустые входные параметры могут произойти, когда файл пуст или если вы сделали большую фильтрацию на данных.

Например, эта функция принимает два входных массива, придает им квадратную форму и возвращает два выходных массива:

function [xx,yy] = sqInputs(x,y)
xx = x.^2;
yy = y.^2;
end 
После того, как вы сохраните эту функцию в доступную папку, можно вызвать функцию, чтобы придать квадратную форму tX и tY и найти максимальное значение с этой командой:
tA = matlab.tall.reduce(@sqInputs, @max, tX, tY)

Пример: tC = matlab.tall.reduce(@numel,@sum,tX,tY) находит число элементов в каждом блоке, и затем это суммирует результаты считать общее количество элементов.

Типы данных: function_handle

Функция сокращения, чтобы применяться, заданный как указатель на функцию или анонимная функция. Каждый вывод reducefcn должен быть тем же типом как первый вход tX. Можно использовать опцию 'OutputsLike', чтобы возвратить выходные параметры различных типов данных. Если reducefcn возвращает больше, чем один выходной параметр, то выходные параметры должны все иметь ту же высоту.

Общая функциональная подпись reducefcn

[rA, rB, rC, ...] = reducefcn(a, b, c, ...)
reducefcn должен удовлетворить эти требования:

  1. Входные параметры — входные параметры [a, b, c, ...] являются блоками, которые умещаются в памяти. Блоками данных являются или выходные параметры, возвращенные fcn или частично сокращенный выход из reducefcn, который управляется снова для дальнейшего сокращения. Входные параметры [a, b, c, ...] удовлетворяют эти свойства:

    • Входные параметры [a, b, c, ...] имеют тот же размер в первой размерности.

    • Для данного индекса в первой размерности каждой строке блоков данных [a, b, c, ...] или происходит из входа или происходит от того же предыдущего вызова до reducefcn.

    • Для данного индекса в первой размерности каждая строка входных параметров [a, b, c, ...] для того индекса происходит из того же индекса в первой размерности.

  2. Output Arguments — All выходные параметры [rA, rB, rC, ...] должен иметь тот же размер в первой размерности. Кроме того, они должны быть вертикально объединены с соответствующими входными параметрами [a, b, c, ...], чтобы допускать повторные сокращения при необходимости.

  3. Функциональные Правилаreducefcn должен удовлетворить эти функциональные правила (до ошибки округления):

    • F(input) == F(F(input)): Применение функции неоднократно к тем же входным параметрам не должно изменять результат.

    • F([input1; input2]) == F([input2; input1]): результат не должен зависеть от порядка конкатенации.

    • F([input1; input2]) == F([F(input1); F(input2)]): Применение функции однажды к конкатенации некоторых промежуточных результатов должно совпасть с применением его отдельно, конкатенацией и применением его снова.

  4. Пустые Входные параметры — Гарантируют, что reducefcn может обработать вход, который имеет высоту 0. Пустые входные параметры могут произойти, когда файл пуст или если вы сделали большую фильтрацию на данных. Для этого вызова все входные блоки являются пустыми массивами правильного типа и размера в размерностях вне первого.

Некоторыми примерами подходящих функций сокращения являются все встроенные функции сокращения размерности, такие как sum, mean, max, и так далее. Эти функции могут работать над промежуточными результатами, приведенными fcn, и возвратить один скаляр. Порядок, в котором происходят конкатенации, не изменяет окончательный ответ.

Пример: tC = matlab.tall.reduce(@numel,@sum,tX,tY) находит число элементов в каждом блоке, и затем это суммирует результаты считать общее количество элементов.

Типы данных: function_handle

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

Прототип выходных массивов, заданных как массивы. Когда вы задаете 'OutputsLike', выходные массивы, tA,tB,..., возвращенный matlab.tall.reduce, имеет совпадающие типы данных и атрибуты как заданные массивы {PA,PB,...}.

Пример: tA = matlab.tall.reduce(fcn,reducefcn,tX,'OutputsLike',{int8(1)});, где tX является длинным массивом двойной точности, возвращает tA как int8 вместо double.

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

свернуть все

Выходные массивы, возвращенные как скаляры, векторы, матрицы или многомерные массивы. Если какой-либо вход к matlab.tall.reduce высок, то все выходные аргументы также высоки. В противном случае всеми выходными аргументами являются массивы в оперативной памяти.

Размер и тип данных выходных массивов зависят от заданных функций fcn и reducefcn. В целом выходные параметры tA,tB,... должны все иметь совпадающий тип данных как первый вход tX. Однако можно задать 'OutputsLike', чтобы возвратить различные типы данных. Выходные массивы tA,tB,... у всех есть та же высота.

Больше о

свернуть все

Блоки длинного массива

Когда вы создаете длинный массив из datastore, базовый datastore упрощает перемещение данных во время вычисления. Перемещения данных в дискретных частях вызвали блоки или фрагменты, где каждый блок является набором последовательных строк, которые могут уместиться в памяти. Например, одним блоком 2D массива (такого как таблица) является X(n:m,:) для некоторых индексов n и m. Размер каждого блока основан на значении свойства ReadSize datastore, но блок не может быть точно тем размером. В целях matlab.tall.reduce длинный массив считается вертикальной конкатенацией многих таких блоков:

Например, если вы используете функцию sum в качестве функции преобразования, промежуточным результатом является сумма на блок. Поэтому вместо того, чтобы возвратить одно скалярное значение за сумму элементов, результатом является вектор с длиной, равной количеству блоков.

ds = tabularTextDatastore('airlinesmall.csv','TreatAsMissing','NA');
ds.SelectedVariableNames = {'ArrDelay' 'DepDelay'};
tt = tall(ds);
tX = tt.ArrDelay;

f = @(x) sum(x,'omitnan');
s = matlab.tall.reduce(f, @(x) x, tX);
s = gather(s)
s =

      140467
      101065
      164355
      135920
      111182
      186274
       21321

Введенный в R2018b