Нет, вы все делаете правильно.
A(some_logical_index,:)
- это обычный и AFAIK самый быстрый способ подмножества строк в table
. A.col1 == i
создает логический индекс, и, поскольку вы применяете функцию отдельно для каждой из этих групп, разумно делать это по одному. Или, если ваши группы основаны на наборе ключей, ismember(A.col1, x)
, где x
- возможно, не скалярный массив, является обычным и, вероятно, самым быстрым способом сделать это, а также создает логический индекс.
Есть также функция groupsummary
, предоставляемая Matlab, которая является «векторизованной» версией этого цикла, который вы делаете: она группирует таблицу по значениям столбцов и применяет предоставленную функцию к группам для получения выходных данных. Это может быть более краткий способ выразить то, что вы здесь делаете. В теории это может быть быстрее, потому что Matlab может ускорить его, используя внутреннюю резьбу. Но на практике, в моем тестировании, groupsummary
работает так же быстро, как обычный цикл M-кода над группами. Возможно, вы захотите это сделать в случае, если Matlab ускорит это в будущем, но вы не увидите выигрыша прямо сейчас (по состоянию на Matlab R2019b).
Если ваша таблица содержит однородные столбцы - все числовые иливсе строки или все объекты одного класса - вы можете ускорить это, преобразовав вашу таблицу в простую матрицу типа числовой, ячейки или строки. Это позволило бы избежать издержек класса table
.
Вы можете получить небольшое ускорение, "проецируя" любые столбцы в A
, которые фактически не используются в вычислении FancyFunction
: подмножествомассив A
по столбцам только для тех столбцов, которые необходимы для FancyFunction
;таким образом, вы не тратите время и память на подмножество ненужных столбцов.