Я бы лично прочь с вашим кодом цикла и воспользоваться 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
@ChisholmKyle имеет комментарий для вас под их ответом. – beaker