Редуцируйте массивы путем применения алгоритма сокращения к блокам данных
задает несколько массивов 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
должен иметь ту же высоту.
Составьте длинную таблицу, извлеките высокий вектор из таблицы, и затем найдите общее количество элементов в векторе.
Составьте длинную таблицу для 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.6 sec Evaluation completed in 1.9 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 2.1 sec Evaluation completed in 2.4 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 1 sec Evaluation completed in 1.3 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.4 sec Evaluation completed in 1.5 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.46 sec - Pass 2 of 2: Completed in 1.2 sec Evaluation completed in 2.3 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
— Преобразуйте функцию, чтобы применятьсяПреобразуйте функцию, чтобы применяться в виде указателя на функцию или анонимной функции. Каждый выход fcn
должен быть тот же тип как первый вход tX
. Можно использовать 'OutputsLike'
опция, чтобы возвратить выходные параметры различных типов данных. Если fcn
возвращает больше, чем один выходной параметр, затем выходные параметры должны все иметь ту же высоту.
Общая функциональная подпись fcn
[a, b, c, ...] = fcn(x, y, z, ...)
fcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [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, ...]
состоит из всех данных в том длинном массиве.
Выходные аргументы Выходные параметры [a, b, c, ...]
блоки, которые умещаются в памяти, чтобы быть отправленными в соответствующие выходные параметры [tA, tB, tC, ...]
. Выходные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Весь [a, b, c, ...]
должен иметь тот же размер в первой размерности.
Весь [a, b, c, ...]
вертикально конкатенированы соответствующими результатами предыдущих вызовов fcn
.
Весь [a, b, c, ...]
отправляются в тот же индекс в первой размерности в их соответствующих целевых выходных массивах.
Функциональные правила — fcn
должен удовлетворить функциональному правилу:
F([inputs1; inputs2]) == [F(inputs1); F(inputs2)]
: Применение функции к конкатенации входных параметров должно совпасть с применением функции к входным параметрам отдельно и затем конкатенации результатов.
Пустые Входные параметры — Убедитесь, что 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
— Функция сокращения, чтобы применятьсяФункция сокращения, чтобы применяться в виде указателя на функцию или анонимной функции. Каждый выход reducefcn
должен быть тот же тип как первый вход tX
. Можно использовать 'OutputsLike'
опция, чтобы возвратить выходные параметры различных типов данных. Если reducefcn
возвращает больше, чем один выходной параметр, затем выходные параметры должны все иметь ту же высоту.
Общая функциональная подпись reducefcn
[rA, rB, rC, ...] = reducefcn(a, b, c, ...)
reducefcn
должен удовлетворить этим требованиям:
Входные параметры — входные параметры [a, b, c, ...]
блоки, которые умещаются в памяти. Блоками данных являются любой выходные параметры, возвращенные fcn
, или частично сокращенный выход из reducefcn
это управляется снова для дальнейшего сокращения. Входные параметры [a, b, c, ...]
удовлетворите этим свойствам:
Входные параметры [a, b, c, ...]
имейте тот же размер в первой размерности.
Для данного индекса в первой размерности, каждой строке блоков данных [a, b, c, ...]
или происходит из входа или происходит от того же предыдущего вызова до reducefcn
.
Для данного индекса в первой размерности, каждой строке входных параметров [a, b, c, ...]
поскольку тот индекс происходит из того же индекса в первой размерности.
Output Arguments — All выходные параметры [rA, rB, rC, ...]
должен иметь тот же размер в первой размерности. Кроме того, они должны быть вертикально объединены с соответствующими входными параметрами [a, b, c, ...]
допускать повторные сокращения при необходимости.
Функциональные правила — reducefcn
должен удовлетворить этим функциональным правилам (до ошибки округления):
F(input) == F(F(input))
: Применение функции неоднократно к тем же входным параметрам не должно изменять результат.
F([input1; input2]) == F([input2; input1])
: Результат не должен зависеть от порядка конкатенации.
F([input1; input2]) == F([F(input1); F(input2)])
: Применение функции однажды к конкатенации некоторых промежуточных результатов должно совпасть с применением его отдельно, конкатенацией и применением его снова.
Пустые Входные параметры — Убедитесь, что reducefcn
может обработать вход, который имеет высоту 0. Пустые входные параметры могут произойти, когда файл пуст или если вы сделали большую фильтрацию на данных. Для этого вызова все входные блоки являются пустыми массивами правильного типа и размера в размерностях вне первого.
Некоторыми примерами подходящих функций сокращения являются встроенные функции сокращения размерности такой как sum
, prod
, max
, и так далее. Эти функции могут работать над промежуточными результатами, приведенными fcn
и возвратите один скаляр. Эти функции имеют свойства, что порядок, в котором конкатенации происходят и число раз операция сокращения, применяется, не изменяют окончательный ответ. Некоторые функции, такой как mean
и var
, должен обычно избегаться, когда сокращение функционирует, потому что число раз, операция сокращения применяется, может изменить окончательный ответ.
Пример: tC = matlab.tall.reduce(@numel,@sum,tX)
находит число элементов в каждом блоке, и затем это суммирует результаты считать общее количество элементов.
Типы данных: function_handle
tX
, tY
— Входные массивыВходные массивы в виде скаляров, векторов, матриц или многомерных массивов. Входные массивы используются в качестве входных параметров к функции преобразования fcn
. Каждый входной массив tX,tY,...
должен иметь совместимые высоты. Два входных параметров имеют совместимую высоту, когда у них есть та же высота, или когда один вход имеет высоту один.
PA
, PB
— Прототип выходных массивовПрототип выходных массивов в виде массивов. Когда вы задаете 'OutputsLike'
, выходные массивы tA,tB,...
возвращенный matlab.tall.reduce
имейте совпадающие типы данных и атрибуты как заданные массивы {PA,PB,...}
.
Пример: tA = matlab.tall.reduce(fcn,reducefcn,tX,'OutputsLike',{int8(1)});
, где tX
длинный массив двойной точности, возвращает tA
как int8
вместо double
.
tA
, tB
— Выходные массивыВыходные массивы, возвращенные как скаляры, векторы, матрицы или многомерные массивы. Если любой вход к 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
У вас есть модифицированная версия этого примера. Вы хотите открыть этот пример со своими редактированиями?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.