Сокращение массивов путем применения алгоритма сокращения к блокам данных
задает несколько массивов 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 для подсчета общего количества не-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 переменные, чтобы найти общую среднюю задержку для каждого рейса. Функция определяет количество уникальных лет в каждой порции данных, а затем циклически проходит каждый год и вычисляет среднюю общую задержку для рейсов в этом году. Результатом является таблица с двумя переменными, содержащая год и среднее значение общей задержки. Эти промежуточные данные необходимо дополнительно сократить, чтобы получить среднюю задержку в год. Сохранить эту функцию в текущей папке как transform_fcn.m.
type transform_fcnfunction 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_fcnfunction 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 mySplitFcnfunction 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 для работы с функциональностью, которая еще не поддерживается массивами tall.
Создайте два высоких вектора случайных данных. 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.mfunction [A,B] = identityTransform(X,Y) A = X; B = Y; end
Затем запишите функцию уменьшения, которая работает на блоках высоких векторов, чтобы вычислить взвешенную дисперсию и стандартное отклонение.
type weightedStats.mfunction [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 nonsingleton в высоком измерении, то первый набор блоков может быть 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, ...] для этого индекса происходит от того же индекса в первом измерении.
Аргументы вывода - все выходы [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,... все имеют одинаковую высоту.
При создании массива высокого уровня из хранилища данных нижележащее хранилище данных облегчает перемещение данных во время вычисления. Данные перемещаются в дискретных фрагментах, называемых блоками или порциями, где каждый блок представляет собой набор последовательных строк, которые могут поместиться в памяти. Например, один блок массива 2-D (например, таблица) X(n:m,:), для некоторых подстрочных индексов n и m. Размер каждого блока основан на значении ReadSize свойство хранилища данных, но блок может иметь не такой размер. Для целей 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. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.