nmatrix 0.0.9 → 0.1.0.rc1
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.
- 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
|