2017-07-25 20 views
1

AllegroCLでブロック行列乗算を実行する関数を作成しようとしていますが、配列インデックスエラーが発生しています。私はそれが20×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)) 
+2

'LOOP'では、' to n 'がインクルードされています。 'n 'を除外したい場合は、代わりに' below n'を使います。 – jkiiski

答えて

1

配列のインデックスをループするとき、あなたは:from 0 :below nを行く、どこnは、配列の次元であるので、寸法が20であるとき、インデックスは最大0から行くと19

含みます別の問題は、最も内側のループではであり、setfではないとします。また、一時変数(u)は必要ありません。アレイセルは直接incfになります。

最後に、あなたのループを正しく構成しているとは思わないが、そこにハードコードされた0インデックスがあるとは思わない。最も内側のループ本体は、普通のブロック化を行ったかブロックした乗算を行ったかにかかわらず、(incf (aref c i j) (* (aref a i k) (aref b k j)))のようになります。