2013-07-07 3 views
2

전환 된 행과 열이있는 배열 복사본을 만드는 방법을 찾으려고합니다.
그림자 배열에서 원래 배열로 포인터를 설정하여 항목 [2 1]이 항목 [1 2]을 가리 키도록하고 싶습니다.전환 된 행과 열이있는 배열의 섀도우 배열 만들기

포인터를 사용하면 원래 배열이 변경 될 때 그림자 배열에도 해당 변경 사항이 반영됩니다.

지금까지 배열의 모든 항목에 대해 길이 1의 변위 된 배열을 사용했습니다.
작동하지만 결과는 배열이있는 배열입니다.
내 질문에, 더 좋은 방법이 있나요?
그리고 섀도우 배열을 통해 setf를 사용하여 원래 배열의 값을 설정하는 방법이 있습니까? 지금까지

내 코드 :

(defun shadow-column-array (array) 
    (let* ((colsize (second (array-dimensions array))) 
     (rowsize (first (array-dimensions array))) 
     (b (make-array (list colsize rowsize)))) 
    (dotimes (i rowsize b) 
     (dotimes (j colsize) 

     (setf (aref b j i) 
       (make-array 1 
          :displaced-to array 
          :displaced-index-offset (+ (* i rowsize) j))))))) 

일부 출력 :

*a* => #2A((0.0 0.1 0.2) (1.0 1.1 1.2) (2.0 2.1 2.2)) 

(setq b (shadow-column-array (*a*)) 

*b* => #2A((#(0.0) #(1.0) #(2.0)) (#(0.1) #(1.1) #(2.1)) (#(0.2) #(1.2) #(2.2))) 

난민 배열이 지금

col1 => #(#(0.0) #(1.0) #(2.0))  
col2 => #(#(0.1) #(1.1) #(2.1)) 
col3 => #(#(0.2) #(1.2) #(2.2)) 

답변

0

있습니다 나는 어쩌면 두 배열을 사용하여 설정합니다 둘 때 나는 내용을 바꾼다. SETF 기능을 쉽게 작성할 수 있습니다. 사용자의 단일 데이터 구조처럼 보이게하려면 배열에 슬롯이있는 CLOS 인스턴스를 사용합니다.

3

원래 배열의 모든 요소를 ​​'셀 참조'로 만듭니다. 그런 다음 동일한 셀을 사용하지만 요소가 반대로 된 섀도우 배열을 만듭니다. 셀의 값을 변경하면 배열 내용이 변경됩니다.

(defun make-celled-array (m n init) 
    (let ((array (make-array (list m n)))) 
    (dotimes (i m) 
     (dotimes (j n) 
     (setf (aref array i j) (list init)))) ; (list init) makes a 'cell' 
    array)) 
(defun celled-array-ref (array m n) 
    (car (aref array m n))) 
(defsetf celled-array-ref (array m n) (val) 
    `(setf (car (aref ,array ,m ,n)) ,val)) 

(defun shadow-celled-array (ca) 
    (let ((m (array-dimension ca 1)) ; swapped 
     (n (array-dimension ca 0))) 
    (let ((array (make-array (list m n)))) 
     (dotimes (i m) 
     (dotimes (j n) 
      (setf (aref array i j) (aref ca j i)))) ; swapped 
     array))) 

사용 :

* (defvar a1 (make-celled-array 2 4 1)) 
A1 

* (setf (celled-array-ref a1 0 3) 10) 
10 

* a1 
#2A(((1) (1) (1) (10)) ((1) (1) (1) (1))) 

* (defvar a2 (shadow-celled-array a1)) 
A2 

* a2 
#2A(((1) (1)) ((1) (1)) ((1) (1)) ((10) (1))) 

* (celled-array-ref a2 3 0) 
10 

* (setf (celled-array-ref a2 3 0) 100) 
100 

* (celled-array-ref a1 0 3) 
100