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]
...