我正在尝试创建一个在AllegroCL中执行阻塞矩阵乘法的函数,但我不断得到数组索引错误。我相信这是因为20 x 20块矩阵的一侧为0-19,但我不确定如何修复它。
错误:访问时,数组索引20对于维度20来说太大了 #。 [条件类型:类型错误]
非常感谢任何帮助或方向。以下是我的代码。
(defun bmmul (A B)
(let* ((m (car (array-dimensions A)))
(n (cadr (array-dimensions A)))
(l (cadr (array-dimensions B)))
(u 0)
(C (make-array `(,m ,l) :initial-element 0)))
(loop for p from 0 to (- m n) do
(loop for i from (+ 0 1) to n do
(setf u (aref C i 0))
(loop for k from p to (- (+ p n) 1) do
(setf u (* (aref A i k) (aref B k 0))))
(setf (aref C i 0) u)))
C))
答案 0 :(得分:1)
通常,当循环遍历数组索引时,您转到:from 0 :below n
,其中n
是数组维度,因此当维度为20时,索引从0到包括19。
另一个问题似乎是在最里面的循环中,你想要incf
,而不是setf
。您也不需要临时变量(u
),只需要incf
数组单元格。
最后,我觉得你没有正确构建你的循环,我不希望在那里看到一个硬编码的0
索引。无论你是普通的还是阻塞的乘法,最里面的循环体应该看起来像(incf (aref c i j) (* (aref a i k) (aref b k j)))
。