2013-04-24 31 views
5

Ben büyük seyrek bitişiklik matrisleri ben MATLAB ile işliyorum etrafında 1M düğümler ile var. Bu matrisleri ağ kenarı listelerine mümkün olduğunca verimli şekilde dönüştürmek istiyorum. Bu gösteren bir örnek komşuluk matrisi gibi:MATLAB'da büyük bitişik matrisleri kenar listelerine dönüştürmenin etkili yolu?

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

Ben zamandır tezgahları yapmak zorunda Bu kod:

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

Ve çıkış Ben burada bir ağ kenar listesi diyoruz.

 
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 

Bunu hızlandırmak için bir değişiklik var mı? Daha iyi performans gösterebilen başka bir işlev veya araç kutusu?

+0

Kodunuzu hiç profilinize eklediniz mi? Nerede yavaş hareket ettiğini görmek için profiler kullanın. Bu size ipuçları vermede yardımcı olacaktır. – John

cevap

10

Sen find() kullanabilirsiniz: MATLAB indeksleri 1 0 değil, fakat sadece edges-1 tarafından rebase bu

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

Not.