るびきちです。

NMatrixで行列の指定をMATLABライクに行うNMatrix.parseを書いてみました。
整数値を入力してもdouble/dcomplexとなります。

# Ruby/LAPACK手許にありますが、公開はしばらくお待ちください。

#!/usr/bin/env ruby
=begin
= nmatrix-parse.rb
$Id: nmatrix-parse.rb,v 1.3 2002/01/02 11:44:26 rubikitch Exp $

NMatrix/NVectorをMATLAB形式で入力する。
== 使い方
  a = NMatrix %[1 2 3; 4 5 6; 7 8 9]

  => NMatrix.float(3,3): 
     [ [ 1.0, 4.0, 7.0 ], 
       [ 2.0, 5.0, 8.0 ], 
       [ 3.0, 6.0, 9.0 ] ]
=end
require 'narray'

class << NMatrix

  NUMBER_REGEXP = /^([+-]?[0-9\.]+)$/
  COMPLEX_REGEXP = /^#{NUMBER_REGEXP.source[1..-2]}([+-]#{NUMBER_REGEXP.source[1..-2]}?)i$/o

  def elm_conv( elm )
    case elm
    when NUMBER_REGEXP
      $1.to_f
    when COMPLEX_REGEXP
      case $2
      when "+"                  # ex. 1+i
        Complex.new( $1.to_f, 1.0 )
      when "-"                  # ex. 1-i
        Complex.new( $1.to_f, -1.0 )
      else
        Complex.new( $1.to_f, $2.to_f )
      end
    else
      raise ArgumentError, "NMatrix.parse: '#{elm}' is not number."
    end
  end
  private :elm_conv


  def parse( str )
    row_size = nil
    ary = []
    str.split(/;/).each do |row|
      row_elms = row.split
      raise ArgumentError, "NMatrix.parse: row size is mismatch!" if row_size && row_size != row_elms.size
      row_size = row_elms.size

      row_elms.each_with_index do |elm, j|
        ( ary[j] ||= [] ) << elm_conv(elm)
      end
    end

    NMatrix.to_na ary  
  end

end