Табличные переменные Matlab: скорость? Использовать в ключах соединения? - PullRequest
0 голосов
/ 17 сентября 2018

Я окунулся в пул категориальных переменных Matlab в контексте таблиц Matlab.На самом деле, я мог заблудиться на этой территории в прошлом, но если это так, то это было бы относительно поверхностно.

В наши дни я хочу использовать шаблоны кода Matlab, чтобы делать то, что я обычно делал быв MS Access, например, различные типы объединений и фильтрации.Большая часть моих данных является категориальной, и я прочитал о преимуществах использования категориальных переменных в таблицах.Тем не менее, они в основном сосредоточены вокруг описательности (по сравнению с перечисленными типами) и эффективности памяти.Я не сталкивался с упоминанием скорости.Имеют ли категориальные переменные преимущество в скорости?

Мне также интересно, насколько целесообразно использовать категориальные переменные при выполнении различных типов объединений.Категориальные переменные будут занимать разные таблицы, поэтому мне не ясно, как устанавливается эквивалентность значений, если такие переменные участвуют в предложении SQL ON (которое Matlab называет параметром keys).

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

Если кто-то может указать на онлайнруководство, я был бы признателен.

1 Ответ

0 голосов
/ 17 сентября 2018

Только частичный ответ ....

Следующий тест показывает, что сжатые данные ведут себя разумно при использовании в качестве ключей объединения:

BigList = {'dog' 'cat' 'mouse' 'horse' 'rat'}'
SmallList = BigList( 1 : end-2 )

Nrows = 20;

% Create tables for innerjoin using strings

tBig = table( ...
    (1:Nrows)' , ...
    BigList( ceil( length(BigList) * rand( Nrows , 1 ) ) ) , ...
    'VariableNames' , {'B_ID' 'Animal'} )

tSmall = table( ...
    (1:Nrows)' , ...
    SmallList( ceil( length(SmallList) * rand( Nrows , 1 ) ) ) , ...
    'VariableNames' , {'S_ID' 'Animal'} )

tBigSmall = innerjoin( tBig , tSmall , 'Keys','Animal' );
tBig = sortrows( tBig , {'Animal','B_ID'} );
tSmall = sortrows( tSmall, {'Animal','S_ID'} );
tBigSmall = sortrows( tBigSmall, {'Animal' 'B_ID' 'S_ID'} );

% Now innerjoin the same tables using categorized strings

tcBig = tBig;
tcBig.cAnimal = categorical( tcBig.Animal );
tcBig.Animal = [];

tcSmall = tSmall;
tcSmall.cAnimal = categorical( tcSmall.Animal );
tcSmall.Animal = [];

tcBigSmall = innerjoin( tcBig , tcSmall , 'Keys','cAnimal' );
tcBig = sortrows( tcBig , {'cAnimal','B_ID'} );
tcSmall = sortrows( tcSmall, {'cAnimal','S_ID'} );
tcBigSmall = sortrows( tcBigSmall, {'cAnimal' 'B_ID' 'S_ID'} );

% Check if the join results are the same

if all( tBigSmall.Animal == tcBigSmall.cAnimal )
    disp('categorical vs string key: inner joins MATCH.')
else
    disp('categorical vs string key: inner joins DO NOT MATCH.')
end % if

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

В любом случае, я считаю, что ответы на оба вопроса будут лучше задокументированы.

...