5

我有大约1M 个节点的大型稀疏邻接矩阵,我正在使用MATLAB处理这些矩阵。我想尽可能高效地将这些矩阵转换为网络边缘列表。作为一个示例邻接矩阵来说明这一点:

调整 =
     1 0 1 0
     0 0 1 1
     0 0 1 0
     0 1 0 0

我在这里称为网络边缘列表的输出是:

>> adj2edgeList_Alex(adj)
答案=
     0 0
     0 2
     1 2
     1 3
     2 2
     3 1

我必须做的这段代码会拖延时间。

函数 edge_list = adj2edgeList_Alex(graph)

edge_num = 长度(逻辑(图 > 0));
edge_list = zeros(edge_num,2);
row_ind = 1;
对于 ii=1:size(graph,2)
    ind_temp = find(graph(ii,:)==1);
    if(isempty(ind_temp) == 0)
        ind_temp = ind_temp - 1;
        edge_iter = 长度(ind_temp);   
        node_num = ii - 1;
        edge_list(row_ind:row_ind+edges_iter-1,:) = ...
            [(node_num)*ones(1,edges_iter);ind_temp]';
            row_ind = row_ind + edge_iter;
    结尾
结尾

有没有修改来加快这个速度?另一个性能更好的功能或工具箱?

4

1 回答 1

10

您可以使用find()

[r,c] = find(adj)
edges = [r,c];

请注意,MATLAB 索引从 1 而不是 0,但您可以简单地通过edges-1.

于 2013-04-24T16:46:01.977 回答