5

考虑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}wherePi={v1,v2,v3,...,vm}和 each vi={x,y,z}wherex,y,z是表示顶点坐标的数字vi。这应该是一个多边形列表。

我应该如何设置我的.dat文件以便我可以使用 Mathematica 读取它,我应该如何读取它?我试图模仿Export["test.dat",a]上面的输出,但后来我发现了另一个问题。我找到了这个问题,但无法让答案对我有用......

有任何想法吗?提前致谢!

4

4 回答 4

5

您应该指定需要导入/导出的确切格式,否则 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
于 2011-06-03T09:14:16.013 回答
2

对于存储 MMA 表达式,我建议DumpSave(二进制,取决于系统),Save或者Put,但如果你想使用 Export,我会将 a 转换为string,并将其导出为text。(我在下面使用ImportStringand ExpertString,所以我不需要文件,但它对Importand的工作原理相同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"]
于 2011-06-03T19:05:47.353 回答
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输出

于 2011-06-03T14:11:02.280 回答
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

希望这可以帮助。最好的祝福。

于 2012-06-28T00:22:20.920 回答