2011-05-11 8 views
5

Mathematica 표현식 을 무손실로 문자열로 변환하는 적절한 방법은 무엇입니까 (메모리에 보관 된 문자열이 파일로 내보내지지 않음)?Mathematica 표현식을 텍스트 형식으로 유지

나는

  1. 이 같은 SparseArray, Graph, Dispatch, CompiledFunction 특수 (그리고 아마도 원자) 객체를 유지 포함한 모든 정보 등이 그대로 보존됩니다 텍스트 표현을 찾고 있습니다. 예 : 이 표현을 통해 SparseArray을 순환시키는 것은 희박한 상태로 유지해야하며 일반 목록으로 변환하지 않아야합니다.
  2. 은 순환이 비교적 빠릅니다 (앞뒤로 변환).

여기에 ToString[expr, FullForm]이 충분합니까? ToString[expr, InputForm]는 어떨까요?

참고 1 : 내부 표현이 때때로 손상되는 Graph의 일부 버그를 해결하려고 시도하는 동안 나타났습니다. 하지만 위의 일반적인 질문에 대한 답변에 관심이 있습니다.

참고 2 : Save 참고 : 2 : Save은 반드시이 작업을 수행하지만 파일 (스트림을 사용하여이 문제를 해결할 수도 있음)에 쓰고 기호와 관련된 정의 만 씁니다.

+0

나는 당신이하려는 것을 이해하지 못합니다. 표현식을 "저장"하여 나중에 복원 하시겠습니까, 아니면 문자열을 처리 할 예정입니까? –

+0

그냥 저장하고 복원하십시오. 이 특별한 경우에는 https://groups.google.com/d/topic/comp.soft-sys.math.mathematica/RRsfrHCjwRM/discussion과 같은 버그를 해결해야합니다. 레오 니드의 해결책이 아마도 최고입니다. – Szabolcs

+0

그 버그는 나 빠진다. 다른 기호로 저장하는 것이 효과가 있습니까? 'jjHold = jj; IsomorphicGraphQ [jj, ...' –

답변

8

결과 문자열에서 일부 문자열 조작을 수행하지 않으려는 경우 ToString 대신 CompressUncompress을 고려할 수 있습니다. ToString[expr,InputForm] - ToExpression주기가 깨지는 경우를 알지 못하지만, 나는 그것이 존재한다고 쉽게 상상할 수 있습니다. Compress 솔루션은 Compress에서 Uncompress이 호출되면서 더 강력합니다. -ed 문자열은 원래 표현식을 재구성합니다. Compress의 또 다른 장점은 꽤 메모리 효율적이라는 것입니다. 디스크에 저장하지 않고도 수십 개의 숫자 데이터를 노트북에 저장하는 데 몇 번 사용했습니다.

+0

사용하는 압축 방법과 성능을 알고 있습니까? (gzip과 같습니까? 매우 빠릅니다.) Uncompress @ Compress [...]는 배열의 "패킹 (packedness)"을 보존한다는 점에 흥미 롭습니다. 그럼에도 불구하고 '압축'출력은 아키텍처간에 이식 가능하다고 가정합니다. – Szabolcs

+0

불행히도 'Compress'의 내부 구현에 대한 자세한 내용은 알지 못합니다. 아마도 여기에 대해 잘 알고있는 사람들이 이에 대해 언급 할 수 있습니다. 제 목적으로 볼 때 이것은 많은 양의 데이터/큰 표현에 대해서조차도 매우 빨랐습니다. 휴대성에 관해서는, 당신이 옳을 수도 있습니다 (이것은 좋을 것입니다). 그러나 다시, 나는 잘 모릅니다. –

+9

저는 Compress 함수의 대부분을 Mathematica에서 구현했습니다. gzip과 같은 "압축"압축을 사용합니다. Mathematica를 사용할 수있는 모든 아키텍처에서 이식 가능합니다. 그것은 포장 된 배열을 유지합니다. – ragfield

5

Compress 전시 라운드 트립 문제는 ExportStringImportString 유용한 대안을 제시 할 수 있어야 - 특히, 그들은 티카 - 기본 MX 형식과 함께 사용하는 경우 :

string = ExportString[originalExpr, "MX"] 
recoveredExpr = ImportString[string, "MX"] 

주 그 MX 형식 일반적으로 Mathematica 인스턴스간에 양도 할 수는 없지만 기술 된 메모리 내 애플리케이션에는 문제가되지 않습니다.

ExpressionML은 다른 Mathematica 관련 내보내기 형식이지만, 이 아닌은 간결한 형식입니다.

+0

+1 - 이것들은 유용하게 보입니다. –

+0

IsomorphicGraphQ가 실패한 깨진 표현을 보존 할 것이라고 걱정했지만 사실은 그렇지 않습니다. @WReach는 일반적으로 이진 데이터에 문자열을 사용하는 것이 안전합니까? – Szabolcs

+0

@Szabolcs 경험적으로, 나는 그렇다고 대답 할 것이다. 필자는 과거에 인코딩 된 이미지 파일과 비슷한 전략을 사용했습니다. 문자열은 16 비트 단어의 배열처럼 작동하는 것으로 보이며 아무런 부작용도 관찰하지 않았습니다. 그러나 저는 더 강한 확신을 줄 수는 없습니다. – WReach

관련 문제