1

行列計算にAntikandを使用しています。Gsll

サブグリッドで算術演算を実行したい場合があります (たとえば、行列の列に 2.0 を掛けるなど)。今、私はこれらのコードを書かなければなりません:

(setf (grid:column mat 0) (gsll:elt* (grid:column mat 0) 2.0))

これらのコードによると、Antik最初に中間結果を格納するための一時的なグリッドを作成し、それを元の .bask に設定する必要がありmatます。マトリックスが巨大な場合、一時グリッドの作成が遅くなることがあります。ですから、これをオリジナルで直接行うことができれば幸いですmat

PS:gsll:elt*、たとえば、マトリックス全体に対してインプレース変更を行います。これは、が巨大な(gsll:elt* mat 2.0)場合でも非常に効率的です。mat

アップデート:

ここで実験の結果を示しています。

コード:

(let ((mat (grid:make-simple-grid
             :grid-type 'grid:foreign-array
             :initial-contents
             (loop repeat 100 collect
                   (loop repeat 100 collect
                         (random 100))))))
  (time (loop repeat 1000 do
              (gsll:elt* mat 2.0)
              (gsll:elt* mat 0.5)))
  (time (loop repeat 1000 do
              (setf (grid:row mat 0) (gsll:elt* (grid:row mat 0) 2.0))
              (setf (grid:row mat 0) (gsll:elt* (grid:row mat 0) 0.5)))))

結果:

Evaluation took:
  0.016 seconds of real time
  0.016000 seconds of total run time (0.016000 user, 0.000000 system)
  100.00% CPU
  46,455,124 processor cycles
  353,280 bytes consed

Evaluation took:
  0.446 seconds of real time
  0.444000 seconds of total run time (0.420000 user, 0.024000 system)
  [ Run times consist of 0.008 seconds GC time, and 0.436 seconds non-GC time. ]
  99.55% CPU
  1,308,042,508 processor cycles
  102,275,168 bytes consed

前者の計算は 100x100 マトリックス全体で行われることに注意してください。これは後者の計算よりもさらに高速です (1x100 サブマトリックスでのみ行われます)。そして後者は、一時ストレージの割り当てにより、はるかに多くのバイトを消費しました。

4

0 に答える 0