2014-03-04 6 views
4

(make-array '(4 3 8))을 사용하고 싶습니다. array(name,d1,d2...dm)을 포함하여 다중 -d 행렬을 생성하는 API를 찾을 수 없어서 기본적으로 다중 -d 행렬을 생성합니다.최대치에 리스프 코드 사용하기

내가 :lisp (make-array '(4 3 8))를 사용하여 실행할 수 있습니다하지만 난 내가 좋아하는 무언가로 레이블을 수있는 방법을 모르는,

arr: :lisp(make-array '(4 3 8))

는 최대 기능 내부 혀짤배기 코드를 사용할 수 있다면 나 또한 알고 싶어 . 어떤 종류의 도움도 높게 평가되어야합니다.

답변

5

그냥 정확히 같은 array(name, d1, d2, ..., dm)로 리스프 코드에서 명명 된 배열을 만들려면, 쓰기 :

(mfuncall '$array name d1 d2 ... dm) 

당신은 맥시마를 functi에 직접 리스프 코드를 포함 할 수 없습니다 ons. 하지만 당신은 Lisp 함수를 호출 할 수 있습니다. lisp 함수의 이름이 $foo 인 경우 Maxima에서는 foo; Lisp에서 foo 인 경우 Maxima에서는 ?foo입니다. 예 :

:lisp (defun $foo (x) ...) 

f(x) := print (foo (x)); 

그런데 Maxima의 배열 처리는 여전히 엉망입니다 ... 언젠가 우리는 그것을 정리할 것입니다.

2

직접 배열을 만들 수 make_array을 사용할 수 있습니다 :이 같은 리스프 호출의

(%i18) make_array(fixnum,4,3,8); 
(%o18) {Array: #3A(((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)) 
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)) 
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)) 
    ((0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0) (0 0 0 0 0 0 0 0)))} 

또는 바인드 결과 :

그런데
(%i21) :lisp (msetq $foo (make-array '(4 3 8))); 

#3A(((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL))) 
(%i21) foo; 
(%o21) {Array: #3A(((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)) 
    ((NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL) 
    (NIL NIL NIL NIL NIL NIL NIL NIL)))} 

, array 아마 당신도 일했다. 나는 그것을 사용한 적이 한번도 없었습니다. 왜냐하면 그것은 창조 이후에 인쇄되지 않기 때문에 처음에는 혼란 스러웠습니다. 그러나 documentationWikibooks 기사 확인 후 :

(%i22) array(A,2,2,2); 
(%o22)         A 
(%i23) arrayinfo(A); 
(%o23)      [declared, 3, [2, 2, 2]] 
(%i24) A[0,1,2]: 2; 
(%o24)         2 
(%i25) listarray(A); 
(%o25) [#####, #####, #####, #####, #####, 2, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####, #####, #####, #####, #####, #####, 
#####, #####, #####, #####, #####, #####] 

위의 링크 된 위키 책 기사로 꽤 많은 맥시마에서 이런 종류의 일에 대한 옵션, 또는 것 같다을 로버트 Dodier 지수 : "맥시마의 현재 배열/매트릭스 의미가 엉망이다 [...] "

+0

'Lisp 배열 [4,3,8]'..으로 출력되고 있습니다. 일부 옵션을 활성화해야합니까? – Rorschach

+0

아니요,이 항목은 Maxima 5.24.0에서 나에게 적합하지만 어쩌면 최신 버전으로 변경되었습니다. 그런데 나는'array' (기본적으로 생성 된 결과 배열을 출력하지 않음)를 포함하도록 대답을 확장하고 몇 개의 링크를 제공했습니다. 어쩌면 그것이 당신을 더 멀리 도울 것입니다. – danlei

+0

이것을보아야 할 측면은 불완전한 인덱스를 전달하는 것보다 전의 'arrayinfo (t);'=>'Lisp 배열 [2,3,4]'에 대한 출력을 나타내는 표현식에 약간의 오류를 유도하는 것입니다. PROGN [또는 피 호출자]의 오류 : # 3A (((0 0 0 0) (0 0 0 0) (0 0 0 0)) 예를 들면 다음과 같습니다. - t [1] [2]; ((0 0 0 0) (0 0 0 0) (0 0 0 0))) 잘못된 계급' – Rorschach