extendmatrix 0.3.1 → 0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 41d2eb4e69c1269aea537992ff8651672afbfd06
4
+ data.tar.gz: 13dc88d722a5503ae54aaf1085cd01474f18f125
5
+ SHA512:
6
+ metadata.gz: 46bcba1edb7edc880547b04a0a96d187e3e81a12f59313c70099e07481e67a7b1bfc5e0442e85f6dba5924d172f82638d1833f5c70975508281149976a52d8e9
7
+ data.tar.gz: d9b7acf76163487e6d1ac537c314d4479ddba9d4d88367b0b0a19bcd45300289519bb942e578695af97eae4ca0f0cd64883999c69f61b6167290b2de6f14a35d
@@ -0,0 +1,6 @@
1
+ .rvmrc
2
+ Gemfile
3
+ *.lock
4
+ *~
5
+ pkg
6
+ *.gem
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
@@ -1,3 +1,9 @@
1
+ === 0.4
2
+ * Code cleanup
3
+ * Added separate version.rb file for storing VERSION info
4
+ * Added gem essentials like gemspec, etc.
5
+ * Removed support for ruby < 1.9.3
6
+
1
7
  === 0.3.1 / 2010-08-16
2
8
  * Bug fix: method mssq returns only the last row squares
3
9
  * Added method diagonal
@@ -1,17 +1,17 @@
1
- = extendmatrix
1
+ # extendmatrix
2
2
 
3
- * http://github.com/clbustos/extendmatrix
3
+ * http://github.com/SciRuby/extendmatrix
4
4
 
5
- == DESCRIPTION:
5
+ ## DESCRIPTION:
6
6
 
7
7
  The project consists of some enhancements to the Ruby "Matrix" module and includes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg) decompositions, bidiagonalization, eigenvalue and eigenvector calculations.
8
8
  Include some aditional code to obtains marginal for rows and columns.
9
9
 
10
- Original code from http://rubyforge.org/projects/matrix/ , done by Cosmin Bonchis as a Google Summer of Code 2007 project for Ruby Central Inc.
10
+ Original code done by Cosmin Bonchis as a Google Summer of Code 2007 project for Ruby Central Inc.
11
11
 
12
- Gem, github repository and current version manteined by Claudio Bustos.
12
+ Gem, github repository and current version mantained by Claudio Bustos and the Ruby Science Foundation.
13
13
 
14
- == SYNOPSIS:
14
+ ## SYNOPSIS:
15
15
 
16
16
  require 'extendmatrix'
17
17
  v = Vector[1, 2, 3, 4]
@@ -36,20 +36,20 @@ Gem, github repository and current version manteined by Claudio Bustos.
36
36
  m.eigenvaluesJacobi => Vector[0.523942339006665, 0.0632833995384682, 2.41277426145487]
37
37
  m.cJacobiV
38
38
  # => Matrix[[0.818814082563014, 0.249617871497675, 0.516947208547894], [-0.550168858227442, 0.598307531004925, 0.58253096551128], [-0.163883268313767, -0.761392813580323, 0.62723461144538]]
39
- == REQUIREMENTS:
40
39
 
41
- * Only Ruby
40
+ ## REQUIREMENTS:
42
41
 
43
- == INSTALL:
42
+ * Ruby > 1.9.3
44
43
 
45
- * sudo gem install matrix-extensions
46
-
47
- == LICENSE:
44
+ ## INSTALL:
48
45
 
46
+ * sudo gem install extendmatrix
49
47
 
48
+ ## LICENSE:
50
49
 
51
50
  Copyright [2007] Cosmin Bonchis
52
51
  Copyright [2010] Claudio Bustos
52
+ Copyright [2015] Ruby Science Foundation
53
53
 
54
54
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use
55
55
  this file except in compliance with the License. You may obtain a copy of the
@@ -62,5 +62,4 @@ under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
62
62
  CONDITIONS OF ANY KIND, either express or implied. See the License for the
63
63
  specific language governing permissions and limitations under the License.
64
64
 
65
-
66
65
  See LICENSE.txt for more details
data/Rakefile CHANGED
@@ -2,12 +2,13 @@
2
2
  $:.unshift(File.dirname(__FILE__)+"/lib")
3
3
  require 'rubygems'
4
4
  require 'hoe'
5
- require 'extendmatrix.rb'
6
- Hoe.plugin :git
7
- Hoe.spec 'extendmatrix' do
8
- self.rubyforge_name = 'ruby-statsample'
9
- self.version = Matrix::EXTENSION_VERSION
10
- self.developer('Cosmin Bonchis', 'cbonchis_info.uvt.ro')
11
- end
5
+ require 'version'
6
+
7
+ require 'rspec'
8
+ require 'rspec/core/rake_task'
12
9
 
10
+ RSpec::Core::RakeTask.new do |t|
11
+ t.rspec_opts = ["-c", "-f progress"]
12
+ t.pattern = 'spec/**/*_spec.rb'
13
+ end
13
14
  # vim: syntax=ruby
@@ -0,0 +1,32 @@
1
+ # coding: utf-8
2
+ $:.unshift File.expand_path("../lib", __FILE__)
3
+
4
+ require 'version.rb'
5
+
6
+ DESCRIPTION = <<MSG
7
+ The project consists of some enhancements to the Ruby "Matrix" module and
8
+ includes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg)
9
+ decompositions, bidiagonalization, eigenvalue and eigenvector calculations.
10
+
11
+ Includes some aditional code to obtains marginal for rows and columns.
12
+ MSG
13
+
14
+ Gem::Specification.new do |spec|
15
+ spec.name = 'extendmatrix'
16
+ spec.version = Matrix::EXTENSION_VERSION
17
+ spec.authors = ['Cosmin Bonchis', 'Claudio Bustos', 'Sameer Deshmukh']
18
+ spec.email = ['sameer.deshmukh93@gmail.com']
19
+ spec.summary = %q{Enhancements to ruby "Matrix" and "Vector" modules}
20
+ spec.description = DESCRIPTION
21
+ spec.homepage = "http://github.com/SciRuby/extendmatrix"
22
+ spec.license = 'Apache v2'
23
+
24
+ spec.files = `git ls-files -z`.split("\x0")
25
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
26
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'rake'
31
+ spec.add_development_dependency 'rspec'
32
+ end
@@ -2,18 +2,6 @@ require 'rational'
2
2
  require 'matrix'
3
3
  class Vector
4
4
  include Enumerable
5
- # fix for Vector#coerce on Ruby 1.8.x
6
- if RUBY_VERSION<="1.9.0"
7
- alias_method :old_coerce, :coerce
8
- def coerce(other)
9
- case other
10
- when Numeric
11
- return Matrix::Scalar.new(other), self
12
- else
13
- raise TypeError, "#{self.class} can't be coerced into #{other.class}"
14
- end
15
- end
16
- end
17
5
 
18
6
  module Norm
19
7
  def self.sqnorm(obj, p)
@@ -21,6 +9,7 @@ class Vector
21
9
  end
22
10
  end
23
11
 
12
+ alias :to_ary :to_a
24
13
  alias :length :size
25
14
  alias :index :[]
26
15
  #
@@ -221,10 +210,9 @@ class Vector
221
210
  end
222
211
 
223
212
  class Matrix
224
-
225
- EXTENSION_VERSION="0.3.1"
226
213
  include Enumerable
227
214
 
215
+ alias :to_ary :to_a
228
216
  attr_reader :rows, :wrap
229
217
  @wrap = nil
230
218
  #
@@ -250,7 +238,6 @@ class Matrix
250
238
  # m[1, 2] => 5
251
239
  # m[3,1..2] => Vector[10, 11]
252
240
  # m[0..1, 0..2] => Matrix[[0, 1, 2], [3, 4, 5]]
253
- #
254
241
  def [](i, j)
255
242
  case i
256
243
  when Range
@@ -270,9 +257,6 @@ class Matrix
270
257
  end
271
258
  end
272
259
 
273
-
274
-
275
-
276
260
  #
277
261
  # Set the values of a matrix
278
262
  # m = Matrix.build(3, 3){|i, j| i * 3 + j}
@@ -283,7 +267,6 @@ class Matrix
283
267
  # m[2,1..2] = Vector[8, 8] => Matrix[[0, 1, 2], [3, 8, 8], [6, 7, 8]]
284
268
  # m[0..1, 0..1] = Matrix[[0, 0, 0],[0, 0, 0]]
285
269
  # => Matrix[[0, 0, 2], [0, 0, 8], [6, 7, 8]]
286
- #
287
270
  def []=(i, j, v)
288
271
  case i
289
272
  when Range
@@ -318,7 +301,6 @@ class Matrix
318
301
 
319
302
  #
320
303
  # Return a duplicate matrix, with all elements copied
321
- #
322
304
  def dup
323
305
  (self.class).rows(self.rows.dup)
324
306
  end
@@ -335,8 +317,6 @@ class Matrix
335
317
  # Creates a matrix <tt>n</tt> x <tt>m</tt>
336
318
  # If you provide a block, it will be used to set the values.
337
319
  # If not, <tt>val</tt> will be used
338
- #
339
-
340
320
  def build(n,m,val=0)
341
321
  f = (block_given?)? lambda {|i,j| yield(i, j)} : lambda {|i,j| val}
342
322
  Matrix.rows((0...n).collect {|i| (0...m).collect {|j| f.call(i,j)}})
@@ -449,7 +429,6 @@ class Matrix
449
429
  def cols_len
450
430
  (0...column_size).collect {|j| max_len_column(j)}
451
431
  end
452
-
453
432
  alias :to_s_old :to_s
454
433
 
455
434
  #
@@ -495,18 +474,22 @@ class Matrix
495
474
  self[row,column].send(op,other[row,column])
496
475
  end
497
476
  end
477
+
498
478
  # Element wise multiplication
499
479
  def e_mult(other)
500
480
  elementwise_operation(:*,other)
501
481
  end
482
+
502
483
  # Element wise multiplication
503
484
  def e_quo(other)
504
485
  elementwise_operation(:quo,other)
505
486
  end
487
+
506
488
  # Matrix sum of squares
507
489
  def mssq
508
490
  @rows.inject(0){|ac,row| ac+(row.inject(0) {|acr,i| acr+(i**2)})}
509
491
  end
492
+
510
493
  def eigenpairs
511
494
  eigval, eigvec= eigenvaluesJacobi, cJacobiV
512
495
  eigenpairs=eigval.size.times.map {|i|
@@ -514,6 +497,7 @@ class Matrix
514
497
  }
515
498
  eigenpairs=eigenpairs.sort{|a,b| a[0]<=>b[0]}.reverse
516
499
  end
500
+
517
501
  # Returns eigenvalues and eigenvectors of a matrix on a Hash
518
502
  # like CALL EIGEN on SPSS.
519
503
  # * _:eigenvectors_: contains the eigenvectors as columns of a new Matrix, ordered in descendent order
@@ -547,8 +531,7 @@ class Matrix
547
531
  # :section: Advanced methods
548
532
  #
549
533
 
550
- #
551
- # a hided module of Matrix
534
+ # a hidden module of Matrix
552
535
  module MMatrix
553
536
  def self.default_block(block)
554
537
  block ? lambda { |i| block.call(i) } : lambda {|i| i }
@@ -559,7 +542,6 @@ class Matrix
559
542
  # 1) the index of row/column and
560
543
  # 2) the values Vector for changing the row/column and
561
544
  # 3) the range of changes
562
- #
563
545
  def self.id_vect_range(args, l)
564
546
  i = args[0] # the column(/the row) to be change
565
547
  vect = args[1] # the values vector
@@ -577,7 +559,6 @@ class Matrix
577
559
  #
578
560
  # Returns an array with the elements collected from the row "i".
579
561
  # When a block is given, the elements of that vector are iterated.
580
- #
581
562
  def row_collect(i, &block)
582
563
  f = MMatrix.default_block(block)
583
564
  @rows[i].collect {|e| f.call(e)}
@@ -586,7 +567,6 @@ class Matrix
586
567
  #
587
568
  # Returns row vector number "i" like Matrix.row as a Vector.
588
569
  # When the block is given, the elements of row "i" are modified
589
- #
590
570
  def row!(i)
591
571
  if block_given?
592
572
  @rows[i].collect! {|e| yield e }
@@ -599,176 +579,171 @@ class Matrix
599
579
  #
600
580
  # Returns an array with the elements collected from the column "j".
601
581
  # When a block is given, the elements of that vector are iterated.
602
- #
603
582
  def column_collect(j, &block)
604
583
  f = MMatrix.default_block(block)
605
584
  (0...row_size).collect {|r| f.call(self[r, j])}
606
585
  end
607
586
 
608
- #
609
- # Returns column vector number "j" as a Vector.
610
- # When the block is given, the elements of column "j" are mmodified
611
- #
612
- def column!(j)
613
- if block_given?
614
- (0...row_size).collect { |i| @rows[i][j] = yield @rows[i][j] }
615
- else
616
- column(j)
587
+ #
588
+ # Returns column vector number "j" as a Vector.
589
+ # When the block is given, the elements of column "j" are mmodified
590
+ #
591
+ def column!(j)
592
+ if block_given?
593
+ (0...row_size).collect { |i| @rows[i][j] = yield @rows[i][j] }
594
+ else
595
+ column(j)
596
+ end
617
597
  end
618
- end
619
- alias :column_collect! :column!
620
-
621
- #
622
- # Set a certain column with the values of a Vector
623
- # m = Matrix.build(3, 3){|i, j| i * 3 + j + 1}
624
- # m.column= 1, Vector[1, 1, 1], 1..2
625
- # m => 1 2 3
626
- # 4 1 6
627
- # 7 1 9
628
- #
629
- def column=(args)
630
- m = row_size
631
- c, v, r = MMatrix.id_vect_range(args, m)
632
- (m..r.begin - 1).each{|i| self[i, c] = 0}
633
- [v.size, r.entries.size].min.times{|i| self[i + r.begin, c] = v[i]}
634
- ((v.size + r.begin)..r.entries.last).each {|i| self[i, c] = 0}
635
- end
636
-
637
- #
638
- # Set a certain row with the values of a Vector
639
- # m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
640
- # m.row= 0, Vector[0, 0], 1..2
641
- # m => 1 0 0
642
- # 4 5 6
643
- # 7 8 9
644
- #
645
- def row=(args)
646
- i, val, range = MMatrix.id_vect_range(args, column_size)
647
- row!(i)[range] = val
648
- end
649
-
650
- def norm(p = 2)
651
- Vector::Norm.sqnorm(self, p) ** (1.quo(p))
652
- end
598
+ alias :column_collect! :column!
653
599
 
654
- def norm_frobenius
655
- norm
656
- end
657
- alias :normF :norm_frobenius
658
-
659
- #
660
- # Tests if the matrix is empty or not
661
- #
662
- def empty?
663
- @rows.empty? if @rows
664
- end
665
-
666
- #
667
- # Returns row(s) of matrix as a Matrix
668
- #
669
-
670
- def row2matrix(r)
671
- if r.is_a? Range
672
- a=r.map {|v| v<row_size ? row(v).to_a : nil }.find_all {|v| !v.nil?}
673
- else
674
- a = row(r).to_a
675
- end
676
- if r.is_a?(Range) and r.entries.size > 1
677
- return Matrix[*a]
678
- else
679
- return Matrix[a]
600
+ #
601
+ # Set a certain column with the values of a Vector
602
+ # m = Matrix.build(3, 3){|i, j| i * 3 + j + 1}
603
+ # m.column= 1, Vector[1, 1, 1], 1..2
604
+ # m => 1 2 3
605
+ # 4 1 6
606
+ # 7 1 9
607
+ #
608
+ def column=(args)
609
+ m = row_size
610
+ c, v, r = MMatrix.id_vect_range(args, m)
611
+ (m..r.begin - 1).each{|i| self[i, c] = 0}
612
+ [v.size, r.entries.size].min.times{|i| self[i + r.begin, c] = v[i]}
613
+ ((v.size + r.begin)..r.entries.last).each {|i| self[i, c] = 0}
680
614
  end
681
- end
682
615
 
683
- #
684
- # Returns the column/s of matrix as a Matrix
685
- #
686
- def column2matrix(c)
687
- if c.is_a?(Range)
688
- a=c.map {|v| column(v).to_a}.find_all {|v| v.size>0}
689
- else
690
- a = column(c).to_a
616
+ #
617
+ # Set a certain row with the values of a Vector
618
+ # m = Matrix.new(3, 3){|i, j| i * 3 + j + 1}
619
+ # m.row= 0, Vector[0, 0], 1..2
620
+ # m => 1 0 0
621
+ # 4 5 6
622
+ # 7 8 9
623
+ #
624
+ def row=(args)
625
+ i, val, range = MMatrix.id_vect_range(args, column_size)
626
+ row!(i)[range] = val
691
627
  end
692
- if c.is_a?(Range)
693
- return Matrix.columns(a)
694
- else
695
- return Matrix[*a.collect{|x| [x]}]
628
+
629
+ def norm(p = 2)
630
+ Vector::Norm.sqnorm(self, p) ** (1.quo(p))
696
631
  end
697
- end
698
632
 
699
- # Returns the marginal of rows
700
- def row_sum
701
- (0...row_size).collect {|i|
702
- row(i).sum
703
- }
704
- end
705
- # Returns the marginal of columns
706
- def column_sum
707
- (0...column_size).collect {|i|
708
- column(i).sum
709
- }
710
- end
711
- # Calculate sum of cells
712
- def total_sum
713
- row_sum.inject(&:+)
714
- end
633
+ def norm_frobenius
634
+ norm
635
+ end
636
+ alias :normF :norm_frobenius
715
637
 
716
- module LU
717
638
  #
718
- # Return the Gauss vector, MC, Golub, 3.2.1 Gauss Transformation, p94
639
+ # Tests if the matrix is empty or not
719
640
  #
720
- def self.gauss_vector(mat, k)
721
- t = mat.column2matrix(k)
722
- tk = t[k, 0]
723
- (0..k).each{|i| t[i, 0] = 0}
724
- return t if tk == 0
725
- (k+1...mat.row_size).each{|i| t[i, 0] = t[i, 0].to_f / tk}
726
- t
641
+ def empty?
642
+ @rows.empty? if @rows
727
643
  end
728
644
 
729
645
  #
730
- # Return the Gauss transformation matrix: M_k = I - tau * e_k^T
646
+ # Returns row(s) of matrix as a Matrix
731
647
  #
732
- def self.gauss(mat, k)
733
- i = Matrix.I(mat.column_size)
734
- tau = gauss_vector(mat, k)
735
- e = i.row2matrix(k)
736
- i - tau * e
648
+
649
+ def row2matrix(r)
650
+ if r.is_a? Range
651
+ a=r.map {|v| v<row_size ? row(v).to_a : nil }.find_all {|v| !v.nil?}
652
+ else
653
+ a = row(r).to_a
654
+ end
655
+ if r.is_a?(Range) and r.entries.size > 1
656
+ return Matrix[*a]
657
+ else
658
+ return Matrix[a]
659
+ end
737
660
  end
738
661
 
739
662
  #
740
- # LU factorization: A = LU
741
- # where L is lower triangular and U is upper triangular
663
+ # Returns the column/s of matrix as a Matrix
742
664
  #
743
- def self.factorization(mat)
744
- u = mat.clone
745
- n = u.column_size
746
- i = Matrix.I(n)
747
- l = i.clone
748
- (n-1).times {|k|
749
- mk = gauss(u, k)
750
- u = mk * u # M_{n-1} * ... * M_1 * A = U
751
- l += i - mk # L = M_1^{-1} * ... * M_{n-1}^{-1} = I + sum_{k=1}^{n-1} tau * e
665
+ def column2matrix(c)
666
+ if c.is_a?(Range)
667
+ a=c.map {|v| column(v).to_a}.find_all {|v| v.size>0}
668
+ else
669
+ a = column(c).to_a
670
+ end
671
+ if c.is_a?(Range)
672
+ return Matrix.columns(a)
673
+ else
674
+ return Matrix[*a.collect{|x| [x]}]
675
+ end
676
+ end
677
+
678
+ # Returns the marginal of rows
679
+ def row_sum
680
+ (0...row_size).collect {|i|
681
+ row(i).sum
752
682
  }
753
- return l, u
754
683
  end
755
- end
684
+ # Returns the marginal of columns
685
+ def column_sum
686
+ (0...column_size).collect {|i|
687
+ column(i).sum
688
+ }
689
+ end
690
+ # Calculate sum of cells
691
+ def total_sum
692
+ row_sum.inject(&:+)
693
+ end
756
694
 
757
- #
758
- # Return the upper triangular matrix of LU factorization
759
- # M_{n-1} * ... * M_1 * A = U
760
- #
761
- def U
762
- LU.factorization(self)[1]
763
- end
695
+ module LU
696
+ #
697
+ # Return the Gauss vector, MC, Golub, 3.2.1 Gauss Transformation, p94
698
+ #
699
+ def self.gauss_vector(mat, k)
700
+ t = mat.column2matrix(k)
701
+ tk = t[k, 0]
702
+ (0..k).each{|i| t[i, 0] = 0}
703
+ return t if tk == 0
704
+ (k+1...mat.row_size).each{|i| t[i, 0] = t[i, 0].to_f / tk}
705
+ t
706
+ end
764
707
 
765
- #
766
- # Return the lower triangular matrix of LU factorization
767
- # L = M_1^{-1} * ... * M_{n-1}^{-1} = I + sum_{k=1}^{n-1} tau * e
768
- #
769
- def L
770
- LU.factorization(self)[0]
771
- end
708
+ #
709
+ # Return the Gauss transformation matrix: M_k = I - tau * e_k^T
710
+ def self.gauss(mat, k)
711
+ i = Matrix.I(mat.column_size)
712
+ tau = gauss_vector(mat, k)
713
+ e = i.row2matrix(k)
714
+ i - tau * e
715
+ end
716
+
717
+ #
718
+ # LU factorization: A = LU
719
+ # where L is lower triangular and U is upper triangular
720
+ def self.factorization(mat)
721
+ u = mat.clone
722
+ n = u.column_size
723
+ i = Matrix.I(n)
724
+ l = i.clone
725
+ (n-1).times {|k|
726
+ mk = gauss(u, k)
727
+ u = mk * u # M_{n-1} * ... * M_1 * A = U
728
+ l += i - mk # L = M_1^{-1} * ... * M_{n-1}^{-1} = I + sum_{k=1}^{n-1} tau * e
729
+ }
730
+ return l, u
731
+ end
732
+ end
733
+
734
+ #
735
+ # Return the upper triangular matrix of LU factorization
736
+ # M_{n-1} * ... * M_1 * A = U
737
+ def U
738
+ LU.factorization(self)[1]
739
+ end
740
+
741
+ #
742
+ # Return the lower triangular matrix of LU factorization
743
+ # L = M_1^{-1} * ... * M_{n-1}^{-1} = I + sum_{k=1}^{n-1} tau * e
744
+ def L
745
+ LU.factorization(self)[0]
746
+ end
772
747
 
773
748
  module Householder
774
749
  #
@@ -1083,8 +1058,12 @@ end
1083
1058
  #
1084
1059
  def self.J(p, q, c, s, n)
1085
1060
  j = Matrix.I(n)
1086
- j[p,p] = c; j[p, q] = s
1087
- j[q,p] = -s; j[q, q] = c
1061
+
1062
+ j[p,p] = c
1063
+ j[p,q] = s
1064
+ j[q,p] = -s
1065
+ j[q,q] = c
1066
+
1088
1067
  j
1089
1068
  end
1090
1069
  end
@@ -1133,5 +1112,3 @@ end
1133
1112
  cJacobi(tol)[1]
1134
1113
  end
1135
1114
  end
1136
-
1137
-
@@ -0,0 +1,3 @@
1
+ class Matrix
2
+ EXTENSION_VERSION = "0.4"
3
+ end
@@ -1,6 +1,6 @@
1
1
  $:.unshift(File.dirname(__FILE__)+"/../lib")
2
- require 'spec'
3
- require 'spec/autorun'
2
+ require 'rspec'
3
+ require 'rspec/core/rake_task'
4
4
 
5
5
  require 'extendmatrix'
6
6
 
@@ -90,6 +90,11 @@ describe "Vector class extension:" do
90
90
  it "sum method returns the sum of elements" do
91
91
  @v.sum.should==10
92
92
  end
93
+
94
+ it "allows for multiple assignment" do
95
+ a, b, c, d = @v
96
+ [a, b, c, d].should == [1, 2, 3, 4]
97
+ end
93
98
  end
94
99
 
95
100
  describe "Matrix class extension:" do
@@ -287,10 +292,22 @@ describe "Matrix class extension:" do
287
292
  eigenvalues=[1.92,1.88,0.0,0.0]
288
293
  eigen=m.eigen
289
294
  eigen[:eigenvalues].each_with_index do |v,i|
290
- v.should be_close(eigenvalues[i],0.01)
295
+ v.should be_within(0.01).of(eigenvalues[i])
291
296
  end
292
297
  eigenvectors=Matrix[[0.5, 0.5, 0.0, 0.707106781186547], [0.5, 0.5, 0.0, -0.707106781186547], [0.5, -0.5, 0.707106781186547, 0.0], [0.5, -0.5, -0.707106781186547, 0.0]]
293
- Matrix.equal_in_delta?(eigen[:eigenvectors], eigenvectors).should be_true
298
+ expect(Matrix.equal_in_delta?(eigen[:eigenvectors], eigenvectors)).to be(true)
299
+ end
300
+ it "eigenpairs" do
301
+ m=Matrix[[0.95,0.95,0.01,0.01],[0.95,0.95,0.01,0.01],[0.01, 0.01,0.95,0.95], [0.01, 0.01, 0.95, 0.95]]
302
+ eigenpairs=[[1.92, Vector[0.5, 0.5, 0.5, 0.5]], [1.88, Vector[0.5, 0.5, -0.5, -0.5]], [0.0, Vector[0.0, 0.0, 0.707, -0.707]], [0.0, Vector[0.707, -0.707, 0.0, 0.0]]]
303
+ observed=m.eigenpairs
304
+ eigenpairs.each_with_index do |v,i|
305
+ observed[i][0].should be_within(0.001).of(v[0])
306
+ observed[i][1].each_with_index {|vv,ii|
307
+ vv.should be_within(0.001).of(v[1][ii])
308
+ }
309
+
310
+ end
294
311
  end
295
312
  it "sqrt" do
296
313
  m=Matrix[[1,4,9],[16,25,36]]
@@ -418,6 +435,11 @@ describe "Matrix class extension:" do
418
435
  [4, 5, 4, 1]]
419
436
  e = Matrix[[-0.26828, 0, 0, 0], [0, -5.97550, 0, 0], [0, 0, 1.01373, 0], [0, 0, 0, 9.23004]]
420
437
  Matrix.diag_in_delta?(e, a.cJacobiA, 1.0e-5).should == true
421
- end
438
+ end
439
+
440
+ it "allows for multiple assignment" do
441
+ a, b = @m
442
+ [a, b].should == [[1, 2, 222], [2, 33, 4]]
443
+ end
422
444
  end
423
445
 
metadata CHANGED
@@ -1,130 +1,103 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: extendmatrix
3
- version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 0
7
- - 3
8
- - 1
9
- version: 0.3.1
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.4'
10
5
  platform: ruby
11
- authors:
6
+ authors:
12
7
  - Cosmin Bonchis
8
+ - Claudio Bustos
9
+ - Sameer Deshmukh
13
10
  autorequire:
14
11
  bindir: bin
15
- cert_chain:
16
- - |
17
- -----BEGIN CERTIFICATE-----
18
- MIIDMjCCAhqgAwIBAgIBADANBgkqhkiG9w0BAQUFADA/MREwDwYDVQQDDAhjbGJ1
19
- c3RvczEVMBMGCgmSJomT8ixkARkWBWdtYWlsMRMwEQYKCZImiZPyLGQBGRYDY29t
20
- MB4XDTEwMDMyOTIxMzg1NVoXDTExMDMyOTIxMzg1NVowPzERMA8GA1UEAwwIY2xi
21
- dXN0b3MxFTATBgoJkiaJk/IsZAEZFgVnbWFpbDETMBEGCgmSJomT8ixkARkWA2Nv
22
- bTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf8JVMGqE7m5kYb+PNN
23
- neZv2pcXV5fQCi6xkyG8bi2/SIFy/LyxuvLzEeOxBeaz1Be93bayIUquOIqw3dyw
24
- /KXWa31FxuNuvAm6CN8fyeRYX/ou4cw3OIUUnIvB7RMNIu4wbgeM6htV/QEsNLrv
25
- at1/mh9JpqawPrcjIOVMj4BIp67vmzJCaUf+S/H2uYtSO09F+YQE3tv85TPeRmqU
26
- yjyXyTc/oJiw1cXskUL8UtMWZmrwNLHXuZWWIMzkjiz3UNdhJr/t5ROk8S2WPznl
27
- 0bMy/PMIlAbqWolRn1zl2VFJ3TaXScbqImY8Wf4g62b/1ZSUlGrtnLNsCYXrWiso
28
- UPUCAwEAAaM5MDcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFGu9
29
- rrJ1H64qRmNNu3Jj/Qjvh0u5MA0GCSqGSIb3DQEBBQUAA4IBAQCV0Unka5isrhZk
30
- GjqSDqY/6hF+G2pbFcbWUpjmC8NWtAxeC+7NGV3ljd0e1SLfoyBj4gnFtFmY8qX4
31
- K02tgSZM0eDV8TpgFpWXzK6LzHvoanuahHLZEtk/+Z885lFene+nHadkem1n9iAB
32
- cs96JO9/JfFyuXM27wFAwmfHCmJfPF09R4VvGHRAvb8MGzSVgk2i06OJTqkBTwvv
33
- JHJdoyw3+8bw9RJ+jLaNoQ+xu+1pQdS2bb3m7xjZpufml/m8zFCtjYM/7qgkKR8z
34
- /ZZt8lCiKfFArppRrZayE2FVsps4X6WwBdrKTMZ0CKSXTRctbEj1BAZ67eoTvBBt
35
- rpP0jjs0
36
- -----END CERTIFICATE-----
37
-
38
- date: 2010-08-16 00:00:00 -04:00
39
- default_executable:
40
- dependencies:
41
- - !ruby/object:Gem::Dependency
42
- name: rubyforge
12
+ cert_chain: []
13
+ date: 2015-05-23 00:00:00.000000000 Z
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: bundler
17
+ requirement: !ruby/object:Gem::Requirement
18
+ requirements:
19
+ - - ">="
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
43
23
  prerelease: false
44
- requirement: &id001 !ruby/object:Gem::Requirement
45
- requirements:
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
46
26
  - - ">="
47
- - !ruby/object:Gem::Version
48
- segments:
49
- - 2
50
- - 0
51
- - 4
52
- version: 2.0.4
27
+ - !ruby/object:Gem::Version
28
+ version: '0'
29
+ - !ruby/object:Gem::Dependency
30
+ name: rake
31
+ requirement: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
53
36
  type: :development
54
- version_requirements: *id001
55
- - !ruby/object:Gem::Dependency
56
- name: hoe
57
37
  prerelease: false
58
- requirement: &id002 !ruby/object:Gem::Requirement
59
- requirements:
38
+ version_requirements: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ - !ruby/object:Gem::Dependency
44
+ name: rspec
45
+ requirement: !ruby/object:Gem::Requirement
46
+ requirements:
60
47
  - - ">="
61
- - !ruby/object:Gem::Version
62
- segments:
63
- - 2
64
- - 6
65
- - 1
66
- version: 2.6.1
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
67
50
  type: :development
68
- version_requirements: *id002
69
- description: |-
70
- The project consists of some enhancements to the Ruby "Matrix" module and includes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg) decompositions, bidiagonalization, eigenvalue and eigenvector calculations.
71
- Include some aditional code to obtains marginal for rows and columns.
72
-
73
- Original code from http://rubyforge.org/projects/matrix/ , done by Cosmin Bonchis as a Google Summer of Code 2007 project for Ruby Central Inc.
74
-
75
- Gem, github repository and current version manteined by Claudio Bustos.
76
- email:
77
- - cbonchis_info.uvt.ro
51
+ prerelease: false
52
+ version_requirements: !ruby/object:Gem::Requirement
53
+ requirements:
54
+ - - ">="
55
+ - !ruby/object:Gem::Version
56
+ version: '0'
57
+ description: "The project consists of some enhancements to the Ruby \"Matrix\" module
58
+ and \nincludes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg) \ndecompositions,
59
+ bidiagonalization, eigenvalue and eigenvector calculations.\n\nIncludes some aditional
60
+ code to obtains marginal for rows and columns.\n"
61
+ email:
62
+ - sameer.deshmukh93@gmail.com
78
63
  executables: []
79
-
80
64
  extensions: []
81
-
82
- extra_rdoc_files:
65
+ extra_rdoc_files: []
66
+ files:
67
+ - ".gitignore"
68
+ - ".rspec"
83
69
  - History.txt
84
70
  - LICENSE.txt
85
- - Manifest.txt
86
- - ORIGINAL_README.txt
87
- - README.txt
88
- files:
89
- - History.txt
90
- - LICENSE.txt
91
- - Manifest.txt
92
- - ORIGINAL_README.txt
93
- - README.txt
71
+ - README.md
94
72
  - Rakefile
73
+ - extendmatrix.gemspec
95
74
  - lib/extendmatrix.rb
75
+ - lib/version.rb
96
76
  - spec/extendmatrix_spec.rb
97
- - spec/spec.opts
98
- has_rdoc: true
99
- homepage: http://github.com/clbustos/extendmatrix
100
- licenses: []
101
-
77
+ homepage: http://github.com/SciRuby/extendmatrix
78
+ licenses:
79
+ - Apache v2
80
+ metadata: {}
102
81
  post_install_message:
103
- rdoc_options:
104
- - --main
105
- - README.txt
106
- require_paths:
82
+ rdoc_options: []
83
+ require_paths:
107
84
  - lib
108
- required_ruby_version: !ruby/object:Gem::Requirement
109
- requirements:
85
+ required_ruby_version: !ruby/object:Gem::Requirement
86
+ requirements:
110
87
  - - ">="
111
- - !ruby/object:Gem::Version
112
- segments:
113
- - 0
114
- version: "0"
115
- required_rubygems_version: !ruby/object:Gem::Requirement
116
- requirements:
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ required_rubygems_version: !ruby/object:Gem::Requirement
91
+ requirements:
117
92
  - - ">="
118
- - !ruby/object:Gem::Version
119
- segments:
120
- - 0
121
- version: "0"
93
+ - !ruby/object:Gem::Version
94
+ version: '0'
122
95
  requirements: []
123
-
124
- rubyforge_project: ruby-statsample
125
- rubygems_version: 1.3.6
96
+ rubyforge_project:
97
+ rubygems_version: 2.4.6
126
98
  signing_key:
127
- specification_version: 3
128
- summary: "The project consists of some enhancements to the Ruby \"Matrix\" module and includes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg) decompositions, bidiagonalization, eigenvalue and eigenvector calculations"
129
- test_files: []
130
-
99
+ specification_version: 4
100
+ summary: Enhancements to ruby "Matrix" and "Vector" modules
101
+ test_files:
102
+ - spec/extendmatrix_spec.rb
103
+ has_rdoc:
data.tar.gz.sig DELETED
Binary file
@@ -1,9 +0,0 @@
1
- History.txt
2
- LICENSE.txt
3
- Manifest.txt
4
- ORIGINAL_README.txt
5
- README.txt
6
- Rakefile
7
- lib/extendmatrix.rb
8
- spec/extendmatrix_spec.rb
9
- spec/spec.opts
@@ -1,22 +0,0 @@
1
- Extensions to the Ruby Matrix module
2
- ====================================
3
-
4
- This README is a small description of the work done by Cosmin Bonchis as a
5
- Google Summer of Code 2007 project for Ruby Central Inc.
6
-
7
- The project consists of some enhancements to the Ruby "Matrix" module and includes: LU and QR (Householder, Givens, Gram Schmidt, Hessenberg) decompositions, bidiagonalization, eigenvalue and eigenvector calculations.
8
-
9
- This archive contains in extendmatrix.rb file the source code of the project, an implementation of mapcar used in extending matrix, and all the tests files in the "tests" directory.
10
-
11
- The code can also be found on the RubyForge repository at http://matrix.rubyforge.org/svn/trunk/ or the project's SVN repository can be checked out through anonymous access with the following command(s).
12
-
13
- svn checkout svn://rubyforge.org/var/svn/matrix
14
- svn checkout http://matrix.rubyforge.org/svn/trunk/
15
-
16
-
17
- Relevant URLs:
18
- ==============
19
-
20
- Project sources:
21
- http://matrix.rubyforge.org/svn/trunk/
22
-
@@ -1 +0,0 @@
1
- --color
metadata.gz.sig DELETED
Binary file