2009-09-21 2 views
14

Mathematica의 기호 및 수치 기능을 사용하여 연주 한 후에도 적절한 프로그래밍 언어라는 것을 알았습니다. 그러나 범용 언어로 사용하기에는 C와 유사한 구조체 데이터 유형 (또는 파스칼에서 알려진 레코드 유형)이 부족합니다. 이 문제를 어떻게 해결할 수 있습니까?Mathematica의 구조체 데이터 유형은 무엇입니까?

답변

8

내가 제대로 질문을 이해한다면, 당신은 단순히이 같은 일을 작성할 수 있습니다

다음
 
x[foo] = bar 
x[bar] = baz 
x[1] = 7 
x[7] = 1 
?x 

단지 (동일 예를 들어, x[1]7를 반환합니다 입력 특정 인덱스의 데이터에 액세스 할 x[foo] 반환합니다 bar).

+0

이 작업 방식은 sakra가 제안한 규칙 접근 방식보다 한 가지 실질적인 이점을 가지고 있습니다.이 기능을 사용하면 "struct"의 "필드"를 간단하게 변경할 수 있습니다. – Pillsy

+2

답변에 문제가 있습니다 : "필드"가 목록 인 경우 해당 요소를 개별적으로 변경할 수 없습니다. 예 : x [foo] = {1,2}; x [foo] [1]] = 3 (* 목록 요소 *를 변경하려고 시도 함) 은 x [foo]가 Lvalue가 아니므로 오류가 발생합니다. 그래서 C 구조체 기능을 완전히 대체하지는 못합니다. – felix

+1

목록의 단일 값을 변경하는 것뿐만 아니라 이전 값을 완전히 바꿔야합니다. f [ "foo"] = {1, 2}; f [ "foo"] = (ReplacePart [f [ "foo"], 1 -> 3]) 또한 심볼이 아닌 키에 문자열 또는 정수를 사용합니다. Set의 UpValues를 설정하여 할 수있는 까다로운 비즈니스가 있습니다. –

14

업데이트 : 매스 매 티카 (10)은 struct의 가장 중요한 특성을 많이 가지고 Association을 발표했다. (new answer을 참조하십시오.)이 답변의 원래 사용되지 않는 버전은 아래와 같습니다.


당신은 티카 규칙은 C와 같은 구조체 데이터 형식을 모방 나열 할 수 있습니다. 예컨대, :.

person = {firstName -> "John", lastName -> "Doe"} 

그런 다음 /. 연산자를 사용하여 레코드의 필드에 액세스 할 수 있습니다

firstName /. person 

John를 얻을 수 있습니다.

lastName /. person 

Doe를 얻을 수 있습니다.

목록에 레코드의 필드, 앞에 추가 업데이트 된 필드를 업데이트하려면 다음

PrependTo[person , firstName -> "Jane"] 

firstName /. personJane을 얻을 수 있습니다.

transformation rules에 관한 Mathematica 설명서를 참조하십시오.

+2

prepending을 사용하여 몇 가지 변경을하면 사용되지 않은 규칙이 개인 목록에 나타납니다. 별로 효율적이지 않습니다. –

+0

Mathematica 10은 ['Association'] (http://reference.wolfram.com/language/ref/Association.html)을 소개했으며, 이것은'struct'의 가장 중요한 속성들을 많이 가지고 있습니다. [새 대답] (http://stackoverflow.com/a/33465106/330202)을 참조하십시오. –

2

이 방법을 사용할 수 있습니다 : 또한

x[foo] = bar 

x[bar] = baz 

x[1] = 7 

x[7] = 1 

x[c] = {{1,2,3},{4,5,6}} 

및 목록 필드의 요소를 변경하면 다음 그렇게 할 수

x[c] = {{8,2,3},{4,5,6}} 
3

티카를 : 리턴

x[c] = ReplacePart[x[c], {1, 1} -> 8] 

10은 Association을 도입했으며, 이는 struct.Elementary introduction to DataSetsFast introduction for programmers을 :

someData = <| "name" -> "Bob", "age" -> 23 |> 

In[1]:= someData["name"] 
Out[1]= Bob 

In[2]:= someData["age"] 
Out[2]= 23 

In[3]:= someData[[2]] 
Out[3]= 23 

더 많은 정보

  • 볼프람는 안내 (Association을 기반으로하는)

  • 관련 문제