Matlab 合并大型矩阵的CPU和内存友好型解决方案

Matlab 合并大型矩阵的CPU和内存友好型解决方案,matlab,merge,cluster-analysis,Matlab,Merge,Cluster Analysis,对于以下典型情况: n = 1000000; r = randi(n,n,2); (假设所有行之间有0.05%的公共数字;n甚至可能是数千万) 我正在寻找一个CPU和内存效率高的解决方案来基于任何公共项(这里是整数)合并行。Python中的示例代码列表可用,可以快速尝试将其翻译成Matlab 在我的尝试中,它们需要很长时间(几分钟到几小时),因此我赞成找到更快的解决方案 对于上面的示例,典型的输出应该是(单元格): 还请注意,我曾尝试编译为mex,但由于Matlab编码器中不支持cell,所以

对于以下典型情况:

n = 1000000;
r = randi(n,n,2);
(假设所有行之间有0.05%的公共数字;
n
甚至可能是数千万)

我正在寻找一个CPU和内存效率高的解决方案来基于任何公共项(这里是整数)合并行。Python中的示例代码列表可用,可以快速尝试将其翻译成Matlab

在我的尝试中,它们需要很长时间(几分钟到几小时),因此我赞成找到更快的解决方案

对于上面的示例,典型的输出应该是(单元格):

还请注意,我曾尝试编译为mex,但由于Matlab编码器中不支持cell,所以编译失败

编辑:一个小小的演示示例

%---------------------------------------
clc
n = 100;
r = randi(n,n,2);        % random integers in [1,n], size(n,2)
%---------------------------------------
>> r
r =
    82    17             % (1) 82 17
    91    13             % (2) 91 13
    13    32             % (3) 91 13 32            merged with (2), common 13
    82    53             % (4) 82 17 53            merged with (1), common 82
    64    17             % (5) 82 17 53 64         merged with (4), common 17
    ...
    94    45
    13    31             % (77) 91 13 32 31        merged with (3), common 13
    57    51
    47    52
     2    13             % (80) 91 13 32 31 2      merged with (77), common 13
    34    80
%---------------------------------------
c = merge(r);            % cpu and memory friendly solution is searched for.
%---------------------------------------
c =
    [82 17 53 64]
    [91 13 32 31 2]
    ...
你需要一个索引

在Python中,使用dict。在MATLAB中-我不会使用MATLAB,因为开源是未来,MATLAB正在消亡

但是Python相当慢。通过使用例如Cython来翻译和优化C语言中的代码,您可能会获得10倍的加速。避免使用Python数据类型,例如
int
list
,因为它们非常占用内存。numpy具有内存效率高的整数数组

如果您得到一个新的对(a,b),您可以使用此字典查找要合并的现有项。然后在合并后更新dict。 实际上,对于整数,应该使用数组而不是dict

最棘手的部分是当a和b都存在,但都是大的不同群体时的处理。如果还不够快的话,这里可能有一些简洁的优化

它不是群集,而是连接的组件。

您需要一个索引

在Python中,使用dict。在MATLAB中-我不会使用MATLAB,因为开源是未来,MATLAB正在消亡

但是Python相当慢。通过使用例如Cython来翻译和优化C语言中的代码,您可能会获得10倍的加速。避免使用Python数据类型,例如
int
list
,因为它们非常占用内存。numpy具有内存效率高的整数数组

如果您得到一个新的对(a,b),您可以使用此字典查找要合并的现有项。然后在合并后更新dict。 实际上,对于整数,应该使用数组而不是dict

最棘手的部分是当a和b都存在,但都是大的不同群体时的处理。如果还不够快的话,这里可能有一些简洁的优化


这不是群集,而是连接的组件。

您需要定义“合并”在这里的含义。或者给出生成该示例的确切输入output@LuisMendo在新添加的演示中,针对给定数据显示了产品。因此,问题变得非常清楚。注意演示代码中的注释。我明白了。有趣的问题,但你们在无向图中搜索连接的组件。如果您有2015b或更高版本,您可以试试,但我不知道它有多快。@Bicker我看到了,不幸的是它是Matlab的较低版本,似乎没有可用的
图形
工具箱或
conncomp
函数。因此,如果有人能够用
conncomp
的纯Matlab实现来回答这个问题,那就太好了,这样就不需要任何其他第三方或其他许可证。您需要定义“合并”在这里的含义。或者给出生成该示例的确切输入output@LuisMendo在新添加的演示中,针对给定数据显示了产品。因此,问题变得非常清楚。注意演示代码中的注释。我明白了。有趣的问题,但你们在无向图中搜索连接的组件。如果您有2015b或更高版本,您可以试试,但我不知道它有多快。@Bicker我看到了,不幸的是它是Matlab的较低版本,似乎没有可用的
图形
工具箱或
conncomp
函数。因此,如果有人能用
conncomp
的纯Matlab实现来回答这个问题,那就太好了,这样就不需要任何其他第三方或其他许可证。关于开源部分,您可能是正确的。但是,这是一个在Matlab中实现所述问题的解决方案时需要提示、指导或经验的问题。我很想看到连接组件的纯Matlab或Python(因此我可以将其翻译成Matlab)实现。我可能必须深入研究
scipy.sparse.csgraph.connected_组件
,看看是否有简单的实现。简单往往与“CPU和内存效率”相矛盾.关于开源部分,你可能是对的。但是,这是一个在Matlab中实现所述问题的解决方案时需要提示、指导或经验的问题。我很想看到连接组件的纯Matlab或Python(因此我可以将其翻译成Matlab)实现。我可能必须深入研究
scipy.sparse.csgraph.connected_组件
,看看是否有简单的实现。简单往往与“CPU和内存效率”相矛盾。
%---------------------------------------
clc
n = 100;
r = randi(n,n,2);        % random integers in [1,n], size(n,2)
%---------------------------------------
>> r
r =
    82    17             % (1) 82 17
    91    13             % (2) 91 13
    13    32             % (3) 91 13 32            merged with (2), common 13
    82    53             % (4) 82 17 53            merged with (1), common 82
    64    17             % (5) 82 17 53 64         merged with (4), common 17
    ...
    94    45
    13    31             % (77) 91 13 32 31        merged with (3), common 13
    57    51
    47    52
     2    13             % (80) 91 13 32 31 2      merged with (77), common 13
    34    80
%---------------------------------------
c = merge(r);            % cpu and memory friendly solution is searched for.
%---------------------------------------
c =
    [82 17 53 64]
    [91 13 32 31 2]
    ...