nmatrix 0.2.1 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/ext/nmatrix/data/data.cpp +9 -9
- data/ext/nmatrix/data/data.h +7 -8
- data/ext/nmatrix/data/ruby_object.h +1 -4
- data/ext/nmatrix/extconf.rb +9 -127
- data/ext/nmatrix/math.cpp +25 -25
- data/ext/nmatrix/math/asum.h +10 -31
- data/ext/nmatrix/math/cblas_templates_core.h +10 -10
- data/ext/nmatrix/math/getrf.h +2 -2
- data/ext/nmatrix/math/imax.h +12 -9
- data/ext/nmatrix/math/laswp.h +3 -3
- data/ext/nmatrix/math/long_dtype.h +16 -3
- data/ext/nmatrix/math/magnitude.h +54 -0
- data/ext/nmatrix/math/nrm2.h +19 -14
- data/ext/nmatrix/math/trsm.h +40 -36
- data/ext/nmatrix/math/util.h +14 -0
- data/ext/nmatrix/nmatrix.h +39 -1
- data/ext/nmatrix/ruby_nmatrix.c +45 -83
- data/ext/nmatrix/storage/common.h +9 -3
- data/ext/nmatrix/storage/dense/dense.cpp +4 -4
- data/ext/nmatrix/storage/list/list.cpp +2 -2
- data/ext/nmatrix/storage/yale/class.h +1 -1
- data/lib/nmatrix/blas.rb +103 -34
- data/lib/nmatrix/io/fortran_format.rb +8 -5
- data/lib/nmatrix/io/harwell_boeing.rb +11 -10
- data/lib/nmatrix/io/market.rb +9 -6
- data/lib/nmatrix/io/mat5_reader.rb +54 -29
- data/lib/nmatrix/io/mat_reader.rb +26 -14
- data/lib/nmatrix/io/point_cloud.rb +19 -11
- data/lib/nmatrix/math.rb +224 -5
- data/lib/nmatrix/mkmf.rb +103 -0
- data/lib/nmatrix/nmatrix.rb +20 -6
- data/lib/nmatrix/shortcuts.rb +415 -0
- data/lib/nmatrix/version.rb +1 -1
- data/spec/00_nmatrix_spec.rb +50 -1
- data/spec/02_slice_spec.rb +21 -21
- data/spec/blas_spec.rb +25 -3
- data/spec/math_spec.rb +233 -5
- data/spec/shortcuts_spec.rb +145 -5
- data/spec/spec_helper.rb +24 -1
- metadata +20 -4
data/lib/nmatrix/nmatrix.rb
CHANGED
@@ -534,6 +534,16 @@ class NMatrix
|
|
534
534
|
rank(0, row_number, get_by)
|
535
535
|
end
|
536
536
|
|
537
|
+
#
|
538
|
+
# call-seq:
|
539
|
+
# last -> Element of self.dtype
|
540
|
+
#
|
541
|
+
# Returns the last element stored in an NMatrix
|
542
|
+
#
|
543
|
+
def last
|
544
|
+
self[*Array.new(self.dim, -1)]
|
545
|
+
end
|
546
|
+
|
537
547
|
|
538
548
|
#
|
539
549
|
# call-seq:
|
@@ -700,16 +710,20 @@ class NMatrix
|
|
700
710
|
# Do the actual construction.
|
701
711
|
n = NMatrix.new(new_shape, opts)
|
702
712
|
|
703
|
-
# Figure out where to start
|
704
|
-
#
|
705
|
-
|
713
|
+
# Figure out where to start concatenation. We don't know where it will end,
|
714
|
+
# because each matrix may have own size along concat dimension.
|
715
|
+
pos = Array.new(self.dim) { 0 }
|
706
716
|
|
707
717
|
matrices.unshift(self)
|
708
718
|
matrices.each do |m|
|
719
|
+
# Figure out where to start and stop the concatenation. We'll use
|
720
|
+
# NMatrices instead of Arrays because then we can do elementwise addition.
|
721
|
+
ranges = m.shape.map.with_index { |s,i| pos[i]...(pos[i] + s) }
|
722
|
+
|
709
723
|
n[*ranges] = m
|
710
724
|
|
711
|
-
#
|
712
|
-
|
725
|
+
# Move over by the requisite amount
|
726
|
+
pos[rank] = pos[rank] + m.shape[rank]
|
713
727
|
end
|
714
728
|
|
715
729
|
n
|
@@ -1011,7 +1025,7 @@ class NMatrix
|
|
1011
1025
|
raise(ArgumentError, 'Matrix should be repeated at least 2 times.') if count < 2
|
1012
1026
|
new_shape = shape
|
1013
1027
|
new_shape[axis] *= count
|
1014
|
-
new_matrix = NMatrix.new(new_shape)
|
1028
|
+
new_matrix = NMatrix.new(new_shape, dtype: dtype)
|
1015
1029
|
slice = new_shape.map { |axis_size| 0...axis_size }
|
1016
1030
|
start = 0
|
1017
1031
|
count.times do
|
data/lib/nmatrix/shortcuts.rb
CHANGED
@@ -34,6 +34,92 @@
|
|
34
34
|
|
35
35
|
class NMatrix
|
36
36
|
|
37
|
+
# Methods for generating magic matrix.
|
38
|
+
module MagicHelpers
|
39
|
+
class << self
|
40
|
+
def odd_magic(nm, shape)
|
41
|
+
row = shape - 1
|
42
|
+
col = shape / 2
|
43
|
+
nm[row,col] = 1
|
44
|
+
(2..shape * shape).each do |index|
|
45
|
+
if nm[(row + 1) % shape,(col + 1) % shape] == 0
|
46
|
+
row = (row + 1) % shape
|
47
|
+
col = (col + 1) % shape
|
48
|
+
else
|
49
|
+
row = (row - 1 + shape) % shape
|
50
|
+
end
|
51
|
+
nm[row,col] = index
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def doubly_even_magic(nm, shape)
|
56
|
+
mini_square_num = shape / 4
|
57
|
+
count = 1
|
58
|
+
inv_count = shape * shape
|
59
|
+
shape.times do |row|
|
60
|
+
shape.times do |col|
|
61
|
+
if col >= mini_square_num and col < shape - mini_square_num
|
62
|
+
if row >= mini_square_num and row < shape - mini_square_num
|
63
|
+
nm[row,col] = count
|
64
|
+
else
|
65
|
+
nm[row,col] = inv_count
|
66
|
+
end
|
67
|
+
elsif row < mini_square_num or row >= shape - mini_square_num
|
68
|
+
nm[row,col] = count
|
69
|
+
else
|
70
|
+
nm[row,col] = inv_count
|
71
|
+
end
|
72
|
+
count += 1
|
73
|
+
inv_count -= 1
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def singly_even_magic(nm, shape)
|
79
|
+
half_shape = shape / 2
|
80
|
+
complementary_pair = (shape - 2) / 4
|
81
|
+
swap_col = NMatrix.new([shape])
|
82
|
+
index = 0
|
83
|
+
mini_magic = NMatrix.new([half_shape,half_shape], 0, dtype: nm.dtype)
|
84
|
+
odd_magic mini_magic, half_shape
|
85
|
+
half_shape.times do |row|
|
86
|
+
half_shape.times do |col|
|
87
|
+
nm[row,col] = mini_magic[row,col]
|
88
|
+
nm[row + half_shape,col + half_shape] = mini_magic[row,col] + half_shape * half_shape
|
89
|
+
nm[row,col + half_shape] = mini_magic[row,col] + 2 * half_shape * half_shape
|
90
|
+
nm[row + half_shape,col] = mini_magic[row,col] + 3 * half_shape * half_shape
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
(1..complementary_pair).each do |complementary_entry|
|
95
|
+
swap_col[index] = complementary_entry
|
96
|
+
index += 1
|
97
|
+
end
|
98
|
+
|
99
|
+
(shape - complementary_pair + 2..shape).each do |center|
|
100
|
+
swap_col[index] = center
|
101
|
+
index += 1
|
102
|
+
end
|
103
|
+
|
104
|
+
(1..half_shape).each do |row|
|
105
|
+
(1..index).each do |col|
|
106
|
+
temp = nm[row - 1,swap_col[col - 1] - 1]
|
107
|
+
nm[row - 1,swap_col[col - 1] - 1] = nm[row + half_shape - 1,swap_col[col - 1] - 1]
|
108
|
+
nm[row + half_shape - 1,swap_col[col - 1] - 1] = temp
|
109
|
+
end
|
110
|
+
end
|
111
|
+
|
112
|
+
temp = nm[complementary_pair,0]
|
113
|
+
nm[complementary_pair,0] = nm[complementary_pair + half_shape,0]
|
114
|
+
nm[complementary_pair + half_shape,0] = temp
|
115
|
+
|
116
|
+
temp = nm[complementary_pair + half_shape,complementary_pair]
|
117
|
+
nm[complementary_pair + half_shape,complementary_pair] = nm[complementary_pair,complementary_pair]
|
118
|
+
nm[complementary_pair,complementary_pair] = temp
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
37
123
|
# call-seq:
|
38
124
|
# m.dense? -> true or false
|
39
125
|
#
|
@@ -236,6 +322,86 @@ class NMatrix
|
|
236
322
|
m
|
237
323
|
end
|
238
324
|
alias :identity :eye
|
325
|
+
|
326
|
+
#
|
327
|
+
# call-seq:
|
328
|
+
# hilbert(shape) -> NMatrix
|
329
|
+
# hilbert(shape, dtype: dtype) -> NMatrix
|
330
|
+
# hilbert(shape, stype: stype, dtype: dtype) -> NMatrix
|
331
|
+
#
|
332
|
+
# Creates an hilbert matrix (square matrix).
|
333
|
+
#
|
334
|
+
# * *Arguments* :
|
335
|
+
# - +size+ -> integer ( for square matrix) specifying the dimensions.
|
336
|
+
# - +dtype+ -> (optional) Default is +:float64+
|
337
|
+
# - +stype+ -> (optional) Default is +:dense+.
|
338
|
+
# * *Returns* :
|
339
|
+
# - A hilbert matrix.
|
340
|
+
#
|
341
|
+
# Examples:
|
342
|
+
#
|
343
|
+
# NMatrix.hilbert(3) # => 1.0 0.5 0.3333333333333333
|
344
|
+
# 0.5 0.3333333333333333 0.25
|
345
|
+
# 0.3333333333333333 0.25 0.2
|
346
|
+
#
|
347
|
+
def hilbert(shape, opts={})
|
348
|
+
m = NMatrix.new([shape,shape], {:dtype => :float64}.merge(opts))
|
349
|
+
0.upto(shape - 1) do |i|
|
350
|
+
0.upto(i) do |j|
|
351
|
+
m[i,j] = 1.0 / (j + i + 1)
|
352
|
+
m[j,i] = m[i,j] if i != j
|
353
|
+
end
|
354
|
+
end
|
355
|
+
m
|
356
|
+
end
|
357
|
+
|
358
|
+
#
|
359
|
+
# call-seq:
|
360
|
+
# inv_hilbert(shape) -> NMatrix
|
361
|
+
# inv_hilbert(shape, dtype: dtype) -> NMatrix
|
362
|
+
# inv_hilbert(shape, stype: stype, dtype: dtype) -> NMatrix
|
363
|
+
#
|
364
|
+
# Creates an inverse hilbert matrix (square matrix rank 2).
|
365
|
+
#
|
366
|
+
# * *Arguments* :
|
367
|
+
# - +size+ -> Array (or integer for square matrix) specifying the dimensions.
|
368
|
+
# - +dtype+ -> (optional) Default is +:float64+
|
369
|
+
# - +stype+ -> (optional) Default is +:dense+.
|
370
|
+
# * *Returns* :
|
371
|
+
# - A hilbert matrix.
|
372
|
+
#
|
373
|
+
# Examples:
|
374
|
+
# NMatrix.inv_hilbert(3) # => 9.0, -36.0, 30.0
|
375
|
+
# -36.0, 192.0, -180.0
|
376
|
+
# 30.0, -180.0, 180.0
|
377
|
+
#
|
378
|
+
#
|
379
|
+
def inv_hilbert(shape, opts={})
|
380
|
+
opts = {:dtype => :float64}.merge(opts)
|
381
|
+
m = NMatrix.new([shape,shape],opts)
|
382
|
+
combination = NMatrix.new([2*shape,2*shape],opts)
|
383
|
+
#combinations refers to the combination of n things taken k at a time
|
384
|
+
0.upto(2*shape-1) do |i|
|
385
|
+
0.upto(i) do |j|
|
386
|
+
if j != 0 and j != i
|
387
|
+
combination[i,j] = combination[i-1,j] + combination[i-1,j-1]
|
388
|
+
else
|
389
|
+
combination[i,j] = 1
|
390
|
+
end
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
394
|
+
0.upto(shape-1) do |i|
|
395
|
+
0.upto(i) do |j|
|
396
|
+
m[i,j] = combination[shape + j,shape - i - 1] * ((i+j)+1) * \
|
397
|
+
combination[shape + i,shape - j - 1] * (-1) ** ((i+j)) * \
|
398
|
+
combination[(i+j),i] * combination[(i+j),i]
|
399
|
+
m[j,i] = m[i,j] if i != j
|
400
|
+
end
|
401
|
+
end
|
402
|
+
m
|
403
|
+
end
|
404
|
+
|
239
405
|
#
|
240
406
|
# call-seq:
|
241
407
|
# diagonals(array) -> NMatrix
|
@@ -385,6 +551,255 @@ class NMatrix
|
|
385
551
|
NMatrix.new(shape, random_values, {:dtype => :float64, :stype => :dense}.merge(opts))
|
386
552
|
end
|
387
553
|
alias :rand :random
|
554
|
+
|
555
|
+
#
|
556
|
+
# call-seq:
|
557
|
+
# magic(shape) -> NMatrix
|
558
|
+
# magic(shape, dtype: dtype) -> NMatrix
|
559
|
+
#
|
560
|
+
# The parameter is the dimension of the matrix.
|
561
|
+
#
|
562
|
+
# Creates a +:dense+ NMatrix with the following properties:
|
563
|
+
# - An arrangement of the numbers from 1 to n^2 (n-squared) in the matrix, with each number occurring exactly once.
|
564
|
+
# - The sum of the entries of any row, any column, or any main diagonal is the same.
|
565
|
+
# - This sum must be n(n^2+1)/2.
|
566
|
+
#
|
567
|
+
# See: http://www.mathworks.com/help/matlab/ref/magic.html
|
568
|
+
#
|
569
|
+
# * *Arguments* :
|
570
|
+
# - +shape+ -> Array (or integer for square matrix) specifying the dimensions.
|
571
|
+
# - +dtype+ -> (optional) Default is +:float64+
|
572
|
+
# * *Returns* :
|
573
|
+
# - NMatrix with the above given properties.
|
574
|
+
#
|
575
|
+
# Examples:
|
576
|
+
#
|
577
|
+
# NMatrix.magic(3) # => [ [4.0, 9.0, 2.0] [3.0, 5.0, 7.0] [8.0, 1.0, 6.0] ]
|
578
|
+
#
|
579
|
+
# NMatrix.magic(4, dtype :int32) # => [ [ 1, 15, 14, 4]
|
580
|
+
# [12, 6, 7, 9]
|
581
|
+
# [ 8, 10, 11, 5]
|
582
|
+
# [13, 3, 2, 16] ]
|
583
|
+
#
|
584
|
+
# NMatrix.magic(6,dtype: :int64) # => [ [31, 9, 2, 22, 27, 20]
|
585
|
+
# [ 3, 32, 7, 21, 23, 25]
|
586
|
+
# [35, 1, 6, 26, 19, 24]
|
587
|
+
# [ 4, 36, 29, 13, 18, 11]
|
588
|
+
# [30, 5, 34, 12, 14, 16]
|
589
|
+
# [ 8, 28, 33, 17, 10, 15] ]
|
590
|
+
#
|
591
|
+
def magic(shape, opts={})
|
592
|
+
raise(ArgumentError, "shape of two is not allowed") if shape == 2
|
593
|
+
nm = NMatrix.new([shape,shape], 0, {:dtype => :float64}.merge(opts))
|
594
|
+
if shape % 2 != 0
|
595
|
+
MagicHelpers.odd_magic nm, shape
|
596
|
+
elsif shape % 4 == 0
|
597
|
+
MagicHelpers.doubly_even_magic nm, shape
|
598
|
+
else
|
599
|
+
MagicHelpers.singly_even_magic nm, shape
|
600
|
+
end
|
601
|
+
nm
|
602
|
+
end
|
603
|
+
|
604
|
+
#
|
605
|
+
# call-seq:
|
606
|
+
# linspace(base, limit) -> 1x100 NMatrix
|
607
|
+
# linspace(base, limit, *shape) -> NMatrix
|
608
|
+
#
|
609
|
+
# Returns an NMatrix with +[shape[0] x shape[1] x .. x shape[dim-1]]+ values of dtype +:float64+ equally spaced from
|
610
|
+
# +base+ to +limit+, inclusive.
|
611
|
+
#
|
612
|
+
# See: http://www.mathworks.com/help/matlab/ref/linspace.html
|
613
|
+
#
|
614
|
+
# * *Arguments* :
|
615
|
+
# - +base+ -> The first value in the sequence.
|
616
|
+
# - +limit+ -> The last value in the sequence.
|
617
|
+
# - +shape+ -> Desired output shape. Default returns a 1x100 row vector.
|
618
|
+
# * *Returns* :
|
619
|
+
# - NMatrix with +:float64+ values.
|
620
|
+
#
|
621
|
+
# Examples :-
|
622
|
+
#
|
623
|
+
# NMatrix.linspace(1,Math::PI, 6)
|
624
|
+
# =>[1.0,
|
625
|
+
# 1.4283185005187988,
|
626
|
+
# 1.8566370010375977,
|
627
|
+
# 2.2849555015563965,
|
628
|
+
# 2.7132740020751953,
|
629
|
+
# 3.1415927410125732
|
630
|
+
# ]
|
631
|
+
#
|
632
|
+
# NMatrix.linspace(1,10, [3,2])
|
633
|
+
# =>[
|
634
|
+
# [ 1.0, 2.799999952316284]
|
635
|
+
# [4.599999904632568, 6.400000095367432]
|
636
|
+
# [8.199999809265137, 10.0]
|
637
|
+
# ]
|
638
|
+
#
|
639
|
+
def linspace(base, limit, shape = [100])
|
640
|
+
|
641
|
+
# Convert shape to array format
|
642
|
+
shape = [shape] if shape.is_a? Integer
|
643
|
+
|
644
|
+
#Calculate number of elements
|
645
|
+
count = shape.inject(:*)
|
646
|
+
|
647
|
+
# Linear spacing between elements calculated in step
|
648
|
+
# step = limit - base / (count - 1)
|
649
|
+
# [Result Sequence] = [0->N sequence] * step + [Base]
|
650
|
+
step = (limit - base) * (1.0 / (count - 1))
|
651
|
+
result = NMatrix.seq(shape, {:dtype => :float64}) * step
|
652
|
+
result += NMatrix.new(shape, base)
|
653
|
+
result
|
654
|
+
end
|
655
|
+
|
656
|
+
# call-seq:
|
657
|
+
# logspace(base, limit) -> 1x50 NMatrix with exponent_base = 10
|
658
|
+
# logspace(base, limit, shape , exponent_base:) -> NMatrix
|
659
|
+
# logspace(base, :pi, n) -> 1xn NMatrix with interval [10 ^ base, Math::PI]
|
660
|
+
#
|
661
|
+
# Returns an NMatrix with +[shape[0] x shape[1] x .. x shape[dim-1]]+ values of dtype +:float64+ logarithmically spaced from
|
662
|
+
# +exponent_base ^ base+ to +exponent_base ^ limit+, inclusive.
|
663
|
+
#
|
664
|
+
# See: http://www.mathworks.com/help/matlab/ref/logspace.html
|
665
|
+
#
|
666
|
+
# * *Arguments* :
|
667
|
+
# - +base+ -> exponent_base ** base is the first value in the sequence
|
668
|
+
# - +limit+ -> exponent_base ** limit is the last value in the sequence.
|
669
|
+
# - +shape+ -> Desired output shape. Default returns a 1x50 row vector.
|
670
|
+
# * *Returns* :
|
671
|
+
# - NMatrix with +:float64+ values.
|
672
|
+
#
|
673
|
+
# Examples :-
|
674
|
+
#
|
675
|
+
# NMatrix.logspace(1,:pi,7)
|
676
|
+
# =>[
|
677
|
+
# 10.0000,
|
678
|
+
# 8.2450,
|
679
|
+
# 6.7980,
|
680
|
+
# 5.6050,
|
681
|
+
# 4.6213,
|
682
|
+
# 3.8103,
|
683
|
+
# 3.1416
|
684
|
+
# ]
|
685
|
+
#
|
686
|
+
# NMatrix.logspace(1,2,[3,2])
|
687
|
+
# =>[
|
688
|
+
# [10.0, 15.8489]
|
689
|
+
# [25.1189, 39.8107]
|
690
|
+
# [63.0957, 100.0]
|
691
|
+
# ]
|
692
|
+
#
|
693
|
+
def logspace(base, limit, shape = [50], exponent_base: 10)
|
694
|
+
|
695
|
+
#Calculate limit for [10 ^ base ... Math::PI] if limit = :pi
|
696
|
+
limit = Math.log(Math::PI, exponent_base = 10) if limit == :pi
|
697
|
+
shape = [shape] if shape.is_a? Integer
|
698
|
+
|
699
|
+
#[base...limit] -> [exponent_base ** base ... exponent_base ** limit]
|
700
|
+
result = NMatrix.linspace(base, limit, shape)
|
701
|
+
result.map {|element| exponent_base ** element}
|
702
|
+
end
|
703
|
+
|
704
|
+
#
|
705
|
+
# call-seq:
|
706
|
+
# linspace(base, limit) -> 1x100 NMatrix
|
707
|
+
# linspace(base, limit, *shape) -> NMatrix
|
708
|
+
#
|
709
|
+
# Returns an NMatrix with +[shape[0] x shape[1] x .. x shape[dim-1]]+ values of dtype +:float64+ equally spaced from
|
710
|
+
# +base+ to +limit+, inclusive.
|
711
|
+
#
|
712
|
+
# See: http://www.mathworks.com/help/matlab/ref/linspace.html
|
713
|
+
#
|
714
|
+
# * *Arguments* :
|
715
|
+
# - +base+ -> The first value in the sequence.
|
716
|
+
# - +limit+ -> The last value in the sequence.
|
717
|
+
# - +shape+ -> Desired output shape. Default returns a 1x100 row vector.
|
718
|
+
# * *Returns* :
|
719
|
+
# - NMatrix with +:float64+ values.
|
720
|
+
#
|
721
|
+
# Examples :-
|
722
|
+
#
|
723
|
+
# NMatrix.linspace(1,Math::PI, 6)
|
724
|
+
# =>[1.0,
|
725
|
+
# 1.4283185005187988,
|
726
|
+
# 1.8566370010375977,
|
727
|
+
# 2.2849555015563965,
|
728
|
+
# 2.7132740020751953,
|
729
|
+
# 3.1415927410125732
|
730
|
+
# ]
|
731
|
+
#
|
732
|
+
# NMatrix.linspace(1,10, [3,2])
|
733
|
+
# =>[
|
734
|
+
# [ 1.0, 2.799999952316284]
|
735
|
+
# [4.599999904632568, 6.400000095367432]
|
736
|
+
# [8.199999809265137, 10.0]
|
737
|
+
# ]
|
738
|
+
#
|
739
|
+
def linspace(base, limit, shape = [100])
|
740
|
+
|
741
|
+
# Convert shape to array format
|
742
|
+
shape = [shape] if shape.is_a? Integer
|
743
|
+
|
744
|
+
#Calculate number of elements
|
745
|
+
count = shape.inject(:*)
|
746
|
+
|
747
|
+
# Linear spacing between elements calculated in step
|
748
|
+
# step = limit - base / (count - 1)
|
749
|
+
# [Result Sequence] = [0->N sequence] * step + [Base]
|
750
|
+
step = (limit - base) * (1.0 / (count - 1))
|
751
|
+
result = NMatrix.seq(shape, {:dtype => :float64}) * step
|
752
|
+
result += NMatrix.new(shape, base)
|
753
|
+
result
|
754
|
+
end
|
755
|
+
|
756
|
+
# call-seq:
|
757
|
+
# logspace(base, limit) -> 1x50 NMatrix with exponent_base = 10
|
758
|
+
# logspace(base, limit, shape , exponent_base:) -> NMatrix
|
759
|
+
# logspace(base, :pi, n) -> 1xn NMatrix with interval [10 ^ base, Math::PI]
|
760
|
+
#
|
761
|
+
# Returns an NMatrix with +[shape[0] x shape[1] x .. x shape[dim-1]]+ values of dtype +:float64+ logarithmically spaced from
|
762
|
+
# +exponent_base ^ base+ to +exponent_base ^ limit+, inclusive.
|
763
|
+
#
|
764
|
+
# See: http://www.mathworks.com/help/matlab/ref/logspace.html
|
765
|
+
#
|
766
|
+
# * *Arguments* :
|
767
|
+
# - +base+ -> exponent_base ** base is the first value in the sequence
|
768
|
+
# - +limit+ -> exponent_base ** limit is the last value in the sequence.
|
769
|
+
# - +shape+ -> Desired output shape. Default returns a 1x50 row vector.
|
770
|
+
# * *Returns* :
|
771
|
+
# - NMatrix with +:float64+ values.
|
772
|
+
#
|
773
|
+
# Examples :-
|
774
|
+
#
|
775
|
+
# NMatrix.logspace(1,:pi,7)
|
776
|
+
# =>[
|
777
|
+
# 10.0000,
|
778
|
+
# 8.2450,
|
779
|
+
# 6.7980,
|
780
|
+
# 5.6050,
|
781
|
+
# 4.6213,
|
782
|
+
# 3.8103,
|
783
|
+
# 3.1416
|
784
|
+
# ]
|
785
|
+
#
|
786
|
+
# NMatrix.logspace(1,2,[3,2])
|
787
|
+
# =>[
|
788
|
+
# [10.0, 15.8489]
|
789
|
+
# [25.1189, 39.8107]
|
790
|
+
# [63.0957, 100.0]
|
791
|
+
# ]
|
792
|
+
#
|
793
|
+
def logspace(base, limit, shape = [50], exponent_base: 10)
|
794
|
+
|
795
|
+
#Calculate limit for [10 ^ base ... Math::PI] if limit = :pi
|
796
|
+
limit = Math.log(Math::PI, exponent_base = 10) if limit == :pi
|
797
|
+
shape = [shape] if shape.is_a? Integer
|
798
|
+
|
799
|
+
#[base...limit] -> [exponent_base ** base ... exponent_base ** limit]
|
800
|
+
result = NMatrix.linspace(base, limit, shape)
|
801
|
+
result.map {|element| exponent_base ** element}
|
802
|
+
end
|
388
803
|
|
389
804
|
#
|
390
805
|
# call-seq:
|