在MATLAB中将大邻接矩阵转换为边缘列表的有效方法?

Vas*_*ass 5 optimization matlab graph-theory matrix adjacency-matrix

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

adj =
     1     0     1     0
     0     0     1     1
     0     0     1     0
     0     1     0     0

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

>> adj2edgeList_Alex(adj)
ans =
     0     0
     0     2
     1     2
     1     3
     2     2
     3     1

我必须这样做的代码停留了一段时间.

function edge_list = adj2edgeList_Alex(graph)

edge_num = length(logical(graph > 0));
edge_list = zeros(edge_num,2);
row_ind = 1;
for ii=1:size(graph,2)
    ind_temp = find(graph(ii,:)==1);
    if(isempty(ind_temp) == 0)
        ind_temp = ind_temp - 1;
        edges_iter = length(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 + edges_iter;
    end
end

是否有修改加速这个?另一个可以表现更好的功能或工具箱?

Ole*_*leg 10

你可以使用find():

[r,c] = find(adj)
edges = [r,c];
Run Code Online (Sandbox Code Playgroud)

请注意,MATLAB从1开始索引而不是0,但您可以简单地进行rebase edges-1.