Я бы лично отказался от вашего кода цикла и воспользовался преимуществами 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
person
rayryeng
schedule
29.07.2015