Печать значения i-й строки j-го столбца в lisp

Я беру ввод N как количество строк 2D-матрицы в lisp, где каждая строка может содержать максимум 5 элементов. Поэтому я делаю это так. Теперь для каждой строки может быть любое количество элементов от 0 до 5. Поэтому я создал отдельный массив для хранения размера каждой строки 2D-матрицы и увеличиваю его всякий раз, когда я нажимаю на него любой элемент.

(setq myMatrix (make-array (list N 5)))

(setq sizeArray (make-list N:initial-element 0))

Теперь, когда мне нужно добавить элементы в любую строку, я ввожу ввод, пока в строке есть максимальное количество элементов, или пользователь сам выходит, чтобы ввести дополнительные элементы в эту строку. Чтобы добавить элемент в i-ю строку, я делаю что-то вроде этого:

(setf (aref myMatrix i (nth i sizeArray)) "Hi")
// Hi is just for example here
(setf (nth i sizeArray) (+ 1 (nth i sizeArray))) 

Теперь я хочу напечатать, скажем, i-ю строку этой myMatrix. Вот так:

Item 1 : myMatrix[i][0]
Item 2 : myMatrix[i][1]..and so on

Напрямую мне нужно j-е значение i-й строки. Как мы можем получить это в lisp?


person ms8    schedule 03.06.2015    source источник
comment
Прежде всего, если количество элементов в строке может быть разным для разных строк, это не матрица. Вероятно, вам нужен вектор расширяемых векторов или списков (5 — не такое уж большое число, поэтому вы можете позволить себе использовать списки, на самом деле это может быть даже быстрее, чем векторный подход).   -  person Mark Karpov    schedule 03.06.2015


Ответы (1)


Поскольку вы используете массив списков, как насчет:

(defun element-of-matrix (matrix i j)
  (nth j (aref matrix i)))
person Adax    schedule 03.06.2015
comment
Получил ошибку, что AREF: получил 1 индекс, но #2A((ABC NIL NIL) (D E NIL NIL NIL)) имеет ранг 2 - person ms8; 04.06.2015
comment
тогда вы используете массив массивов, а не массив списков: вам просто нужно: (aref matrix i j) пример › (setf a (make-array '(2 2))) #2A((NIL NIL) (NIL NIL )) ›(setf (aref a 1 1) привет) привет ›(aref a 1 1) привет - person Adax; 04.06.2015
comment
Это не массив массивов, а двумерный массив. - person Svante; 04.06.2015
comment
Действительно, сванте, это двумерный массив, мой плохой. - person Adax; 04.06.2015