Ошибка при запуске 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() из первых двух строк.

Другие вопросы по тегам