2017-07-25 60 views
1

我想創建一個函數,在AllegroCL中執行阻塞矩陣乘法,但我不斷收到數組索引錯誤。我相信這是由於20×20塊矩陣的邊界爲0-19,但我不確定如何解決它。阻止矩陣乘法

錯誤:在訪問 #時數組索引20對於維數20來說太大。 [condition type:type-error]

任何幫助或方向是非常感謝。以下是我的代碼到目前爲止。

(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)) 
+2

在'LOOP'中,'to n'是包含性的。如果您想排除'n',請改用'below n'。 – jkiiski

回答

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