2015-07-29 3 views
2

, если у меня есть следующий код в MATLABПреобразовать список краев для матрицы смежности

function adj=edgeL2adj(el) 
nodes=sort(unique([el(:,1) el(:,2)])); % get all nodes, sorted 
adj=zeros(numel(nodes)); % initialize adjacency matrix 
% across all edges 
for i=1:size(el,1);adj(find(nodes==el(i,1)),find(nodes==el(i,2)))=el(i,3); 
end 

преобразующий список краев m x 3 в список смежности n x n, но у меня есть матрица списка края m x 2 так, что требуемое изменение в предыдущем код, который дает мне истинный результат.

пример:

if edge list =[1 2;2 3;2 4] then adjacency matrix=[0 1 0 0;0 0 1 1;0 0 0 0; 0 0 0 0] 

ответ

3

Я бы лично прочь с вашим кодом цикла и воспользоваться sparse затем преобразовать обратно в full матрицу, если это необходимо. Первый столбец состоит из исходного узла, а второй столбец состоит из целевого узла. Вы просто устанавливаете все эти записи в разреженной матрице равными 1. Однако, судя по вашему коду, третий столбец вашего списка краев также является соответствующим весом, поэтому я напишу код, который будет принимать оба случая. Кроме того, убедитесь, что вы отфильтровать повторяющиеся строки с помощью unique:

Пример с весами просто быть 1

edgelist = [1 2;2 3;2 4]; 
edgelist = unique(edgelist, 'rows'); 
sz = max(edgelist(:)); 
A = sparse(edgelist(:,1), edgelist(:,2), 1, sz, sz); 

Первая строка кода обозначает список края, где каждая пара строка состоит из двух узлов инцидента друг с другом (т. е. связаны ребром). Вторая строка удаляет любые повторяющиеся строки из списка краев. Третья строка определяет, насколько велика должна быть матрица смежности. Нам нужно выяснить, что такое самый большой идентификатор узла, чтобы мы могли выделить разреженную матрицу N x N, где N - самый большой идентификатор узла. Последняя строка кода просто использует первый столбец и второй столбец списка ребер для заполнения записей в разреженной матрице, мы устанавливаем их в одну и гарантируем, что размер матрицы равен N x N.

Мы получаем это:

>> A 

A = 

    (1,2)  1 
    (2,3)  1 
    (2,4)  1 

При желании вы можете преобразовать матрицу в полном объеме с использованием функции full:

>> full(A) 

ans = 

    0  1  0  0 
    0  0  1  1 
    0  0  0  0 
    0  0  0  0 

Как вы можете видеть, это соответствует вашему желаемому результату.

Пример с весами в третьей колонке

edgelist = [1 2 0.1;2 3 0.2;2 4 0.3]; 
edgelist = unique(edgelist, 'rows'); 
sz = max(max(edgelist(:, 1:2))); 
A = sparse(edgelist(:,1), edgelist(:,2), edgelist(:,3), sz, sz); 

тот же код, как и раньше, но вы изменяете третий параметр sparse с третьей колонке edgelist.

Это то, что мы получаем:

>> A 

A = 

    (1,2)  0.1000 
    (2,3)  0.2000 
    (2,4)  0.3000 

>> full(A) 

ans = 

     0 0.1000   0   0 
     0   0 0.2000 0.3000 
     0   0   0   0 
     0   0   0   0 
+0

@ChisholmKyle имеет комментарий для вас под их ответом. – beaker

-1

матрица смежности должен содержать только логические значения, чтобы указать ребро присутствует между вершинами. Я думаю, что эта функция предполагала, что третий столбец el - это все. В комментариях выясняется, что, возможно, они фактически являются весами. Функция также может быть упрощена. Вот измененный код:

function adj=edgeL2adj(el) 
    nodes=unique(el(:, 1:2)); % get all nodes, sorted 
    adj=zeros(numel(nodes)); % initialize adjacency matrix 
    % across all edges 
    for i=1:size(el,1) 
     adj(nodes==el(i,1),(nodes==el(i,2)))=1; 
     % if third column is weights, 
     % adj(nodes==el(i,1),(nodes==el(i,2)))=el(i, 3); 
    end 
+0

смежности матрицы часто используют значение для обозначения края веса; третий столбец 'el' в исходной задаче не обязательно был бы всем. – beaker

+0

А хорошо знать. Я не слишком хорошо знаком с графиками, вершинами и матрицами смежности. Спасибо за информацию. – ChisholmKyle

+0

У меня недостаточно комментариев, чтобы прокомментировать другие ответы, но, если вы видите это, исходная функция вызывает 'unique()', поэтому она предназначена для игнорирования повторяющихся вершин. Возможно, вы можете изменить свой код, чтобы поддерживать ту же функциональность, что и соответствующая функция? – ChisholmKyle

Смежные вопросы