阻塞矩阵乘法

时间:2017-07-25 13:46:48

标签: matrix lisp common-lisp matrix-multiplication

我正在尝试创建一个在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))

1 个答案:

答案 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)))