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

时间:2017-03-23 06:58:22

标签: matlab merge cluster-analysis

对于以下典型案例:

n = 1000000;
r = randi(n,n,2);

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

我正在寻找一个 CPU和内存有效的解决方案来根据任何常见项目(这里是整数)合并行。可以使用 here 获取Python中的示例代码列表,并可以快速尝试将其转换为Matlab here

在我的尝试中他们需要花费很长时间(几分钟到几小时),所以我赞成找到更快的解决方案。

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

{
[1 90 34 67 ... 9]
[35 89]
[45000 23 828 130 8999 45326 ... 11]
...
}

另请注意,我尝试编译为 mex 但由于Matlab-Coder中不支持单元格而失败。

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

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

1 个答案:

答案 0 :(得分:0)

你需要一个索引。

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

但是Python很慢。使用例如,您可以获得10倍的加速Cython用于翻译和优化C中的代码。避免使用list int等Python数据类型,因为它们非常占用内存。 numpy具有内存有效的整数数组。

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

最棘手的部分是当a和b都存在时处理这种情况,但是是不同的大组。如果还不够快,可以在这里进行一些简洁的优化。

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