公告:1)网站程序升级:Q2A升级到1.8.6,Wordpress升级到5.7.2
2)修复了头像加载慢与提交问题反应慢等问题
2021-06-16

欢迎来到 Mathematica 问答社区

提问时请贴上文本代码

语法高亮:在编辑器中点击

被禁止的话题:广告破解

请阅读:《提问的智慧》

备用域名:mma.ooo

支持LaTex数学公式
行内公式标识符:\$ 或“$\backslash ($”+“$\backslash )$”,
行间公式标识符:\$\$ 或 “$\backslash [$”+“$\backslash ]$”

社区建议QQ群:365716997

分类

0 投票
1.1k 浏览
源文件是.g6文件,是一种图形压缩格式,我想通过mathematica,将源文件中所有图形转换为矩阵并导出TXT文件中,说明:图数量很庞大,有十几万个图,提前谢谢各位朋友的解答

将源文件中所有图形转换为矩阵并导出TXT文件中,说明:图数量很庞大,有十几万个图,
分类:图论 | 用户: 执笔研默 (21 分)
修改于 用户:野鹤
我去,好长的标题。
这里你说的矩阵,我理解为图的邻接矩阵。
你是想用一个txt文件存储所有的矩阵数据呢,还是每个矩阵存为一个txt文件呢?
是图的邻接矩阵,想用一个TXT文件存储所有的邻接矩阵数据,谢谢您的解答

1个回答

+1 投票

你试试下面的代码,应该可以;

导出的TXT文件中的矩阵之间使用空行隔开,如果有错误再交流:

又修改了一下,添加了测试数据。

(*生成测试文件*)
Export["D:/test.g6", {KnightTourGraph[4, 4], KnightTourGraph[3, 3], 
KnightTourGraph[2, 2], KnightTourGraph[1, 1]}]

(*==============================*)
(*输入地址:实际使用时,从这里开始*)
pathGraph6 = "D:/test.g6";(*你的Graph6文件路径*)
pathSaveText = "D:/your-txt-file.txt";(*你要保存的Text文件路径*)

(*显示进程*)
filePosition = 0;
fileSize = FileByteCount[pathGraph6];
Dynamic[Column[{Row[{filePosition, "/", fileSize}], 
ProgressIndicator[filePosition, {0, fileSize}]}]]

(*以数据流方式读写文件*)
sr = OpenRead[pathGraph6];
sw = OpenWrite[pathSaveText];

(*特殊处理第1行数据*)
g6String = StringReplace[ReadLine[sr], ">>graph6<<" -> ""];
matrixString = 
ExportString[
Normal[AdjacencyMatrix[ImportString[g6String, "Graph6"]]], 
"Table"] <> "\n\n";
WriteString[sw, matrixString];

(*处理余下的数据*)
While[(g6String = ReadLine[sr]) =!= EndOfFile,
filePosition = StreamPosition[sr];
matrixString = 
ExportString[
Normal[AdjacencyMatrix[ImportString[g6String, "Graph6"]]], 
"Table"] <> "\n\n";
WriteString[sw, matrixString];
]
filePosition = fileSize;
Close /@ {sr, sw};

 

用户: 野鹤 (5.0k 分)
修改于 用户:野鹤
你先别用自己的数据,直接使用上面的代码测试一下,看看是否能通过。
StringReplace::strse: StringReplace[ReadLine[InputStream[D:/test.g6,89]],>>graph6<<->] 的位置 1 处应该是字符串或者由字符串组成的列表. >>

ImportString::string: 第一个参数 StringReplace[ReadLine[InputStream[D:/test.g6,89]],>>graph6<<->] 不是一个字符串. >>

AdjacencyMatrix::graph: 在 AdjacencyMatrix[ImportString[StringReplace[ReadLine[InputStream[D:/test.g6,89]],>>graph6<<->],Graph6]] 中 中位置 1 处应该是一个图对象. >>

ImportString::string: 第一个参数 ReadLine[InputStream[D:/test.g6,89]] 不是一个字符串. >>

AdjacencyMatrix::graph: 在 AdjacencyMatrix[ImportString[ReadLine[InputStream[D:/test.g6,89]],Graph6]] 中 中位置 1 处应该是一个图对象. >>

ImportString::string: 第一个参数 ReadLine[InputStream[D:/test.g6,89]] 不是一个字符串. >>

AdjacencyMatrix::graph: 在 AdjacencyMatrix[ImportString[ReadLine[InputStream[D:/test.g6,89]],Graph6]] 中 中位置 1 处应该是一个图对象. >>

ImportString::string: 第一个参数 ReadLine[InputStream[D:/test.g6,89]] 不是一个字符串. >>

General::stop: 在本次计算中,ImportString::string 的进一步输出将被抑制. >>

AdjacencyMatrix::graph: 在 AdjacencyMatrix[ImportString[ReadLine[InputStream[D:/test.g6,89]],Graph6]] 中 中位置 1 处应该是一个图对象. >>

General::stop: 在本次计算中,AdjacencyMatrix::graph 的进一步输出将被抑制. >>
刚试了,还是不行
那不是我代码的问题,那段代码我试过了没有问题,可能是你软件版本比较低吧。我用的是Mathematica 11.1.1。你用的是什么版本?
我用的9.0,应该是低了,谢谢解答,祝您愉快,我升级版本试试
...