Manipulación de matrices en raqueta

Nov 24 2020

Necesito escribir una función que produzca la enésima columna de una matriz en Racket sin usar la recursividad. Por ejemplo, (list (list 1 2 3) (list 2 3 4) (list 6 7 9))si quisiera la segunda columna, la recibiría (list 2 3 7).

Lo intenté (append (map (lambda (n) (list-ref (list-ref M) n) n)) M)), pero sigue mostrándome un error.

Respuestas

adabsurdum Nov 24 2020 at 09:32

La solución intentada usa list-refdos veces, lo cual no es necesario, y una de esas llamadas no tiene suficientes argumentos: (list-ref M)la función solo toma un argumento, pero requiere dos argumentos: una lista y un número entero.

La list-reffunción devolverá un elemento indexado de una lista de entrada, por (list-ref '(1 2 3) 1)lo que volverá 2. Considere lo mapque hará aquí: la matriz se representa como una lista de listas (una lista de filas), es decir, como ((1 2 3) (2 3 4) (6 7 9)). La mapfunción será actuar sobre los miembros de la lista de entrada, que son las listas (1 2 3), (2 3 4)y (6 7 9). Al hacer mapping a la list-reffunción sobre esa entrada, puede tomar el elemento que desee de las sublistas. Entonces, (map (lambda (row) (list-ref row 1)) '((1 2 3) (2 3 4) (6 7 9)))evaluaría a (2 3 7), como se desee.

Aquí hay una función que le permite tomar cualquier columna de una matriz:

(define (nth-column M n)
  (map (lambda (row) (list-ref row n)) M))

Interacciones de muestra:

scratch.rkt> (define M '((1 2 3)
                         (2 3 4)
                         (6 7 9)))
scratch.rkt> (nth-column M 1)
'(2 3 7)
scratch.rkt> (nth-column M 0)
'(1 2 6)
scratch.rkt> (nth-column M 2)
'(3 4 9)