我有大型稀疏邻接矩阵,其中有大约 1M 个节点,我正在使用 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
是否有修改以加快速度?另一个性能更好的函数或工具箱?
最佳答案
你可以使用find()
:
[r,c] = find(adj)
edges = [r,c];
请注意,MATLAB 索引从 1 而不是 0,但您可以简单地通过 edges-1
进行 rebase 。
关于matlab - 在 MATLAB 中将大型邻接矩阵转换为边列表的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16197457/