exponenta event banner

matlab.tall.transform

Преобразовать массив, применив дескриптор функции к блокам данных

Описание

пример

tA = matlab.tall.transform(fcn,tX) применяет дескриптор функции fcn каждому блоку массива tX и возвращает преобразованный массив, tA.

пример

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

пример

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

пример

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

Примеры

свернуть все

Использовать matlab.tall.transform построение высокого массива нулей с атрибутами, аналогичными другому массиву.

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

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

  Mx1 tall double column vector

     8
     8
    21
    13
     4
    59
     3
    11
    :
    :

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

zerosLike = @(in) zeros(size(in),'like',in);

Использовать matlab.tall.transform для применения zerosLike функция к вектору задержек поступления. Результатом является высокий вектор одинакового размера, но значения которого равны нулю.

s = matlab.tall.transform(zerosLike, tX)
s =

  Mx1 tall double column vector

     0
     0
     0
     0
     0
     0
     0
     0
     :
     :

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

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

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

meanDelay функция объединяет входные векторы в матрицу, суммирует значения в каждой строке (игнорируя NaNs), а затем вычисляет среднее значение. Отображение содержимого этого файла функций.

type meanDelay
function D = meanDelay(a,b)
X = [a b];
Y = sum(X,2,'omitnan');
D = mean(Y);
end

Использовать matlab.tall.transform для применения meanDelay для каждого блока данных в tX и tY. Результатом является средняя общая задержка в каждом блоке данных.

d = matlab.tall.transform(@meanDelay, tX, tY)
d =

  7x1 tall double column vector

   14.0621
   11.1639
   17.2311
   15.1852
   12.5860
   19.8596
   14.4036

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

Найдите максимальное значение и индекс этого значения в каждой строке данных.

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

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

maxDelay функция объединяет входные векторы, а затем находит максимальную длительность задержки поступления или отправления и индекс столбца. Отображение содержимого этого файла.

type maxDelay
function [M,I] = maxDelay(A,B)
X = [A B];
[M,I] = max(X,[],2);
end

Использовать matlab.tall.transform для применения maxDelay для каждого блока данных в tX и tY. Результатом является максимальная задержка поступления или отправления для каждой строки данных, а также вектор индекса, указывающий, из какого столбца получено максимальное значение. Индекс 1 указывает, что задержка поступления в этой строке больше, а индекс 2 указывает, что задержка отправления больше.

[M, idx] = matlab.tall.transform(@maxDelay, tX, tY)
M =

  Mx1 tall double column vector

    12
     8
    21
    13
     4
    63
     3
    11
    :
    :


idx =

  Mx1 tall double column vector

     2
     1
     1
     1
     1
     2
     1
     1
     :
     :

Используйте 'OutputsLike' для возврата таблицы из matlab.tall.transform с переменными, отличными от входной таблицы.

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

T = tall(table(rand(1e6,1),rand(1e6,1)))
T =

  1,000,000x2 tall table

     Var1       Var2  
    _______    _______

    0.81472    0.90399
    0.90579    0.94095
    0.12699    0.80252
    0.91338    0.24205
    0.63236    0.97566
    0.09754    0.31723
     0.2785    0.81279
    0.54688    0.69743
       :          :
       :          :

Функция tableDiff вычисляет разницу между двумя переменными входной таблицы и добавляет результат как новую переменную в таблицу. Отображение содержимого файла.

type tableDiff
function Tout = tableDiff(Tin)
d = Tin.Var2 - Tin.Var1;
Tin.Var3 = abs(d);
Tout = Tin;
end

Использовать matlab.tall.transform для применения tableDiff для каждого блока данных в T. Поскольку выходная таблица имеет переменные, отличные от входной таблицы, используйте 'OutputsLike' пара имя-значение для предоставления таблицы прототипа с теми же переменными, что и на выходе (три переменные с именами по умолчанию Var1, Var2, и Var3).

Z = matlab.tall.transform(@tableDiff, T, 'OutputsLike', {table(1,1,1)})
Z =

  Mx3 tall table

     Var1       Var2        Var3  
    _______    _______    ________

    0.81472    0.90399    0.089267
    0.90579    0.94095    0.035156
    0.12699    0.80252     0.67553
    0.91338    0.24205     0.67133
    0.63236    0.97566      0.3433
    0.09754    0.31723     0.21969
     0.2785    0.81279     0.53429
    0.54688    0.69743     0.15054
       :          :          :
       :          :          :

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

свернуть все

Применяемая функция преобразования, заданная как дескриптор функции или анонимная функция. Каждый выход 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 nonsingleton в высоком измерении, то первый набор блоков может быть 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,tB] = matlab.tall.transform(@sqInputs,tX,tY)

Пример: tA = matlab.tall.transform(@(x) x .* 2, tX) задает анонимную функцию для умножения значений в tX на 2.

Пример: tC = matlab.tall.transform(@plus,tX,tY) задает дескриптор функции @plus для добавления двух массивов вместе.

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

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

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

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

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

свернуть все

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

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

Подробнее

свернуть все

Блоки массива высокого уровня

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

Например, при использовании 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.transform(f, tX);
s = gather(s)
s =

      140467
      101065
      164355
      135920
      111182
      186274
       21321

Представлен в R2018b