2

我想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(...

我不知道为什么!我可以得到解决方案吗?谢谢你。

4

1 回答 1

1

事实证明,问题在于以这种方式使用 Graph 函数时不允许有零。(参见:Target 必须是节点索引的密集双精度数组。如何求解?

我下载了数据集并使用以下代码成功运行它。请注意,此代码使用系统命令,并不与所有操作系统兼容,但它应该足够简单,可以重写为您使用的任何操作系统。它还假定 .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()从前两行中删除。

于 2017-04-01T17:18:35.513 回答