Импорт данных из TXT в Mathematica - PullRequest
5 голосов
/ 03 июня 2011

Рассмотрим следующий список в 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 - числа, представляющие координаты вершины vi. Это должен быть список полигонов.

Как мне установить файл .dat, чтобы я мог прочитать его с помощью Mathematica, и как мне его прочитать? Я попытался имитировать вывод Export["test.dat",a] выше, но потом обнаружил другую проблему. Я нашел этот вопрос , но не смог заставить ответ работать на меня ...

Есть идеи? Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 03 июня 2011

Вы должны указать точный формат, который вам нужно импортировать / экспортировать, иначе Mathematica не сможет угадать правильный формат.

Таким образом, ваш вопрос сводится к тому, какой текстовый формат подходит для хранения 3Dмассивы?

Если вы работаете с Mathematica, вероятно, проще всего сделать экспорт выражения с использованием синтаксиса выражений Mathematica, то есть Export["data.m", a, "Package"].Этот формат относительно легко написать с других языков (но его не так просто разобрать).Другим вариантом будет создание нового удобного синтаксического анализа текстового формата для ваших 3D-данных и создание собственных функций ввода / вывода для него как на Mathematica, так и на других языках, с которыми вам нужно работать.

Так какформат данных, с которыми вы работаете, является фиксированным (у вас всегда есть координатные триплеты), самое простое решение может заключаться в том, чтобы просто сгладить ваш список перед экспортом и разбить его на части после импорта, например:

2 голосов
/ 03 июня 2011

Для хранения выражения MMA я бы предложил DumpSave (двоичный, системно-зависимый), Save или Put, но если вы хотите использовать Export, я бы преобразовал в строку и экспортируйте это как текст .(Я использую ImportString и ExpertString ниже, так что мне не нужен файл, но он работает одинаково для Import и Export).ИМО, это твердо, как скала.

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"]
1 голос
/ 28 июня 2012

Я тоже решаю эту проблему. Мое решение следующее:

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

Надеюсь, это поможет. С наилучшими пожеланиями.

1 голос
/ 03 июня 2011

Вы также можете сделать, например:

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 выходных данных

...