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

标签 matlab optimization matrix graph-theory adjacency-matrix

我有大型稀疏邻接矩阵,其中有大约 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/

相关文章:

matlab - plsregress - 谁能解释特征的标准化?

c++ - 另一个线程是否可以通过其地址访问本地函数\此优化是否有效\我是否遗漏了一些重要的东西?

javascript - *this* 相对于 event.target 的优势

Ruby:条件矩阵?有多个条件的情况?

matlab - MATLAB Curve Fitting Toolbox 的输出与生成的函数不匹配

c - Matlab 2013b 生成的代码在 mex 中生成 Undefined symbols for architecture x86_64 错误

c++ - 如何使用 glm::mat4 手动正确编写旋转矩阵?

r - 过滤逻辑和对称矩阵

arrays - 保留每列的 n 个最大值,并在 MATLAB 中将其余值设置为零,无需循环

c# - 寻找信息以提高代码速度