Как лучше хранить квадратные матрицы и находить в них подматрицы? - 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].