nmatrix 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. data/.gitignore +27 -0
  2. data/.rspec +2 -0
  3. data/Gemfile +3 -5
  4. data/Guardfile +6 -0
  5. data/History.txt +33 -0
  6. data/Manifest.txt +41 -38
  7. data/README.rdoc +88 -11
  8. data/Rakefile +35 -53
  9. data/ext/nmatrix/data/complex.h +372 -0
  10. data/ext/nmatrix/data/data.cpp +275 -0
  11. data/ext/nmatrix/data/data.h +707 -0
  12. data/ext/nmatrix/data/rational.h +421 -0
  13. data/ext/nmatrix/data/ruby_object.h +446 -0
  14. data/ext/nmatrix/extconf.rb +101 -51
  15. data/ext/nmatrix/new_extconf.rb +56 -0
  16. data/ext/nmatrix/nmatrix.cpp +1609 -0
  17. data/ext/nmatrix/nmatrix.h +265 -849
  18. data/ext/nmatrix/ruby_constants.cpp +134 -0
  19. data/ext/nmatrix/ruby_constants.h +103 -0
  20. data/ext/nmatrix/storage/common.cpp +70 -0
  21. data/ext/nmatrix/storage/common.h +170 -0
  22. data/ext/nmatrix/storage/dense.cpp +665 -0
  23. data/ext/nmatrix/storage/dense.h +116 -0
  24. data/ext/nmatrix/storage/list.cpp +1088 -0
  25. data/ext/nmatrix/storage/list.h +129 -0
  26. data/ext/nmatrix/storage/storage.cpp +658 -0
  27. data/ext/nmatrix/storage/storage.h +99 -0
  28. data/ext/nmatrix/storage/yale.cpp +1601 -0
  29. data/ext/nmatrix/storage/yale.h +208 -0
  30. data/ext/nmatrix/ttable_helper.rb +126 -0
  31. data/ext/nmatrix/{yale/smmp1_header.template.c → types.h} +36 -9
  32. data/ext/nmatrix/util/io.cpp +295 -0
  33. data/ext/nmatrix/util/io.h +117 -0
  34. data/ext/nmatrix/util/lapack.h +1175 -0
  35. data/ext/nmatrix/util/math.cpp +557 -0
  36. data/ext/nmatrix/util/math.h +1363 -0
  37. data/ext/nmatrix/util/sl_list.cpp +475 -0
  38. data/ext/nmatrix/util/sl_list.h +255 -0
  39. data/ext/nmatrix/util/util.h +78 -0
  40. data/lib/nmatrix/blas.rb +70 -0
  41. data/lib/nmatrix/io/mat5_reader.rb +567 -0
  42. data/lib/nmatrix/io/mat_reader.rb +162 -0
  43. data/lib/{string.rb → nmatrix/monkeys.rb} +49 -2
  44. data/lib/nmatrix/nmatrix.rb +199 -0
  45. data/lib/nmatrix/nvector.rb +103 -0
  46. data/lib/nmatrix/version.rb +27 -0
  47. data/lib/nmatrix.rb +22 -230
  48. data/nmatrix.gemspec +59 -0
  49. data/scripts/mac-brew-gcc.sh +47 -0
  50. data/spec/4x4_sparse.mat +0 -0
  51. data/spec/4x5_dense.mat +0 -0
  52. data/spec/blas_spec.rb +47 -0
  53. data/spec/elementwise_spec.rb +164 -0
  54. data/spec/io_spec.rb +60 -0
  55. data/spec/lapack_spec.rb +52 -0
  56. data/spec/math_spec.rb +96 -0
  57. data/spec/nmatrix_spec.rb +93 -89
  58. data/spec/nmatrix_yale_spec.rb +52 -36
  59. data/spec/nvector_spec.rb +1 -1
  60. data/spec/slice_spec.rb +257 -0
  61. data/spec/spec_helper.rb +51 -0
  62. data/spec/utm5940.mtx +83844 -0
  63. metadata +113 -71
  64. data/.autotest +0 -23
  65. data/.gemtest +0 -0
  66. data/ext/nmatrix/cblas.c +0 -150
  67. data/ext/nmatrix/dense/blas_header.template.c +0 -52
  68. data/ext/nmatrix/dense/elementwise.template.c +0 -107
  69. data/ext/nmatrix/dense/gemm.template.c +0 -159
  70. data/ext/nmatrix/dense/gemv.template.c +0 -130
  71. data/ext/nmatrix/dense/rationalmath.template.c +0 -68
  72. data/ext/nmatrix/dense.c +0 -307
  73. data/ext/nmatrix/depend +0 -18
  74. data/ext/nmatrix/generator/syntax_tree.rb +0 -481
  75. data/ext/nmatrix/generator.rb +0 -594
  76. data/ext/nmatrix/list.c +0 -774
  77. data/ext/nmatrix/nmatrix.c +0 -1977
  78. data/ext/nmatrix/rational.c +0 -98
  79. data/ext/nmatrix/yale/complexmath.template.c +0 -71
  80. data/ext/nmatrix/yale/elementwise.template.c +0 -46
  81. data/ext/nmatrix/yale/elementwise_op.template.c +0 -73
  82. data/ext/nmatrix/yale/numbmm.template.c +0 -94
  83. data/ext/nmatrix/yale/smmp1.template.c +0 -21
  84. data/ext/nmatrix/yale/smmp2.template.c +0 -43
  85. data/ext/nmatrix/yale/smmp2_header.template.c +0 -46
  86. data/ext/nmatrix/yale/sort_columns.template.c +0 -56
  87. data/ext/nmatrix/yale/symbmm.template.c +0 -54
  88. data/ext/nmatrix/yale/transp.template.c +0 -68
  89. data/ext/nmatrix/yale.c +0 -726
  90. data/lib/array.rb +0 -67
  91. data/spec/syntax_tree_spec.rb +0 -46
@@ -0,0 +1,162 @@
1
+ require "packable"
2
+ # = NMatrix
3
+ #
4
+ # A linear algebra library for scientific computation in Ruby.
5
+ # NMatrix is part of SciRuby.
6
+ #
7
+ # NMatrix was originally inspired by and derived from NArray, by
8
+ # Masahiro Tanaka: http://narray.rubyforge.org
9
+ #
10
+ # == Copyright Information
11
+ #
12
+ # SciRuby is Copyright (c) 2010 - 2012, Ruby Science Foundation
13
+ # NMatrix is Copyright (c) 2012, Ruby Science Foundation
14
+ #
15
+ # Please see LICENSE.txt for additional copyright notices.
16
+ #
17
+ # == Contributing
18
+ #
19
+ # By contributing source code to SciRuby, you agree to be bound by
20
+ # our Contributor Agreement:
21
+ #
22
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
23
+ #
24
+ # == io/matlab/mat_reader.rb
25
+ #
26
+ # Base class for .mat file reading (Matlab files).
27
+ #
28
+
29
+ require 'packable'
30
+
31
+ module NMatrix::IO::Matlab
32
+ # Class for parsing a .mat file stream.
33
+ #
34
+ # The full format of .mat files is available here:
35
+ # * http://www.mathworks.com/help/pdf_doc/matlab/matfile_format.pdf
36
+ #
37
+ class MatReader
38
+ MDTYPE_UNPACK_ARGS = {
39
+ :miINT8 => [Integer, {:signed => true, :bytes => 1}],
40
+ :miUINT8 => [Integer, {:signed => false, :bytes => 1}],
41
+ :miINT16 => [Integer, {:signed => true, :bytes => 2}],
42
+ :miUINT16 => [Integer, {:signed => false, :bytes => 2}],
43
+ :miINT32 => [Integer, {:signed => true, :bytes => 4}],
44
+ :miUINT32 => [Integer, {:signed => false, :bytes => 4}],
45
+ :miSINGLE => [Float, {:precision => :single, :bytes => 4}],
46
+ :miDOUBLE => [Float, {:precision => :double, :bytes => 8}],
47
+ :miINT64 => [Integer, {:signed => true, :bytes => 8}],
48
+ :miUINT64 => [Integer, {:signed => false, :bytes => 8}]
49
+ }
50
+
51
+ DTYPE_PACK_ARGS = {
52
+ :byte => [Integer, {:signed => false, :bytes => 1}],
53
+ :int8 => [Integer, {:signed => true, :bytes => 1}],
54
+ :int16 => [Integer, {:signed => true, :bytes => 2}],
55
+ :int32 => [Integer, {:signed => true, :bytes => 4}],
56
+ :int64 => [Integer, {:signed => true, :bytes => 8}],
57
+ :float32 => [Float, {:precision => :single, :bytes => 4}],
58
+ :float64 => [Float, {:precision => :double, :bytes => 8}],
59
+ :complex64 => [Float, {:precision => :single, :bytes => 4}], #2x
60
+ :complex128 => [Float, {:precision => :double, :bytes => 8}]
61
+ }
62
+
63
+ ITYPE_PACK_ARGS = {
64
+ :uint8 => [Integer, {:signed => false, :bytes => 1}],
65
+ :uint16 => [Integer, {:signed => false, :bytes => 2}],
66
+ :uint32 => [Integer, {:signed => false, :bytes => 4}],
67
+ :uint64 => [Integer, {:signed => false, :bytes => 8}],
68
+ }
69
+
70
+ NO_REPACK = [:miINT8, :miUINT8, :miINT16, :miINT32, :miSINGLE, :miDOUBLE, :miINT64]
71
+
72
+ # Convert from MATLAB dtype to NMatrix dtype.
73
+ MDTYPE_TO_DTYPE = {
74
+ :miUINT8 => :byte,
75
+ :miINT8 => :int8,
76
+ :miINT16 => :int16,
77
+ :miUINT16 => :int16,
78
+ :miINT32 => :int32,
79
+ :miUINT32 => :int32,
80
+ :miINT64 => :int64,
81
+ :miUINT64 => :int64,
82
+ :miSINGLE => :float32,
83
+ :miDOUBLE => :float64
84
+ }
85
+
86
+ MDTYPE_TO_ITYPE = {
87
+ :miUINT8 => :uint8,
88
+ :miINT8 => :uint8,
89
+ :miINT16 => :uint16,
90
+ :miUINT16 => :uint16,
91
+ :miINT32 => :uint32,
92
+ :miUINT32 => :uint32,
93
+ :miINT64 => :uint64,
94
+ :miUINT64 => :uint64
95
+ }
96
+
97
+ # Before release v7.1 (release 14) matlab (TM) used the system
98
+ # default character encoding scheme padded out to 16-bits. Release 14
99
+ # and later use Unicode. When saving character data, R14 checks if it
100
+ # can be encoded in 7-bit ascii, and saves in that format if so.
101
+ MDTYPES = [
102
+ nil,
103
+ :miINT8,
104
+ :miUINT8,
105
+ :miINT16,
106
+ :miUINT16,
107
+ :miINT32,
108
+ :miUINT32,
109
+ :miSINGLE,
110
+ nil,
111
+ :miDOUBLE,
112
+ nil,
113
+ nil,
114
+ :miINT64,
115
+ :miUINT64,
116
+ :miMATRIX,
117
+ :miCOMPRESSED,
118
+ :miUTF8,
119
+ :miUTF16,
120
+ :miUTF32
121
+ ]
122
+
123
+ MCLASSES = [
124
+ nil,
125
+ :mxCELL,
126
+ :mxSTRUCT,
127
+ :mxOBJECT,
128
+ :mxCHAR,
129
+ :mxSPARSE,
130
+ :mxDOUBLE,
131
+ :mxSINGLE,
132
+ :mxINT8,
133
+ :mxUINT8,
134
+ :mxINT16,
135
+ :mxUINT16,
136
+ :mxINT32,
137
+ :mxUINT32,
138
+ :mxINT64,
139
+ :mxUINT64,
140
+ :mxFUNCTION,
141
+ :mxOPAQUE,
142
+ :mxOBJECT_CLASS_FROM_MATRIX_H
143
+ ]
144
+
145
+ attr_reader :byte_order
146
+
147
+ def initialize(stream, options = {})
148
+ raise ArgumentError, 'First arg must be IO.' unless stream.is_a?(::IO)
149
+
150
+ @stream = stream
151
+ @byte_order = options[:byte_order] || guess_byte_order
152
+ end
153
+
154
+ def guess_byte_order
155
+ # Assume native, since we don't know what type of file we have.
156
+ :native
157
+ end
158
+
159
+ protected
160
+ attr_reader :stream
161
+ end
162
+ end
@@ -20,10 +20,57 @@
20
20
  #
21
21
  # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
22
  #
23
- # == string.rb
23
+ # == monkeys.rb
24
24
  #
25
25
  # Ruby core extensions for NMatrix.
26
26
 
27
+ #######################
28
+ # Classes and Modules #
29
+ #######################
30
+
31
+ class Array
32
+ # Convert a Ruby Array to an NMatrix.
33
+ #
34
+ # You must provide a shape for the matrix as the first argument.
35
+ #
36
+ # == Arguments:
37
+ # <tt>shape</tt> :: Array describing matrix dimensions (or Fixnum for square) -- REQUIRED!
38
+ # <tt>dtype</tt> :: Override data type (e.g., to store a Float as :float32 instead of :float64) -- optional.
39
+ # <tt>stype</tt> :: Optional storage type (defaults to :dense)
40
+ def to_nm(shape, dtype = nil, stype = :dense)
41
+ dtype ||=
42
+ case self[0]
43
+ when Fixnum then :int64
44
+ when Float then :float64
45
+ when Rational then :rational128
46
+ when Complex then :complex128
47
+ end
48
+
49
+ matrix = NMatrix.new(:dense, shape, self, dtype)
50
+
51
+ if stype != :dense then matrix.cast(stype, dtype) else matrix end
52
+ end
53
+
54
+ unless method_defined?(:max)
55
+ def max
56
+ self.inject(self.first) { |m, n| if n > m then n else m end }
57
+ end
58
+ end
59
+
60
+ unless method_defined?(:min)
61
+ def min
62
+ self.inject(self.first) { |m, n| if n < m then n else m end }
63
+ end
64
+ end
65
+ end
66
+
67
+ class Object
68
+ def returning(value)
69
+ yield(value)
70
+ value
71
+ end
72
+ end
73
+
27
74
  class String #:nodoc:
28
75
  unless method_defined?(:constantize)
29
76
  # Based on constantize from ActiveSupport::Inflector
@@ -62,4 +109,4 @@ class String #:nodoc:
62
109
  word
63
110
  end
64
111
  end
65
- end
112
+ end
@@ -0,0 +1,199 @@
1
+ # = NMatrix
2
+ #
3
+ # A linear algebra library for scientific computation in Ruby.
4
+ # NMatrix is part of SciRuby.
5
+ #
6
+ # NMatrix was originally inspired by and derived from NArray, by
7
+ # Masahiro Tanaka: http://narray.rubyforge.org
8
+ #
9
+ # == Copyright Information
10
+ #
11
+ # SciRuby is Copyright (c) 2010 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, Ruby Science Foundation
13
+ #
14
+ # Please see LICENSE.txt for additional copyright notices.
15
+ #
16
+ # == Contributing
17
+ #
18
+ # By contributing source code to SciRuby, you agree to be bound by
19
+ # our Contributor Agreement:
20
+ #
21
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
+ #
23
+ # == nmatrix.rb
24
+ #
25
+ # This file adds a few additional pieces of functionality (e.g., inspect,
26
+ # pretty_print).
27
+
28
+ ############
29
+ # Requires #
30
+ ############
31
+
32
+ #######################
33
+ # Classes and Modules #
34
+ #######################
35
+
36
+ class NMatrix
37
+ # Read and write extensions for NMatrix. These are only loaded when needed.
38
+ module IO
39
+ module Matlab
40
+ class << self
41
+ def load_mat file_path
42
+ NMatrix::IO::Matlab::Mat5Reader.new(File.open(file_path, "rb+")).to_ruby
43
+ end
44
+ end
45
+
46
+ # FIXME: Remove autoloads
47
+ autoload :MatReader, 'nmatrix/io/mat_reader'
48
+ autoload :Mat5Reader, 'nmatrix/io/mat5_reader'
49
+ end
50
+ end
51
+
52
+ # TODO: Make this actually pretty.
53
+ def pretty_print(q = nil)
54
+ if dim != 2 || (dim == 2 && shape[1] > 10) # FIXME: Come up with a better way of restricting the display
55
+ inspect
56
+ else
57
+
58
+ arr = (0...shape[0]).map do |i|
59
+ ary = []
60
+ (0...shape[1]).each do |j|
61
+ o = begin
62
+ self[i, j]
63
+ rescue ArgumentError
64
+ nil
65
+ end
66
+ ary << (o.nil? ? 'nil' : o)
67
+ end
68
+ ary.inspect
69
+ end
70
+
71
+ if q.nil?
72
+ puts arr.join("\n")
73
+ else
74
+ q.group(1, "", "\n") do
75
+ q.seplist(arr, lambda { q.text " " }, :each) { |v| q.text v.to_s }
76
+ end
77
+ end
78
+
79
+ end
80
+ end
81
+ alias :pp :pretty_print
82
+
83
+
84
+ # Get the complex conjugate of this matrix. See also complex_conjugate! for
85
+ # an in-place operation (provided the dtype is already :complex64 or
86
+ # :complex128).
87
+ #
88
+ # Does not work on list matrices, but you can optionally pass in the type you
89
+ # want to cast to if you're dealing with a list matrix.
90
+ def complex_conjugate(new_stype = self.stype)
91
+ self.cast(new_stype, NMatrix::upcast(dtype, :complex64)).complex_conjugate!
92
+ end
93
+
94
+ # Calculate the conjugate transpose of a matrix. If your dtype is already
95
+ # complex, this should only require one copy (for the transpose).
96
+ def conjugate_transpose
97
+ self.transpose.complex_conjugate!
98
+ end
99
+
100
+ def hermitian?
101
+ return false if self.dim != 2 or self.shape[0] != self.shape[1]
102
+
103
+ if [:complex64, :complex128].include?(self.dtype)
104
+ # TODO: Write much faster Hermitian test in C
105
+ self.eql?(self.conjugate_transpose)
106
+ else
107
+ symmetric?
108
+ end
109
+ end
110
+
111
+ def inspect
112
+ original_inspect = super()
113
+ original_inspect = original_inspect[0...original_inspect.size-1]
114
+ original_inspect + inspect_helper.join(" ") + ">"
115
+ end
116
+
117
+ def __yale_ary__to_s(sym)
118
+ ary = self.send("__yale_#{sym.to_s}__".to_sym)
119
+
120
+ '[' + ary.collect { |a| a ? a : 'nil'}.join(',') + ']'
121
+ end
122
+
123
+ class << self
124
+ def load_file(file_path)
125
+ NMatrix::IO::Mat5Reader.new(File.open(file_path, 'rb')).to_ruby
126
+ end
127
+
128
+ # Helper function for loading a file in the first sparse format given here:
129
+ # http://math.nist.gov/MatrixMarket/formats.html
130
+ #
131
+ # Override type specifier (e.g., 'real') using :read_with => :to_f (or any other string-to-numeric conversion
132
+ # function), and with :dtype => :float32 or :dtype => :int8 to force storage in a lesser type.
133
+ def load_matrix_matrix_coordinate_file(filename, options = {})
134
+ f = File.new(filename, "r")
135
+
136
+ func = options[:read_with]
137
+ dtype = options[:dtype]
138
+
139
+ line = f.gets
140
+ raise IOError, 'Incorrect file type specifier.' unless line =~ /^%%MatrixMarket\ matrix\ coordinate/
141
+ spec = line.split
142
+
143
+ case spec[3]
144
+ when 'real'
145
+ func ||= :to_f
146
+ dtype ||= :float64
147
+ when 'integer'
148
+ func ||= :to_i
149
+ dtype ||= :int64
150
+ when 'complex'
151
+ func ||= :to_complex
152
+ dtype ||= :complex128
153
+ when 'rational'
154
+ func ||= :to_rational
155
+ dtype ||= :rational128
156
+ else
157
+ raise ArgumentError, 'Unrecognized dtype.'
158
+ end unless func and dtype
159
+
160
+ begin
161
+ line = f.gets
162
+ end while line =~ /^%/
163
+
164
+ # Close the file.
165
+ f.close
166
+
167
+ rows, cols, entries = line.split.collect { |x| x.to_i }
168
+
169
+ matrix = NMatrix.new(:yale, [rows, cols], entries, dtype)
170
+
171
+ entries.times do
172
+ i, j, v = line.split
173
+ matrix[i.to_i - 1, j.to_i - 1] = v.send(func)
174
+ end
175
+
176
+ matrix
177
+ end
178
+ end
179
+
180
+ protected
181
+ def inspect_helper
182
+ ary = []
183
+ ary << "shape:[#{shape.join(',')}]" << "dtype:#{dtype}" << "stype:#{stype}"
184
+
185
+ if stype == :yale
186
+ ary << "capacity:#{capacity}"
187
+
188
+ # These are enabled by the DEBUG_YALE compiler flag in extconf.rb.
189
+ if respond_to?(:__yale_a__)
190
+ ary << "ija:#{__yale_ary__to_s(:ija)}" << "ia:#{__yale_ary__to_s(:ia)}" <<
191
+ "ja:#{__yale_ary__to_s(:ja)}" << "a:#{__yale_ary__to_s(:a)}" << "d:#{__yale_ary__to_s(:d)}" <<
192
+ "lu:#{__yale_ary__to_s(:lu)}" << "yale_size:#{__yale_size__}"
193
+ end
194
+
195
+ end
196
+
197
+ ary
198
+ end
199
+ end
@@ -0,0 +1,103 @@
1
+ # = NMatrix
2
+ #
3
+ # A linear algebra library for scientific computation in Ruby.
4
+ # NMatrix is part of SciRuby.
5
+ #
6
+ # NMatrix was originally inspired by and derived from NArray, by
7
+ # Masahiro Tanaka: http://narray.rubyforge.org
8
+ #
9
+ # == Copyright Information
10
+ #
11
+ # SciRuby is Copyright (c) 2010 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, Ruby Science Foundation
13
+ #
14
+ # Please see LICENSE.txt for additional copyright notices.
15
+ #
16
+ # == Contributing
17
+ #
18
+ # By contributing source code to SciRuby, you agree to be bound by
19
+ # our Contributor Agreement:
20
+ #
21
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
+ #
23
+ # == nmatrix.rb
24
+ #
25
+ # This file defines the NVector class.
26
+
27
+ ############
28
+ # Requires #
29
+ ############
30
+
31
+
32
+ #######################
33
+ # Classes and Modules #
34
+ #######################
35
+
36
+ # This is a specific type of NMatrix in which only one dimension is not 1.
37
+ # Although it is stored as a dim-2, n x 1, matrix, it acts as a dim-1 vector
38
+ # of size n. If the @orientation flag is set to :row, it is stored as 1 x n
39
+ # instead of n x 1.
40
+ class NVector < NMatrix
41
+ def initialize(length, *args)
42
+ super(:dense, [length, 1], *args)
43
+ orientation
44
+ end
45
+
46
+ # Orientation defaults to column (e.g., [3,1] is a column of length 3). It
47
+ # may also be row, e.g., for [1,5].
48
+ def orientation
49
+ @orientation ||= :column
50
+ end
51
+
52
+ def transpose
53
+ t = super()
54
+ t.flip!
55
+ end
56
+
57
+ def transpose!
58
+ super()
59
+ self.flip!
60
+ end
61
+
62
+ def multiply(m)
63
+ t = super(m)
64
+ t.flip!
65
+ end
66
+
67
+ def multiply!(m)
68
+ super().flip!
69
+ end
70
+
71
+ def [](i)
72
+ case @orientation
73
+ when :column; super(i, 0)
74
+ when :row; super(0, i)
75
+ end
76
+ end
77
+
78
+ def []=(i, val)
79
+ case @orientation
80
+ when :column; super(i, 0, val)
81
+ when :row; super(0, i, val)
82
+ end
83
+ end
84
+
85
+ def dim; 1; end
86
+
87
+ # TODO: Make this actually pretty.
88
+ def pretty_print
89
+ dim = @orientation == :row ? 1 : 0
90
+
91
+ puts (0...shape[dim]).inject(Array.new) { |a, i| a << self[i] }.join(' ')
92
+ end
93
+
94
+ protected
95
+ def inspect_helper
96
+ super() << "orientation:#{self.orientation}"
97
+ end
98
+
99
+ def flip_orientation!
100
+ returning(self) { @orientation = @orientation == :row ? :column : :row }
101
+ end
102
+ alias :flip! :flip_orientation!
103
+ end
@@ -0,0 +1,27 @@
1
+ # = NMatrix
2
+ #
3
+ # A linear algebra library for scientific computation in Ruby.
4
+ # NMatrix is part of SciRuby.
5
+ #
6
+ # NMatrix was originally inspired by and derived from NArray, by
7
+ # Masahiro Tanaka: http://narray.rubyforge.org
8
+ #
9
+ # == Copyright Information
10
+ #
11
+ # SciRuby is Copyright (c) 2010 - 2012, Ruby Science Foundation
12
+ # NMatrix is Copyright (c) 2012, Ruby Science Foundation
13
+ #
14
+ # Please see LICENSE.txt for additional copyright notices.
15
+ #
16
+ # == Contributing
17
+ #
18
+ # By contributing source code to SciRuby, you agree to be bound by
19
+ # our Contributor Agreement:
20
+ #
21
+ # * https://github.com/SciRuby/sciruby/wiki/Contributor-Agreement
22
+ #
23
+
24
+ class NMatrix
25
+ VERSION = '0.0.2'
26
+ end
27
+