Ошибка при запуске G= graph(s,t) в matlab
Я хочу посчитать L = laplacian(G)
из набора данных графа. Я импортировал набор данных, который содержит два столбца: FromNodeId и ToNodeId:
# Nodes: 3997962 Edges: 34681189
# FromNodeId ToNodeId
0 1
0 2
0 31
0 73
0 80
0 113619
0 2468556
0 2823829
0 2823833
0 2846857
0 2947898
0 3011654
0 3701688
0 3849377
0 4036524
0 4036525
0 4036527
0 4036529
0 4036531
0 4036533
0 4036534
0 4036536
0 4036537
1 2
1 3
1 4
1 5
1 6
1 7
1 8
1 9
1 10
1 11
Для этого мне нужно найти G
во-первых, поэтому я использую G = graph(FromNodeId, FromNodeId)
, Когда я сделал это, я получил эту ошибку:
>> G = graph(fromNodeId,toNodeId)
Error using matlab.internal.graph.MLGraph
Source must be a dense double array of node indices.
Error in matlab.internal.graph.constructFromEdgeList (line 125)
G = underlyingCtor(double(s), double(t), totalNodes);
Error in graph (line 264)
matlab.internal.graph.constructFromEdgeList(...
Я не знаю почему! Могу ли я получить решение этого? Спасибо.
1 ответ
Оказывается, проблема заключается в том, что при использовании функции Graph таким способом не допускаются нули. (См.: Цель должна быть плотным двойным массивом индексов узлов. Как решить?)
Я скачал набор данных и успешно запустил его с помощью следующего кода. Обратите внимание, что этот код использует системную команду и не совместим со всеми операционными системами, но он должен быть достаточно простым для перезаписи на любую операционную систему, которую вы используете. Также предполагается, что файл.txt находится в рабочем каталоге.
% Removes first lines with comments in them; this system command was tested on Linux Ubuntu 14.04 and is probably not portable to Windows.
% If this system command doesn't work, manually remove the first four lines from the text file.
system('tail -n +5 com-lj.ungraph.txt > delimitedFile.txt');
% Read the newly created delimited file and add 1 to all nodes.
edges=dlmread('delimitedFile.txt')+1;
% Build the graph
G=graph(edges(:,1),edges(:,2));
Предполагая, что вы построили свои массивы аналогично тому, как я это сделал, добавление 1 к FromNodeIdFull и ToNodeIdFull должно решить вашу проблему. Другими словами, следующий фрагмент кода должен решить вашу проблему; если это не так, я советую вам переписать на основе кода, представленного выше.
G=graph(FromNodeIdFull+1,ToNodeIdFull+1);
Оставив мой старый ответ здесь, его удаление может вызвать путаницу у других, читающих как этот ответ, так и комментарии к нему. Обратите внимание, что ответ ниже НЕ решил проблему.
Просто добавив комментарии от себя и NKN в ответ:
Проблема заключается в том, что массивы редки, но graph()
похоже, ожидает полных массивов. Следующее должно работать:
FromNodeIdFull=full(double(FromNodeId));
ToNodeIdFull=full(double(ToNodeId));
G=graph(FromNodeIdFull,ToNodeIdFull);
В зависимости от того, удвоены ли ваши входные массивы или нет, вы можете удалить double()
из первых двух строк.