matlab.tall.reduce

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

Описание

пример

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.5 sec
Evaluation completed in 1.7 sec
s = 123523

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

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

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

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

function bx = sumcount(tx,ty)
  bx = [sum(tx) numel(tx) sum(ty) numel(ty)];
end

На этапе сокращения алгоритма необходимо добавить вместе все промежуточные суммы и количества. Таким образом, matlab.tall.reduce возвращает полную сумму элементов и числа элементов для каждого входного вектора, и вычисление среднего значения является затем простым делением. Для этого шага можно применить sum функционируйте к первой размерности векторных выходных параметров 1 на 4 от первой стадии.

 reducefcn = @(x) sum(x,1);
 s = matlab.tall.reduce(@sumcount,reducefcn,tX,tY)
s =

  MxNx... tall double array

    ?    ?    ?    ...
    ?    ?    ?    ...
    ?    ?    ?    ...
    :    :    :
    :    :    :
 s = gather(s)
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 1.8 sec
Evaluation completed in 2.1 sec
s = 1×4

      860584      120866      982764      120866

Первые два элемента s сумма и значит tX, и вторые два элемента являются суммой и значат tY. Деление сумм и количеств дает к средним значениям, которые можно сравнить с ответом, данным mean функция.

 my_mean = [s(1)/s(2) s(3)/s(4)]
my_mean = 1×2

    7.1201    8.1310

 m = gather(mean([tX tY]))
Evaluating tall expression using the Local MATLAB Session:
- Pass 1 of 1: Completed in 0.76 sec
Evaluation completed in 0.99 sec
m = 1×2

    7.1201    8.1310

Локальные функции

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

function bx = sumcount(tx,ty)
  bx = [sum(tx) numel(tx) sum(ty) numel(ty)];
end

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

Составьте длинную таблицу для 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.1 sec
Evaluation completed in 1.3 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.48 sec
- Pass 2 of 2: Completed in 1.2 sec
Evaluation completed in 2.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 =

  MxNx... tall double array

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


tX_std_weighted =

  MxNx... tall double array

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

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

свернуть все

Преобразуйте функцию, чтобы применяться в виде указателя на функцию или анонимной функции. Каждый выход 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, prod, max, и так далее. Эти функции могут работать над промежуточными результатами, приведенными fcn и возвратите один скаляр. Эти функции имеют свойства, что порядок, в котором конкатенации происходят и число раз операция сокращения, применяется, не изменяют окончательный ответ. Некоторые функции, такой как mean и var, должен обычно избегаться, когда сокращение функционирует, потому что число раз, операция сокращения применяется, может изменить окончательный ответ.

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

Типы данных: 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