Matlab分类表变量:速度?在连接键中使用?

Matlab分类表变量:速度?在连接键中使用?,matlab,performance,join,categorical-data,matlab-table,Matlab,Performance,Join,Categorical Data,Matlab Table,在Matlab表格的上下文中,我深入了解了Matlab的分类变量池。事实上,我可能在过去漫游过该领域,但如果是这样,那将是一种相对肤浅的方式 这些天,我想用Matlab代码模式来做我在MS Access中通常会做的事情,例如,各种类型的连接和过滤。我的大部分数据都是分类的,我已经阅读了在表中使用分类变量的优点。然而,它们主要集中在描述性(过度枚举的类型)和内存效率上。我没有遇到过提到速度的事。分类变量是否具有速度优势 我还想知道在进行各种类型的连接时使用分类变量有多明智。分类变量将占用不同的表,

在Matlab表格的上下文中,我深入了解了Matlab的分类变量池。事实上,我可能在过去漫游过该领域,但如果是这样,那将是一种相对肤浅的方式

这些天,我想用Matlab代码模式来做我在MS Access中通常会做的事情,例如,各种类型的连接和过滤。我的大部分数据都是分类的,我已经阅读了在表中使用分类变量的优点。然而,它们主要集中在描述性(过度枚举的类型)和内存效率上。我没有遇到过提到速度的事。分类变量是否具有速度优势

我还想知道在进行各种类型的连接时使用分类变量有多明智。分类变量将占用不同的表,因此我不清楚如果SQL
ON
子句(Matlab将其称为
keys
参数)中涉及此类变量,如何建立值的等价性

由于缺乏相关的谷歌点击量,我似乎进入了一个新的领域,这对我来说是一件可怕的事情。缺少最佳实践的文档,以及由此产生的对尝试/错误和逆向工程的需求,需要花费比我所能投入的更多的时间,因此我将遗憾地恢复使用字符串


如果有人能指出在线指导信息,我将不胜感激。

仅提供部分答案

以下测试表明,catgorized数据在用作连接键时表现良好:

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
所以现在唯一的问题是速度。这是一个一般性的问题,不仅仅针对连接,所以我不确定什么是好的测试。有许多可能性,例如表行数、类别数、是联接还是筛选等


在任何情况下,我相信这两个问题的答案都会有更好的记录。

您可能对此感兴趣:谢谢,EBH。这是一个更一般的问题,我觉得读起来很有趣。我认识到有很多方法可以对RIG字段查找进行评审,但是我认识到需要权衡使用内置数据类型的权衡(我认为“表”是内置的,因为我不需要构建任何东西)。一些权衡包括必须使用映射将熟悉的名称转换为列索引,以及统一类型2D数组的限制。如果修改列,还需要记住簿记更新列索引的查找表。我以上述方式提出此问题而不是讨论解决方法的部分原因是,我希望避免后者使用更复杂的代码。但我也想知道两个分类变量之间的等价性是如何识别的,例如,如果一个表中的一列的值为“cat”、“dog”、“mouse”,而另一个表中的一列的值为“dog”、“horse”、“whale”。前者中的“狗”是否等同于后者中的“狗”?这决定了表连接和查找的行为。与类别的直接整数枚举相比,使用更可读的类别变量会有速度损失吗?最后一个问题的相关性超出了表联接/查找的范围,但上面的问题也是如此。我认为,在深入了解分类变量之前,对分类变量的新手必须对分类变量进行表征,这并不好。我希望这一描述能为我们决定花时间去了解分类变量提供信息。我不知道你为什么会担心这些事情。是的,int要比范畴aray快,因为(1)int是本机类型,而另一个是用户类,(2)在比较值之前,总是要比较所涉及的类别。这些值首先需要映射到一组公共类别。但这两件事都不会影响大多数用户的选择。选择使代码最具可读性和可维护性的语法。这比执行时间上的任何微小差异都要重要。如果你关心速度,使用C++。我想添加到这一点上,如果两个字段的类别的基础排序相同,则只能加入序号分类字段(例如,代码>分类(…,‘序号’,true)< /代码>)。