我正在分析一个在NMatrix矩阵上进行大量数学运算的应用程序。
应用程序将大部分时间花在下面的代码中。
{add: :+, sub: :-, mul: :*, div: :/, pow: :**, mod: :%}.each_pair do |ewop, op|
define_method("__list_elementwise_#{ewop}__") do |rhs|
self.__list_map_merged_stored__(rhs, nil) { |l,r| l.send(op,r) }.cast(stype, NMatrix.upcast(dtype, rhs.dtype))
end
define_method("__dense_elementwise_#{ewop}__") do |rhs|
self.__dense_map_pair__(rhs) { |l,r| l.send(op,r) }.cast(stype, NMatrix.upcast(dtype, rhs.dtype))
end
define_method("__yale_elementwise_#{ewop}__") do |rhs|
self.__yale_map_merged_stored__(rhs, nil) { |l,r| l.send(op,r) }.cast(stype, NMatrix.upcast(dtype, rhs.dtype))
end
end
在上面的代码中,它说:
# Define the element-wise operations for lists. Note that the __list_map_merged_stored__ iterator returns a Ruby Object
# matrix, which we then cast back to the appropriate type. If you don't want that, you can redefine these functions in
# your own code.
我对NMatrix的内部结构并不熟悉,但似乎数学运算正在Ruby中执行。反正有加速这些方法吗?
答案 0 :(得分:1)
我们最初用C / C ++编写它们,但它需要一些非常复杂的宏,这些宏基本上是不可维护和错误的,并且大大增加了编译时间。
如果查看History.txt
,您将能够找到我们开始在Ruby中编写数学运算的版本。您可以使用先前的代码覆盖并在C / C ++中完全放置元素操作(您需要速度的地方)。
但是,如果在dtype :object
的矩阵上正常工作(没有崩溃),可能会遇到问题。
作为旁注,sciruby-dev Google Group(或nmatrix问题跟踪器)可能更适合像这样的问题。