lib/eigen.rb in ruby-eigen-0.0.10 vs lib/eigen.rb in ruby-eigen-0.0.11.pre1

- old
+ new

@@ -14,10 +14,11 @@ col_size = ms.inject(0){|sum, m| m.cols + sum } row_size = ms[0].rows ret = new(row_size, col_size) col_ind = 0 ms.each{|m| + raise Eigen::EigenRuntimeError, "row sizes are different" unless row_size == m.rows ret[0,col_ind] = m col_ind += m.cols } return ret end @@ -26,10 +27,11 @@ row_size = ms.inject(0){|sum, m| m.rows + sum } col_size = ms[0].cols ret = new(row_size, col_size) row_ind = 0 ms.each{|m| + raise Eigen::EigenRuntimeError, "col sizes are different" unless col_size == m.cols ret[row_ind,0] = m row_ind += m.rows } return ret end @@ -165,6 +167,39 @@ end class Eigen::VectorComplex extend Eigen::VectorConstructor include Eigen::VectorCommon +end + +module Eigen::SpMatrixCommon + + def setFromTriplet(arry) + arry0 = arry.sort{|a, b| + ret = a[1] <=> b[1] + ret == 0 ? a[0] <=> b[0] : ret + } + each_col_size = Array.new(cols(), 0) + arry0.slice_when{|a, b| a[1] != b[1] }.each{|e| + each_col_size[ e[0][1] ] = e.size + } + reserve( each_col_size ) + arry0.each{|e| + __insert__(e[0], e[1], e[2]) + } + end + + def reserve( arg ) + if arg.respond_to?(:to_int) + return __reserve__( arg ) + end + raise Eigen::EigenRuntimeError unless arg.size == cols() + __reserve__( arg ) + end + +end + + +class Eigen::SpMatrixDouble + include Eigen::SpMatrixCommon + private "__reserve__", "__insert__" end