Список смежности Matlab с матрицей смежности

Как преобразовать список смежности в матрицу смежности через matab

Например: Вот список смежности (ненаправленный), третий столбец — это вес.

1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7

++++++++++++++++++++++

который должен быть преобразован в:

   1  2  3  4  5  

1     0  4  5  0   
2  3     4  7  8  
3  4  7     0  0  
4  0  7  0     0  
5  0  8  0  0

person Jusleong    schedule 10.10.2013    source источник
comment
Почему диагональ не равна нулю? А если рассматривать ненаправленные связи, то матрица должна быть симметричной.   -  person Fraukje    schedule 10.10.2013
comment
Я переформатировал твою матрицу... ты этого добивался? Почему не симметрично?   -  person Dan    schedule 10.10.2013


Ответы (2)


Вы можете использовать матрицу sparse. Пусть rows будет первым столбцом, cols — вторым, а s — весом.

A = sparse([rows; cols],[cols; rows],[s; s]);

Если вы хотите увидеть матрицу. используйте full().

ОБНОВЛЕНИЕ:

Я сделал ответ немного проще (все в одну строку, вместо добавления транспонированного и включил пояснения, как и просили:

list = [1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7];

rows = list(:,1)
cols = list(:,2)
s = list(:,3)

Теперь rows, cols и s содержат необходимую информацию. Разреженные матрицы нуждаются в трех векторах. Каждая строка двух первых векторов, rows и cols, является индексом значения, заданного в той же строке s (что является весом).

Команда sparse присваивает значение s(k) матричному элементу adj_mat(rows(k),cols(k)).

Поскольку матрица смежности симметрична, A(row,col) = A(col,row). Вместо выполнения [rows; cols] можно сначала создать верхнюю треугольную матрицу, а затем добавить транспонированную матрицу, чтобы завершить симметричную матрицу.

A = sparse([rows; cols],[cols; rows],[s; s]);    
full(A)

A = 
   0   3   4   5   0
   3   0   4   7   8
   4   4   0   0   0
   5   7   0   0   0
   0   8   0   0   0
person Stewie Griffin    schedule 10.10.2013
comment
не могли бы вы объяснить подробно? - person Jusleong; 10.10.2013

Очень трудно сказать, о чем ты спрашиваешь. Это правильно?

list = [1 2 3
1 3 4
1 4 5
2 3 4
2 5 8
2 4 7];


matrix = zeros(max(max(list(:, 1:2))));  %// Or just zeros(5) if you know you want a 5x5 result

matrix(sub2ind(size(matrix), list(:,1), list(:,2))) = list(:,3);  %// Populate the upper half
matrix = matrix + matrix'  %'// Find the lower half via symmetry

matrix =

   0   3   4   5   0
   3   0   4   7   8
   4   4   0   0   0
   5   7   0   0   0
   0   8   0   0   0
person Dan    schedule 10.10.2013