nmatrix 0.0.9 → 0.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -0
- data/History.txt +95 -1
- data/LICENSE.txt +2 -2
- data/README.rdoc +24 -26
- data/Rakefile +32 -16
- data/ext/nmatrix/data/complex.h +2 -2
- data/ext/nmatrix/data/data.cpp +27 -51
- data/ext/nmatrix/data/data.h +92 -4
- data/ext/nmatrix/data/meta.h +2 -2
- data/ext/nmatrix/data/rational.h +2 -2
- data/ext/nmatrix/data/ruby_object.h +2 -2
- data/ext/nmatrix/extconf.rb +87 -86
- data/ext/nmatrix/math.cpp +45 -40
- data/ext/nmatrix/math/asum.h +3 -3
- data/ext/nmatrix/math/geev.h +2 -2
- data/ext/nmatrix/math/gemm.h +6 -2
- data/ext/nmatrix/math/gemv.h +6 -2
- data/ext/nmatrix/math/ger.h +2 -2
- data/ext/nmatrix/math/gesdd.h +2 -2
- data/ext/nmatrix/math/gesvd.h +2 -2
- data/ext/nmatrix/math/getf2.h +2 -2
- data/ext/nmatrix/math/getrf.h +2 -2
- data/ext/nmatrix/math/getri.h +2 -2
- data/ext/nmatrix/math/getrs.h +7 -3
- data/ext/nmatrix/math/idamax.h +2 -2
- data/ext/nmatrix/math/inc.h +12 -6
- data/ext/nmatrix/math/laswp.h +2 -2
- data/ext/nmatrix/math/long_dtype.h +2 -2
- data/ext/nmatrix/math/math.h +16 -10
- data/ext/nmatrix/math/nrm2.h +3 -3
- data/ext/nmatrix/math/potrs.h +7 -3
- data/ext/nmatrix/math/rot.h +2 -2
- data/ext/nmatrix/math/rotg.h +2 -2
- data/ext/nmatrix/math/scal.h +2 -2
- data/ext/nmatrix/math/swap.h +2 -2
- data/ext/nmatrix/math/trsm.h +7 -3
- data/ext/nmatrix/nm_memory.h +60 -0
- data/ext/nmatrix/nmatrix.cpp +13 -47
- data/ext/nmatrix/nmatrix.h +37 -12
- data/ext/nmatrix/ruby_constants.cpp +4 -2
- data/ext/nmatrix/ruby_constants.h +4 -2
- data/ext/nmatrix/ruby_nmatrix.c +937 -170
- data/ext/nmatrix/storage/common.cpp +2 -2
- data/ext/nmatrix/storage/common.h +2 -2
- data/ext/nmatrix/storage/{dense.cpp → dense/dense.cpp} +253 -100
- data/ext/nmatrix/storage/{dense.h → dense/dense.h} +6 -5
- data/ext/nmatrix/storage/{list.cpp → list/list.cpp} +517 -98
- data/ext/nmatrix/storage/{list.h → list/list.h} +13 -6
- data/ext/nmatrix/storage/storage.cpp +48 -19
- data/ext/nmatrix/storage/storage.h +4 -4
- data/ext/nmatrix/storage/yale/class.h +112 -43
- data/ext/nmatrix/storage/yale/iterators/base.h +2 -2
- data/ext/nmatrix/storage/yale/iterators/iterator.h +2 -2
- data/ext/nmatrix/storage/yale/iterators/row.h +2 -2
- data/ext/nmatrix/storage/yale/iterators/row_stored.h +2 -2
- data/ext/nmatrix/storage/yale/iterators/row_stored_nd.h +4 -3
- data/ext/nmatrix/storage/yale/iterators/stored_diagonal.h +2 -2
- data/ext/nmatrix/storage/yale/math/transpose.h +2 -2
- data/ext/nmatrix/storage/yale/yale.cpp +343 -52
- data/ext/nmatrix/storage/yale/yale.h +7 -3
- data/ext/nmatrix/types.h +2 -2
- data/ext/nmatrix/util/io.cpp +5 -5
- data/ext/nmatrix/util/io.h +2 -2
- data/ext/nmatrix/util/sl_list.cpp +40 -27
- data/ext/nmatrix/util/sl_list.h +3 -3
- data/ext/nmatrix/util/util.h +2 -2
- data/lib/nmatrix.rb +2 -2
- data/lib/nmatrix/blas.rb +2 -2
- data/lib/nmatrix/enumerate.rb +17 -6
- data/lib/nmatrix/io/market.rb +2 -3
- data/lib/nmatrix/io/mat5_reader.rb +2 -2
- data/lib/nmatrix/io/mat_reader.rb +2 -2
- data/lib/nmatrix/lapack.rb +46 -46
- data/lib/nmatrix/math.rb +213 -20
- data/lib/nmatrix/monkeys.rb +24 -2
- data/lib/nmatrix/nmatrix.rb +394 -9
- data/lib/nmatrix/nvector.rb +2 -64
- data/lib/nmatrix/rspec.rb +2 -2
- data/lib/nmatrix/shortcuts.rb +14 -61
- data/lib/nmatrix/version.rb +11 -3
- data/lib/nmatrix/yale_functions.rb +4 -4
- data/nmatrix.gemspec +2 -7
- data/scripts/mac-brew-gcc.sh +11 -8
- data/scripts/mac-mavericks-brew-gcc.sh +22 -0
- data/spec/00_nmatrix_spec.rb +116 -7
- data/spec/01_enum_spec.rb +17 -3
- data/spec/02_slice_spec.rb +11 -3
- data/spec/blas_spec.rb +5 -2
- data/spec/elementwise_spec.rb +5 -2
- data/spec/io_spec.rb +27 -17
- data/spec/lapack_spec.rb +157 -9
- data/spec/math_spec.rb +95 -4
- data/spec/nmatrix_yale_spec.rb +21 -26
- data/spec/rspec_monkeys.rb +27 -0
- data/spec/rspec_spec.rb +2 -2
- data/spec/shortcuts_spec.rb +5 -10
- data/spec/slice_set_spec.rb +6 -2
- data/spec/spec_helper.rb +3 -2
- data/spec/stat_spec.rb +174 -158
- metadata +15 -15
data/lib/nmatrix/nvector.rb
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
#
|
10
10
|
# == Copyright Information
|
11
11
|
#
|
12
|
-
# SciRuby is Copyright (c) 2010 -
|
13
|
-
# NMatrix is Copyright (c)
|
12
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
13
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
14
14
|
#
|
15
15
|
# Please see LICENSE.txt for additional copyright notices.
|
16
16
|
#
|
@@ -159,68 +159,6 @@ class NVector < NMatrix
|
|
159
159
|
min_so_far
|
160
160
|
end
|
161
161
|
|
162
|
-
#
|
163
|
-
# call-seq:
|
164
|
-
# absolute_sum -> Numeric
|
165
|
-
#
|
166
|
-
# == Arguments
|
167
|
-
# - +incx+ -> the skip size (defaults to 1, no skip)
|
168
|
-
# - +n+ -> the number of elements to include
|
169
|
-
#
|
170
|
-
# Return the sum of the contents of the vector. This is the BLAS asum routine.
|
171
|
-
def asum incx=1, n=nil
|
172
|
-
NMatrix::BLAS::asum(self, incx, self.size / incx)
|
173
|
-
end
|
174
|
-
alias :absolute_sum :asum
|
175
|
-
|
176
|
-
#
|
177
|
-
# call-seq:
|
178
|
-
# norm2 -> Numeric
|
179
|
-
#
|
180
|
-
# == Arguments
|
181
|
-
# - +incx+ -> the skip size (defaults to 1, no skip)
|
182
|
-
# - +n+ -> the number of elements to include
|
183
|
-
#
|
184
|
-
# Return the 2-norm of the vector. This is the BLAS nrm2 routine.
|
185
|
-
def nrm2 incx=1, n=nil
|
186
|
-
NMatrix::BLAS::nrm2(self, incx, self.size / incx)
|
187
|
-
end
|
188
|
-
alias :norm2 :nrm2
|
189
|
-
|
190
|
-
|
191
|
-
#
|
192
|
-
# call-seq:
|
193
|
-
# sorted_indices -> Array
|
194
|
-
#
|
195
|
-
# Returns an array of the indices ordered by value sorted.
|
196
|
-
#
|
197
|
-
def sorted_indices
|
198
|
-
ary = self.to_a
|
199
|
-
ary.each_index.sort_by { |i| ary[i] } # from: http://stackoverflow.com/a/17841159/170300
|
200
|
-
end
|
201
|
-
|
202
|
-
#
|
203
|
-
# call-seq:
|
204
|
-
# binned_sorted_indices -> Array
|
205
|
-
#
|
206
|
-
# Returns an array of arrays of indices ordered by value sorted. Functions basically like +sorted_indices+, but
|
207
|
-
# groups indices together for those values that are the same.
|
208
|
-
#
|
209
|
-
def binned_sorted_indices
|
210
|
-
ary = self.to_a
|
211
|
-
ary2 = []
|
212
|
-
last_bin = ary.each_index.sort_by { |i| [ary[i]] }.inject([]) do |result, element|
|
213
|
-
if result.empty? || ary[result[-1]] == ary[element]
|
214
|
-
result << element
|
215
|
-
else
|
216
|
-
ary2 << result
|
217
|
-
[element]
|
218
|
-
end
|
219
|
-
end
|
220
|
-
ary2 << last_bin unless last_bin.empty?
|
221
|
-
ary2
|
222
|
-
end
|
223
|
-
|
224
162
|
|
225
163
|
# TODO: Make this actually pretty.
|
226
164
|
def pretty_print(q = nil) #:nodoc:
|
data/lib/nmatrix/rspec.rb
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
#
|
9
9
|
# == Copyright Information
|
10
10
|
#
|
11
|
-
# SciRuby is Copyright (c) 2010 -
|
12
|
-
# NMatrix is Copyright (c) 2012, Ruby Science Foundation
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
13
13
|
#
|
14
14
|
# Please see LICENSE.txt for additional copyright notices.
|
15
15
|
#
|
data/lib/nmatrix/shortcuts.rb
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
#
|
10
10
|
# == Copyright Information
|
11
11
|
#
|
12
|
-
# SciRuby is Copyright (c) 2010 -
|
13
|
-
# NMatrix is Copyright (c)
|
12
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
13
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
14
14
|
#
|
15
15
|
# Please see LICENSE.txt for additional copyright notices.
|
16
16
|
#
|
@@ -295,6 +295,14 @@ class NMatrix
|
|
295
295
|
# call-seq:
|
296
296
|
# seq(shape) -> NMatrix
|
297
297
|
# seq(shape, options) -> NMatrix
|
298
|
+
# bindgen(shape) -> NMatrix of :byte
|
299
|
+
# indgen(shape) -> NMatrix of :int64
|
300
|
+
# findgen(shape) -> NMatrix of :float32
|
301
|
+
# dindgen(shape) -> NMatrix of :float64
|
302
|
+
# cindgen(shape) -> NMatrix of :complex64
|
303
|
+
# zindgen(shape) -> NMatrix of :complex128
|
304
|
+
# rindgen(shape) -> NMatrix of :rational128
|
305
|
+
# rbindgen(shape) -> NMatrix of :object
|
298
306
|
#
|
299
307
|
# Creates a matrix filled with a sequence of integers starting at zero.
|
300
308
|
#
|
@@ -322,66 +330,11 @@ class NMatrix
|
|
322
330
|
NMatrix.new(shape, values, {:stype => :dense}.merge(options))
|
323
331
|
end
|
324
332
|
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
# Returns an integer NMatrix. Equivalent to <tt>seq(n, dtype: :int32)</tt>.
|
330
|
-
#
|
331
|
-
# * *Arguments* :
|
332
|
-
# - +shape+ -> Shape of the sequence.
|
333
|
-
# * *Returns* :
|
334
|
-
# - NMatrix with dtype +:int32+.
|
335
|
-
#
|
336
|
-
def indgen(shape)
|
337
|
-
NMatrix.seq(shape, dtype: :int32)
|
338
|
-
end
|
339
|
-
|
340
|
-
#
|
341
|
-
# call-seq:
|
342
|
-
# findgen(shape) -> NMatrix
|
343
|
-
#
|
344
|
-
# Returns a float NMatrix. Equivalent to <tt>seq(n, dtype: :float32)</tt>.
|
345
|
-
#
|
346
|
-
# * *Arguments* :
|
347
|
-
# - +shape+ -> Shape of the sequence.
|
348
|
-
# * *Returns* :
|
349
|
-
# - NMatrix with dtype +:float32+.
|
350
|
-
#
|
351
|
-
def findgen(shape)
|
352
|
-
NMatrix.seq(shape, dtype: :float32)
|
333
|
+
{:bindgen => :byte, :indgen => :int64, :findgen => :float32, :dindgen => :float64,
|
334
|
+
:cindgen => :complex64, :zindgen => :complex128,
|
335
|
+
:rindgen => :rational128, :rbindgen => :object}.each_pair do |meth, dtype|
|
336
|
+
define_method(meth) { |shape| NMatrix.seq(shape, :dtype => dtype) }
|
353
337
|
end
|
354
|
-
|
355
|
-
#
|
356
|
-
# call-seq:
|
357
|
-
# bindgen(size) -> NMatrix
|
358
|
-
#
|
359
|
-
# Returns a byte NMatrix. Equivalent to <tt>seq(n, dtype: :byte)</tt>.
|
360
|
-
#
|
361
|
-
# * *Arguments* :
|
362
|
-
# - +size+ -> Shape of the sequence.
|
363
|
-
# * *Returns* :
|
364
|
-
# - NMatrix with dtype +:byte+.
|
365
|
-
#
|
366
|
-
def bindgen(shape)
|
367
|
-
NMatrix.seq(shape, dtype: :byte)
|
368
|
-
end
|
369
|
-
|
370
|
-
#
|
371
|
-
# call-seq:
|
372
|
-
# cindgen(shape) -> NMatrix
|
373
|
-
#
|
374
|
-
# Returns a complex NMatrix. Equivalent to <tt>seq(n, dtype: :complex64)</tt>.
|
375
|
-
#
|
376
|
-
# * *Arguments* :
|
377
|
-
# - +shape+ -> Shape of the sequence.
|
378
|
-
# * *Returns* :
|
379
|
-
# - NMatrix with dtype +:complex64+.
|
380
|
-
#
|
381
|
-
def cindgen(shape)
|
382
|
-
NMatrix.seq(shape, dtype: :complex64)
|
383
|
-
end
|
384
|
-
|
385
338
|
end
|
386
339
|
end
|
387
340
|
|
data/lib/nmatrix/version.rb
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
#
|
10
10
|
# == Copyright Information
|
11
11
|
#
|
12
|
-
# SciRuby is Copyright (c) 2010 -
|
13
|
-
# NMatrix is Copyright (c)
|
12
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
13
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
14
14
|
#
|
15
15
|
# Please see LICENSE.txt for additional copyright notices.
|
16
16
|
#
|
@@ -26,6 +26,14 @@ class NMatrix
|
|
26
26
|
# Note that the format of the VERSION string is needed for NMatrix
|
27
27
|
# native IO. If you change the format, please make sure that native
|
28
28
|
# IO can still understand NMatrix::VERSION.
|
29
|
-
VERSION = "0.0
|
29
|
+
#VERSION = "0.1.0"
|
30
|
+
module VERSION
|
31
|
+
MAJOR = 0
|
32
|
+
MINOR = 1
|
33
|
+
TINY = 0
|
34
|
+
PRE = "rc1"
|
35
|
+
|
36
|
+
STRING = [MAJOR, MINOR, TINY, PRE].compact.join(".")
|
37
|
+
end
|
30
38
|
end
|
31
39
|
|
@@ -9,8 +9,8 @@
|
|
9
9
|
#
|
10
10
|
# == Copyright Information
|
11
11
|
#
|
12
|
-
# SciRuby is Copyright (c) 2010 -
|
13
|
-
# NMatrix is Copyright (c)
|
12
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
13
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
14
14
|
#
|
15
15
|
# Please see LICENSE.txt for additional copyright notices.
|
16
16
|
#
|
@@ -81,7 +81,7 @@ module NMatrix::YaleFunctions
|
|
81
81
|
# Returns the diagonal and non-digonal column indices stored in a given row.
|
82
82
|
def yale_ja_d_keys_at i
|
83
83
|
ary = yale_nd_row(i, :keys)
|
84
|
-
return ary if i >= self.shape[1] || self[i,i]
|
84
|
+
return ary if i >= self.shape[1] || self[i,i] == self.default_value
|
85
85
|
ary << i
|
86
86
|
end
|
87
87
|
alias :yale_row_as_array :yale_ja_d_keys_at
|
@@ -112,7 +112,7 @@ module NMatrix::YaleFunctions
|
|
112
112
|
# Returns the diagonal and non-diagonal column indices and entries stored in a given row.
|
113
113
|
def yale_row_as_hash i
|
114
114
|
h = yale_nd_row(i, :hash)
|
115
|
-
return h if i >= self.shape[1] || self[i,i]
|
115
|
+
return h if i >= self.shape[1] || self[i,i] == self.default_value
|
116
116
|
h[i] = self[i,i]
|
117
117
|
end
|
118
118
|
end
|
data/nmatrix.gemspec
CHANGED
@@ -5,22 +5,17 @@ require 'nmatrix/version'
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |gem|
|
7
7
|
gem.name = "nmatrix"
|
8
|
-
gem.version = NMatrix::VERSION
|
8
|
+
gem.version = NMatrix::VERSION::STRING
|
9
9
|
gem.summary = "NMatrix is an experimental linear algebra library for Ruby, written mostly in C."
|
10
10
|
gem.description = "NMatrix is an experimental linear algebra library for Ruby, written mostly in C."
|
11
11
|
gem.homepage = 'http://sciruby.com'
|
12
12
|
gem.authors = ['John Woods', 'Chris Wailes', 'Aleksey Timin']
|
13
13
|
gem.email = ['john.o.woods@gmail.com']
|
14
|
+
gem.license = 'BSD 2-clause'
|
14
15
|
gem.post_install_message = <<-EOF
|
15
16
|
***********************************************************
|
16
17
|
Welcome to SciRuby: Tools for Scientific Computing in Ruby!
|
17
18
|
|
18
|
-
*** WARNING ***
|
19
|
-
Please be aware that NMatrix is in ALPHA status. If you're
|
20
|
-
thinking of using NMatrix to write mission critical code,
|
21
|
-
such as for driving a car or flying a space shuttle, you
|
22
|
-
may wish to choose other software (for now).
|
23
|
-
|
24
19
|
NMatrix requires a C compiler, and has been tested only
|
25
20
|
with GCC 4.6+. We are happy to accept contributions
|
26
21
|
which improve the portability of this project.
|
data/scripts/mac-brew-gcc.sh
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
#!/bin/bash
|
2
|
-
|
2
|
+
|
3
|
+
# Script will not work for GCC 4.8 or 4.9. For those, please see
|
4
|
+
# mac-mavericks-brew-gcc.sh
|
5
|
+
|
6
|
+
VERSION="4.7.2" # Script should also work with GCC 4.7.1.
|
3
7
|
PREFIX="/usr/gcc-${VERSION}"
|
4
8
|
LANGUAGES="c,c++,fortran"
|
5
9
|
MAKE="make -j 4"
|
@@ -8,11 +12,9 @@ brew-path() { brew info $1 | head -n3 | tail -n1 | cut -d' ' -f1; }
|
|
8
12
|
|
9
13
|
# Prerequisites
|
10
14
|
|
11
|
-
brew install gmp
|
12
|
-
brew install mpfr
|
13
|
-
brew install libmpc
|
15
|
+
brew install gmp mpfr libmpc
|
14
16
|
|
15
|
-
#
|
17
|
+
# Next, download & install the latest GCC:
|
16
18
|
|
17
19
|
mkdir -p $PREFIX
|
18
20
|
mkdir temp-gcc
|
@@ -25,11 +27,12 @@ cd gcc-$VERSION
|
|
25
27
|
mkdir build
|
26
28
|
cd build
|
27
29
|
|
30
|
+
# Older versions of brew need brew-path instead of brew --prefix.
|
28
31
|
../configure \
|
29
32
|
--prefix=$PREFIX \
|
30
|
-
--with-gmp=$(brew
|
31
|
-
--with-mpfr=$(brew
|
32
|
-
--with-mpc=$(brew
|
33
|
+
--with-gmp=$(brew --prefix gmp) \
|
34
|
+
--with-mpfr=$(brew --prefix mpfr) \
|
35
|
+
--with-mpc=$(brew --prefix libmpc) \
|
33
36
|
--program-suffix=-$VERSION \
|
34
37
|
--enable-languages=$LANGUAGES \
|
35
38
|
--with-system-zlib \
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
brew-path() { brew info $1 | head -n3 | tail -n1 | cut -d' ' -f1; }
|
4
|
+
|
5
|
+
# Try using the following for GCC 4.9:
|
6
|
+
#
|
7
|
+
# brew install gmp4 mpfr2 libmpc08 isl011 cloog018
|
8
|
+
#
|
9
|
+
#
|
10
|
+
|
11
|
+
brew install gcc49 --enable-fortran
|
12
|
+
# Source for this is: http://stackoverflow.com/questions/19535422/os-x-10-9-gcc-links-to-clang
|
13
|
+
|
14
|
+
|
15
|
+
# You may wish to re-install your Ruby if you're using rbenv. To do
|
16
|
+
# so, make sure you've installed openssl, readline, and libyaml.
|
17
|
+
#
|
18
|
+
# The commands for this are:
|
19
|
+
#
|
20
|
+
# CC=gcc-4.8 RUBY_CONFIGURE_OPTS="--with-openssl-dir=`brew --prefix openssl` --with-readline-dir=`brew --prefix readline` --with-gcc=gcc-4.8 --enable-shared" rbenv install --keep 2.0.0-p247
|
21
|
+
#
|
22
|
+
#
|
data/spec/00_nmatrix_spec.rb
CHANGED
@@ -8,8 +8,8 @@
|
|
8
8
|
#
|
9
9
|
# == Copyright Information
|
10
10
|
#
|
11
|
-
# SciRuby is Copyright (c) 2010 -
|
12
|
-
# NMatrix is Copyright (c) 2012, Ruby Science Foundation
|
11
|
+
# SciRuby is Copyright (c) 2010 - 2014, Ruby Science Foundation
|
12
|
+
# NMatrix is Copyright (c) 2012 - 2014, John Woods and the Ruby Science Foundation
|
13
13
|
#
|
14
14
|
# Please see LICENSE.txt for additional copyright notices.
|
15
15
|
#
|
@@ -29,6 +29,10 @@
|
|
29
29
|
require File.dirname(__FILE__) + "/spec_helper.rb"
|
30
30
|
|
31
31
|
describe NMatrix do
|
32
|
+
#after :each do
|
33
|
+
# GC.start
|
34
|
+
#end
|
35
|
+
|
32
36
|
it "creates a matrix with the new constructor" do
|
33
37
|
n = NMatrix.new([2,2], [0,1,2,3], dtype: :int64)
|
34
38
|
end
|
@@ -40,17 +44,15 @@ describe NMatrix do
|
|
40
44
|
end
|
41
45
|
|
42
46
|
it "calculates exact determinants on small square matrices" do
|
43
|
-
|
44
|
-
a.det_exact.should == -2
|
47
|
+
NMatrix.new(2, [1,2,3,4], stype: :dense, dtype: :int64).det_exact.should == -2
|
45
48
|
end
|
46
49
|
|
47
50
|
it "calculates determinants" do
|
48
|
-
|
49
|
-
m.det.should == 6
|
51
|
+
NMatrix.new(3, [-2,2,3,-1,1,3,2,0,-1], stype: :dense, dtype: :int64).det.should == 6
|
50
52
|
end
|
51
53
|
|
52
54
|
it "allows casting to Ruby objects" do
|
53
|
-
m = NMatrix.new(
|
55
|
+
m = NMatrix.new([3,3], [0,0,1,0,2,0,3,4,5], dtype: :int64, stype: :dense)
|
54
56
|
n = m.cast(:dense, :object)
|
55
57
|
n.should == m
|
56
58
|
end
|
@@ -367,3 +369,110 @@ describe NMatrix do
|
|
367
369
|
end
|
368
370
|
|
369
371
|
end
|
372
|
+
|
373
|
+
|
374
|
+
describe "NMatrix#upper_triangle" do
|
375
|
+
it "should create a copy with the lower corner set to zero" do
|
376
|
+
n = NMatrix.seq(4)+1
|
377
|
+
n.upper_triangle.should == NMatrix.new(4, [1,2,3,4,0,6,7,8,0,0,11,12,0,0,0,16])
|
378
|
+
n.upper_triangle(2).should == NMatrix.new(4, [1,2,3,4,5,6,7,8,9,10,11,12,0,14,15,16])
|
379
|
+
end
|
380
|
+
end
|
381
|
+
|
382
|
+
describe "NMatrix#lower_triangle" do
|
383
|
+
it "should create a copy with the lower corner set to zero" do
|
384
|
+
n = NMatrix.seq(4)+1
|
385
|
+
n.lower_triangle.should == NMatrix.new(4, [1,0,0,0,5,6,0,0,9,10,11,0,13,14,15,16])
|
386
|
+
n.lower_triangle(2).should == NMatrix.new(4, [1,2,3,0,5,6,7,8,9,10,11,12,13,14,15,16])
|
387
|
+
end
|
388
|
+
end
|
389
|
+
|
390
|
+
describe "NMatrix#upper_triangle!" do
|
391
|
+
it "should create a copy with the lower corner set to zero" do
|
392
|
+
n = NMatrix.seq(4)+1
|
393
|
+
n.upper_triangle!.should == NMatrix.new(4, [1,2,3,4,0,6,7,8,0,0,11,12,0,0,0,16])
|
394
|
+
n = NMatrix.seq(4)+1
|
395
|
+
n.upper_triangle!(2).should == NMatrix.new(4, [1,2,3,4,5,6,7,8,9,10,11,12,0,14,15,16])
|
396
|
+
end
|
397
|
+
end
|
398
|
+
|
399
|
+
describe "NMatrix#lower_triangle!" do
|
400
|
+
it "should create a copy with the lower corner set to zero" do
|
401
|
+
n = NMatrix.seq(4)+1
|
402
|
+
n.lower_triangle!.should == NMatrix.new(4, [1,0,0,0,5,6,0,0,9,10,11,0,13,14,15,16])
|
403
|
+
n = NMatrix.seq(4)+1
|
404
|
+
n.lower_triangle!(2).should == NMatrix.new(4, [1,2,3,0,5,6,7,8,9,10,11,12,13,14,15,16])
|
405
|
+
end
|
406
|
+
end
|
407
|
+
|
408
|
+
describe "NMatrix#reshape" do
|
409
|
+
it "should change the shape of a matrix without the contents changing" do
|
410
|
+
n = NMatrix.seq(4)+1
|
411
|
+
n.reshape([8,2]).to_flat_array.should == n.to_flat_array
|
412
|
+
end
|
413
|
+
|
414
|
+
it "should permit a change of dimensionality" do
|
415
|
+
n = NMatrix.seq(4)+1
|
416
|
+
n.reshape([8,1,2]).to_flat_array.should == n.to_flat_array
|
417
|
+
end
|
418
|
+
|
419
|
+
it "should prevent a resize" do
|
420
|
+
n = NMatrix.seq(4)+1
|
421
|
+
expect { n.reshape([5,2]) }.to raise_error(ArgumentError)
|
422
|
+
end
|
423
|
+
end
|
424
|
+
|
425
|
+
describe "NMatrix#transpose" do
|
426
|
+
[:dense, :list, :yale].each do |stype|
|
427
|
+
context(stype) do
|
428
|
+
it "should transpose a #{stype} matrix (2-dimensional)" do
|
429
|
+
n = NMatrix.seq(4, stype: stype)
|
430
|
+
n.transpose.to_a.flatten.should == [0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15]
|
431
|
+
end
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
[:dense, :list].each do |stype|
|
436
|
+
context(stype) do
|
437
|
+
it "should transpose a #{stype} matrix (3-dimensional)" do
|
438
|
+
n = NMatrix.new([4,4,1], [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15], stype: stype)
|
439
|
+
n.transpose([2,1,0]).to_flat_array.should == [0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15]
|
440
|
+
n.transpose([1,0,2]).to_flat_array.should == [0,4,8,12,1,5,9,13,2,6,10,14,3,7,11,15]
|
441
|
+
n.transpose([0,2,1]).to_flat_array.should == n.to_flat_array # for dense, make this reshape!
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
445
|
+
|
446
|
+
end
|
447
|
+
|
448
|
+
describe "NMatrix#==" do
|
449
|
+
[:dense, :list, :yale].each do |left|
|
450
|
+
[:dense, :list, :yale].each do |right|
|
451
|
+
next if left == right
|
452
|
+
context ("#{left}?#{right}") do
|
453
|
+
it "should compare two matrices of differing stypes" do
|
454
|
+
n = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,0,5,6,7,0], stype: left)
|
455
|
+
m = NMatrix.new([3,4], [0,0,1,2,0,0,3,4,0,0,0,0,5,6,7,0], stype: right)
|
456
|
+
n.should == m
|
457
|
+
end
|
458
|
+
end
|
459
|
+
end
|
460
|
+
end
|
461
|
+
end
|
462
|
+
|
463
|
+
describe "NMatrix#concat" do
|
464
|
+
it "should default to horizontal concatenation" do
|
465
|
+
n = NMatrix.new([1,3], [1,2,3])
|
466
|
+
n.concat(n).should == NMatrix.new([1,6], [1,2,3,1,2,3])
|
467
|
+
end
|
468
|
+
|
469
|
+
it "should permit vertical concatenation" do
|
470
|
+
n = NMatrix.new([1,3], [1,2,3])
|
471
|
+
n.vconcat(n).should == NMatrix.new([2,3], [1,2,3])
|
472
|
+
end
|
473
|
+
|
474
|
+
it "should permit depth concatenation on tensors" do
|
475
|
+
n = NMatrix.new([1,3,1], [1,2,3])
|
476
|
+
n.dconcat(n).should == NMatrix.new([1,3,2], [1,1,2,2,3,3])
|
477
|
+
end
|
478
|
+
end
|