考虑mathematica中的以下列表:
a = {
{
{0, 0, 0}, {1, 0, 0}, {1, 1, 0}
},
{
{0, 0, 1}, {1, 0, 1}, {1, 1, 1}
}
};
现在,调用:
Export["test.dat", a]
然后
b = Import["test.dat"]
您会看到最后a
不等于b
。我应该将此视为功能还是错误?
此外,我想导入一个具有以下格式的列表:{P1,P2,P3...,Pn}
其中Pi={v1,v2,v3,...,vm}
和每个vi={x,y,z}
,其中x,y,z
是表示顶点坐标的数字{ {1}}。这应该是一个多边形列表。
我应该如何设置我的vi
文件,以便我可以使用Mathematica阅读它,我该如何阅读?我试图模仿上面.dat
的输出,但后来发现了另一个问题。我找到了question,但无法让答案对我有用......
有什么想法吗?提前谢谢!
答案 0 :(得分:4)
您应该指定导入/导出所需的确切格式,否则Mathematica可能无法猜出正确的格式。
所以你的问题归结为什么文本格式适合存储3D数组?
如果您使用Mathematica,可能最简单的方法是使用Mathematica的表达式语法(即Export["data.m", a, "Package"]
)导出表达式。这种格式相对容易用其他语言编写(但它并不像解析那么容易)。您的另一个选择是为您的3D数据构建一些新的易于解析的文本格式,并在Mathematica和您需要使用的其他语言中为它编写自己的输入/输出函数。
由于您正在使用的数据格式是固定的(您总是有坐标三元组),最简单的解决方案可能是在导出之前将列表展平,并在导入后对其进行分区,如下所示:
Export["test.txt", Join @@@ a, "Table"]
b = Import["text.txt", "Table"]
Partition[#, 3]& /@ a
答案 1 :(得分:2)
对于存储MMA表达式,我建议DumpSave
(二进制,依赖于系统),Save
或Put
,但如果要使用导出,我会将a转换为< em> string ,并将其导出为 text 。 (我使用下面的ImportString
和ExpertString
,因此我不需要文件,但Import
和Export
的工作方式相同。 IMO这是一块坚如磐石的人。
a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}};
b = ToExpression@ImportString[ExportString[a // ToString, "Text"], "Text"]
(* ==>
{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}
*)
a == b
(* ==> True *)
读取多边形列表应该是一样的:
b = ToExpression@ImportString["test.dat", "Text"]
答案 2 :(得分:1)
您也可以这样做:
a={{{0,0,0},{1,0,0},{1,1,0}},{{0,0,1},{1,0,1},{1,1,1}}};
Export["c:\\test.dat",a,"MathML"];
b=ToExpression@Import["c:\\test.dat","MathML"]
(*
->{{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}}
*)
额外的好处是此方法不需要解析Import
输出
答案 3 :(得分:1)
我也是这个问题。我的解决方案如下:
IN[]: a = {{{0, 0, 0}, {1, 0, 0}, {1, 1, 0}}, {{0, 0, 1}, {1, 0, 1}, {1, 1, 1}}};
Export["test.dat", a, "List"];
b = ToExpression@Import["test.dat", "List"];
a == b
Out[]: True
希望这会有所帮助。最好的问候。