2013-04-24 112 views
5

我有大型稀疏邻接矩阵与约1M节点,我正在处理与MATLAB。我想尽可能有效地将这些矩阵转换成网络边缘清单。作为一个例子邻接矩阵来说明这一点:在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 

是否有修改加快速度?另一个可以执行得更好的功能或工具箱?

+0

你是否分析了你的代码?使用探查器查看它缓慢行动的位置。这将有助于给你提供线索。 – John 2013-04-24 16:55:25

回答

10

您可以使用find()

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

注意MATLAB指数从1不是0,但你可以通过简单地edges-1变基。