Saltar al contenido

¿Cómo se copia una matriz en lisp común?

Solución:

ACTUALIZAR: Hoy en día, Alejandría tiene una copy-array muy similar a la implementación que se muestra a continuación. Usa eso.

RESPUESTA OBSOLETA: Usé lo siguiente, que creí que era mejor que la versión de Alejandría en ese momento:

(defun copy-array (array &key
                   (element-type (array-element-type array))
                   (fill-pointer (and (array-has-fill-pointer-p array)
                                      (fill-pointer array)))
                   (adjustable (adjustable-array-p array)))
  "Returns an undisplaced copy of ARRAY, with same fill-pointer and
adjustability (if any) as the original, unless overridden by the keyword
arguments."
  (let* ((dimensions (array-dimensions array))
         (new-array (make-array dimensions
                                :element-type element-type
                                :adjustable adjustable
                                :fill-pointer fill-pointer)))
    (dotimes (i (array-total-size array))
      (setf (row-major-aref new-array i)
            (row-major-aref array i)))
    new-array))

El problema con la versión de Alejandría era que el adjust-array
hack hace que el resultado (al menos en SBCL) nunca sea un
simple-array, que esperan algunas otras bibliotecas (por ejemplo, opticl). La versión anterior también fue más rápida para mí.

Alguien más ha publicado una versión muy similar en una biblioteca diferente, pero olvidé los nombres tanto de la persona como de la biblioteca.

La biblioteca Common Lisp Alexandria (instalable a través de quicklisp) incluye una implementación de copy-array para rangos y dimensiones arbitrarios:

(defun copy-array (array &key
                   (element-type (array-element-type array))
                   (fill-pointer (and (array-has-fill-pointer-p array)
                                      (fill-pointer array)))
                   (adjustable (adjustable-array-p array)))
  "Returns an undisplaced copy of ARRAY, with same fill-pointer and
adjustability (if any) as the original, unless overridden by the keyword
arguments. Performance depends on efficiency of general ADJUST-ARRAY in the
host lisp -- for most cases a special purpose copying function is likely to
perform better."
  (let ((dims (array-dimensions array)))
    ;; Dictionary entry for ADJUST-ARRAY requires adjusting a
    ;; displaced array to a non-displaced one to make a copy.
    (adjust-array
     (make-array dims
                 :element-type element-type :fill-pointer fill-pointer
                 :adjustable adjustable :displaced-to array)
     dims)))

Depende de cómo se represente su matriz 2D y qué tipo de Lisp esté usando.

Si está utilizando Common Lisp, copy-seq podría ser útil.

¡Haz clic para puntuar esta entrada!
(Votos: 1 Promedio: 5)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *