2013-04-24 107 views
5

Tôi có ma trận chênh lệch thưa thớt lớn với khoảng các nút 1M, mà tôi đang xử lý với MATLAB. Tôi muốn chuyển đổi các ma trận này thành danh sách cạnh mạng càng hiệu quả càng tốt. Là một ma trận dụ kề để minh họa điều này:Cách hiệu quả để chuyển đổi ma trận kề kề lớn sang các danh sách cạnh trong MATLAB?

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

Và đầu ra tôi gọi một mạng danh sách cạnh ở đây là:

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

Mã này mà tôi phải làm điều đó quầy hàng cho thời gian.

 
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 

Có sửa đổi để tăng tốc độ này không? Một hàm hoặc hộp công cụ khác có thể hoạt động tốt hơn?

+0

Bạn đã cấu hình mã của mình chưa? Sử dụng profiler để xem nó diễn xuất từ ​​từ ở đâu. Điều đó sẽ giúp cung cấp cho bạn manh mối. – John

Trả lời

10

Bạn có thể sử dụng find():

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

Lưu ý rằng chỉ số MATLAB từ 1 không phải là 0, nhưng bạn có thể rebase bằng cách đơn giản edges-1.

Các vấn đề liên quan