Ускорение фильтрации таблиц в Matlab - PullRequest
2 голосов
/ 22 декабря 2019

Пусть A будет таблицей в Matlab. Есть ли быстрый способ доступа к подмножествам этой таблицы? Произнесите все записи, для которых определенный столбец содержит числа в диапазоне или около того. Проблема в том, что A очень большой, и я очень часто оцениваю A(A.col1 == i,:).

Затем я использую следующий упрощенный код для

B = zeros(1,N);
for i=1:N
     temp = A(A.col1 == i,:);      % this line is evaluated often and takes a lot of time since A is big table
     B(i) = FancyFunction(temp);
end

Итак, есть ли быстрая альтернатива A(A.col1 == i,:) или A(ismember(A.col1,x),:)?

1 Ответ

1 голос
/ 22 декабря 2019

Нет, вы все делаете правильно.

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;таким образом, вы не тратите время и память на подмножество ненужных столбцов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...