【问题标题】:Blocked Matrix Multiplication块矩阵乘法
【发布时间】:2017-07-25 13:46:47
【问题描述】:

我正在尝试在 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))

【问题讨论】:

  • LOOP 中,to n 包含在内。如果要排除n,请改用below n

标签: matrix lisp common-lisp matrix-multiplication


【解决方案1】:

一般来说,在遍历数组索引时,你会转到:from 0 :below n,其中n 是数组维度,所以当维度为 20 时,索引会从 0 到 19,包括 19。

另一个问题似乎是在最里面的循环中,你想要incf,而不是setf。你也不需要一个临时变量(u),直接incf数组单元。

最后,我认为您的循环结构不正确,我不希望在那里看到硬编码的0 索引。最里面的循环体应该看起来像(incf (aref c i j) (* (aref a i k) (aref b k j))),不管你是做普通乘法还是阻塞乘法。

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 2023-03-14
    • 1970-01-01
    • 2018-05-20
    • 2018-04-11
    • 2017-03-11
    • 2013-12-23
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多