2017-07-25 1 views
1

Ich versuche, eine Funktion zu erstellen, die blocked Matrix-Multiplikation in AllegroCL ausführt, aber ich bekomme immer Array-Index-Fehler. Ich glaube, dass die Indizes für eine Seite einer 20 x 20-Blockmatrix 0-19 sind, aber ich bin nicht sicher, wie ich das beheben soll.Blocked Matrix Multiplication

Fehler: Array-Index 20 zu groß für Dimension 20 beim Zugriff auf #. [Bedingungstyp: Typ-Fehler]

Jede Hilfe oder Richtung wird sehr geschätzt. Unten ist mein Code soweit.

(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

In 'LOOP' ist' bis n' inklusive. Wenn Sie "n" ausschließen möchten, verwenden Sie stattdessen 'n '. – jkiiski

Antwort

1

Im Allgemeinen, wenn ein Array-Index Schleifen über, gehen Sie :from 0 :below n, wo n ist die Array-Dimension, so dass, wenn die Dimension 20 ist, geht der Index von 0 bis einschließlich 19.

Ein anderes Problem scheint zu sein, dass Sie in der innersten Schleife incf, nicht setf möchten. Sie brauchen dort auch keine temporäre Variable (u), nur incf die Array-Zelle direkt.

Schließlich habe ich nicht das Gefühl, dass Sie Ihre Loops richtig strukturiert, ich erwarte nicht, einen hartcodierten 0 Index dort zu sehen. Der innerste Schleifenkörper sollte wie (incf (aref c i j) (* (aref a i k) (aref b k j))) aussehen, unabhängig davon, ob Sie normale oder blockierte Multiplikation durchführen.