Как лучше хранить квадратные матрицы и находить в них подматрицы? - Lisp
Формулировка задачи:
;; Изначально хранить матрицу вот так пр. 4х4 ( (0 0 0 0) (0 0 0 0) (0 0 0 0) (0 0 0 0) )
(defstruct abstract matrix sum)
0 0
0 0) (0 0
0 0) (0 0
0 0) (0 0 0 0)Решение задачи: «Как лучше хранить квадратные матрицы и находить в них подматрицы?»
(defun sub-matrix (w n m j k) (apply #'vector (loop for a across w for b from 0 when (<= n b m) nconc (loop for d across a for e from 0 when (<= j e k) collect d)))) > (sub-matrix #(#(0 1 2 3) #(4 5 6 7) #(8 9 10 11) #(12 13 14 15)) 1 3 2 3) #(6 7 10 11 14 15)
Объяснение кода листинга программы
В коде определён функцией sub-matrix
с тремя позиционными аргументами w
, n
и m
. Первый аргумент w
— это список списков, представляющий собой квадратную матрицу. Два других аргумента n
и m
задают число строк и столбцов подматрицы, которую необходимо получить.
Функция sub-matrix
возвращает подматрицу, которая вызывается с помощью функции apply
и передаёт в неё один аргумент — функцию vector
, которая создаёт вектор из элементов подматрицы.
Далее в коде с помощью цикла loop
происходит перебор всех элементов матрицы w
. Для каждой строки a
и каждого столбца b
из этой строки проверяется, что b
меньше или равно m
, и если это так, то для каждого элемента d
из строки a
и каждого столбца e
из этой строки также проверяется, что e
меньше или равно k
, и если это так, то элемент d
добавляется в вектор, передаваемый функции apply
.
В конце кода вызывается функция sub-matrix
с заданными значениями аргументов (1 3 2 3)
, которые соответствуют строке 1, столбцам 3x3 и 2, и 3, и результат выводится на экран.
Список выводимых элементов подматрицы: [6 7 10 11 14 15]
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д