multidimensional-array - Common Lisp 中的非矩形数组? (用于教学目的的一般问题。)

标签 multidimensional-array common-lisp

只是为了完整起见,我想知道,是否有一种方法可以在 Common Lisp 中定义“参差不齐”或“参差不齐的数组”,就像在 Java 中描述的那样,例如这里:https://www.geeksforgeeks.org/jagged-array-in-java/

伴随着这个问题而来的是第二个问题,这样定义多维数组有什么好处呢?更有效的内存分配?或者“锯齿状数组”的想法本身有问题 - 至少在 Common Lisp 上下文中?

直到现在,我只能找到定义矩形多维数组的常规方法的描述 - 或者我忽略了我正在搜索的信息。

此刻,我想在 Common Lisp 中,如果这种非对称数据字段的复制似乎有用,人们会在常规多维数组中用 NIL 或 0 或类似的东西填充不需要的地方。 ...或者我可能会尝试用它们定义自定义结构来管理三个不同长度的向量。

如果这些都是愚蠢的想法,还有其他办法吗?或者是 Java 中的“参差不齐的数组”只是一个通常具有不同大小元素的嵌套向量 - 而 Common Lisp 中的多维数组也只是一个具有相同大小元素的嵌套向量,以及一些用于管理常规结构的有用抽象?

非常感谢您的回复。

最佳答案

因为它们是向量的向量,所以很容易定义。示例:

setter/getter

(defun jref (jarray i j)
  (aref (aref jarray i) j))

二传手

(defun (setf jref) (new-value jarray i j)
  (setf (aref (aref jarray i) j) new-value)) 

制作这样一个数组:(make-jarray '(3 (5 6 2))

(defun make-jarray (dimensions &key (initial-element 0))
  (make-array
   (first dimensions)
   :initial-contents (loop for d in (second dimensions)
                           collect (make-array
                                    d
                                    :initial-element initial-element))))

例子:

CL-USER > (let ((ja1 (make-jarray '(4 (3 2 4 5)))))
            (setf (jref ja1 0 1) 'hello)
            (setf (jref ja1 3 4) 'world)
            (incf (jref ja1 2 0) 42)
            (values ja1
                    (jref ja1 2 0)))

#(#(0 HELLO 0) #(0 0) #(42 0 0 0) #(0 0 0 0 WORLD))
42

关于multidimensional-array - Common Lisp 中的非矩形数组? (用于教学目的的一般问题。),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75111887/

相关文章:

javascript - 添加多维数组

common-lisp - Common Lisp map 车 ' vs #'

lisp - apply & funcall - 不同的结果

LISP:如何获得列表的总和? (没有全局变量)

lisp - 实现 forkpty() 的 GNU Common Lisp 包

string - Format polynomial to normal form> (如何让最后的结果在lisp中变成string?(包括所有函数))

c# - 快速加载/保存多维数组

javascript - 在条形图中显示多维数组(在 JavaScript 中)?

javascript - 多维和关联数组正确语法

python - 如何为CNN输入python制作3维数组