Grid 在Common Lisp中,我可以在子网格上执行就地算术运算吗?

Grid 在Common Lisp中,我可以在子网格上执行就地算术运算吗?,grid,common-lisp,in-place,Grid,Common Lisp,In Place,我使用Antik和Gsll进行矩阵计算 有时我想在子网格上做算术运算,例如,将矩阵的一列乘以2.0。现在我要写这些代码: (setf (grid:column mat 0) (gsll:elt* (grid:column mat 0) 2.0)) 根据这些代码,Antik必须首先创建一个用于存储中间结果的临时网格,然后将其设置为原始网格。当矩阵很大时,临时网格的创建可能会很慢。所以我希望我可以直接在原始的垫子上做这件事 PS:gsll:elt*对整个矩阵进行就地修改,例如gsll:elt*ma

我使用Antik和Gsll进行矩阵计算

有时我想在子网格上做算术运算,例如,将矩阵的一列乘以2.0。现在我要写这些代码:

(setf (grid:column mat 0) (gsll:elt* (grid:column mat 0) 2.0))
根据这些代码,Antik必须首先创建一个用于存储中间结果的临时网格,然后将其设置为原始网格。当矩阵很大时,临时网格的创建可能会很慢。所以我希望我可以直接在原始的垫子上做这件事

PS:gsll:elt*对整个矩阵进行就地修改,例如gsll:elt*mat 2.0,即使mat非常大,这也是非常有效的

更新: 我在这里展示我的实验结果:

代码:

结果:

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子矩阵上进行的计算还要快。由于分配了临时存储,后一种方法消耗了更多的字节。

您测试过调用elt*的效果了吗?我看不出一个很好的理由来假设它会修改一个完整的矩阵,但不会对一个部分矩阵进行修改。@Rörd我已经添加了我的测试结果。我的意思是,您是否测试过将setf grid:row mat 0 gsll:elt*grid:row mat 0 2.0替换为gsll:elt*grid:row mat 0 2.0是否仍会在矩阵上产生预期结果?如果你不使用setf,事情应该会更快。@Rörd我已经测试了你的案例,而垫子保持不变。我发现,如果我手动操作每个矩阵元素,速度会更快。是的,遗憾的是,GSLL在这方面似乎设计不当。elt*始终在适当位置运行,但仅在row返回的矩阵中的数据副本上运行。底层C库GSL具有返回视图而不是矩阵部分副本的函数,但这些函数在GSLL中没有表示。您可以创建elt*的一个变体,该变体将使用以下命令就地修改其子网格参数:define modify macro eltf*b elt*,但这将扩展为手动编写的相同setf操作。所以你只会得到一个较短的符号,但不会增加速度。
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