```るびきちです。

NMatrixで行列の指定をMATLABライクに行うNMatrix.parseを書いてみました。

# 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

```