From 014d808f76046613a0ee780dcc220b694f1b4ce5 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Fri, 8 Feb 2013 11:24:47 -0500 Subject: [PATCH 1/7] Fixed SegFault when #rows < #columns --- Rakefile | 2 +- lib/svd_matrix.rb | 48 ++++++++++++++++++++++++++++++----------------- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/Rakefile b/Rakefile index cf700dd..fb35c96 100644 --- a/Rakefile +++ b/Rakefile @@ -43,7 +43,7 @@ task :test => :check_dependencies task :default => :test -require 'rake/rdoctask' +require 'rdoc/task' Rake::RDocTask.new do |rdoc| version = File.exist?('VERSION') ? File.read('VERSION') : "" diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index 2e38d22..3955660 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -6,6 +6,7 @@ class SVDMatrix < Matrix # Create a new SVD Matrix with m rows, n columns def initialize(m, n) + @row_size = m @rows = Array.new(m) @column_size = n m.times {|i| @rows[i] = Array.new(n)} @@ -37,23 +38,36 @@ def inspect # [ 0, 0, 0, 0 ] def decompose(reduce_dimensions_to = nil) input_array = [] - @rows.each {|row| input_array += row} - u_array, w_array, v_array = SVD.decompose(input_array, row_size, column_size) - - # recompose U matrix - u = SVDMatrix.new(row_size, reduce_dimensions_to || column_size) - row_size.times {|i| u.set_row(i, u_array.slice!(0, column_size)[0...(reduce_dimensions_to || column_size)])} - - # recompose V matrix - v = SVDMatrix.new(column_size, reduce_dimensions_to || column_size) - column_size.times {|i| v.set_row(i, v_array.slice!(0, column_size)[0...(reduce_dimensions_to || column_size)])} - - # diagonalise W array as a matrix - if reduce_dimensions_to - w_array = w_array[0...reduce_dimensions_to] - end - w = Matrix.diagonal(*w_array) - + + if @row_size >= @column_size + + @rows.each {|row| input_array += row} + u_array, w_array, v_array = SVD.decompose(input_array, row_size, column_size) + + # recompose U matrix + u = SVDMatrix.new(row_size, reduce_dimensions_to || column_size) + row_size.times {|i| u.set_row(i, u_array.slice!(0, column_size)[0...(reduce_dimensions_to || column_size)])} + + # recompose V matrix + v = SVDMatrix.new(column_size, reduce_dimensions_to || column_size) + column_size.times {|i| v.set_row(i, v_array.slice!(0, column_size)[0...(reduce_dimensions_to || column_size)])} + + # diagonalise W array as a matrix + if reduce_dimensions_to + w_array = w_array[0...reduce_dimensions_to] + end + w = Matrix.diagonal(*w_array) + + else + + transpose = SVDMatrix.new( @column_size, @row_size ) + for i in 0..@column_size-1 + transpose.set_row(i, @rows[i].to_a ) + end + v , w, u = transpose.decompose( reduce_dimensions_to || @row_size ) + + end + [u, w, v] end From d569dc33178091d21798d6b734ad660847aa75c6 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Fri, 8 Feb 2013 11:26:21 -0500 Subject: [PATCH 2/7] Version bump --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 167b000..389facc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.5.4 \ No newline at end of file +0.5.5 \ No newline at end of file From 72cf3e60d6cd477a8e3dc5b7d935704b5aca9117 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Fri, 8 Feb 2013 17:25:41 -0500 Subject: [PATCH 3/7] Forgot the actual transpose. duuuuhhhhh --- lib/svd_matrix.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index 3955660..798af8e 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -61,6 +61,7 @@ def decompose(reduce_dimensions_to = nil) else transpose = SVDMatrix.new( @column_size, @row_size ) + @rows = @rows.transpose for i in 0..@column_size-1 transpose.set_row(i, @rows[i].to_a ) end From 22e01ca89e380673b2436970208b089d1c95f65d Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Thu, 11 Apr 2013 10:56:02 -0400 Subject: [PATCH 4/7] Cutting extras from SVDMatrix --- lib/svd_matrix.rb | 5 ----- 1 file changed, 5 deletions(-) diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index 798af8e..4bad654 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -12,11 +12,6 @@ def initialize(m, n) m.times {|i| @rows[i] = Array.new(n)} end - # Set the value of the cell i, j - def []=(i, j, val) - @rows[i][j] = val - end - # Set the value of a row to an array def set_row(i, row) @rows[i] = row From 35798dbf46de3d727030bd3ee70dfadfd8348416 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Thu, 11 Apr 2013 11:45:00 -0400 Subject: [PATCH 5/7] making set_element public --- lib/svd_matrix.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index 4bad654..c549c80 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -3,7 +3,7 @@ class SVDMatrix < Matrix public_class_method :new - + public: "[]=", :set_element, :set_component # Create a new SVD Matrix with m rows, n columns def initialize(m, n) @row_size = m From a5f4826ce5ae97219a8624649dd89ee2f9d23cf3 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Thu, 11 Apr 2013 11:51:49 -0400 Subject: [PATCH 6/7] same --- lib/svd_matrix.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index c549c80..05d3515 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -3,7 +3,7 @@ class SVDMatrix < Matrix public_class_method :new - public: "[]=", :set_element, :set_component + public :"[]=", :set_element, :set_component # Create a new SVD Matrix with m rows, n columns def initialize(m, n) @row_size = m From eed6a47be4ac7a76ff29a1a8b649859f163a5530 Mon Sep 17 00:00:00 2001 From: Max Chistokletov Date: Thu, 11 Apr 2013 14:29:52 -0400 Subject: [PATCH 7/7] setting each element to 0 on init --- lib/svd_matrix.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/svd_matrix.rb b/lib/svd_matrix.rb index 05d3515..ac37642 100644 --- a/lib/svd_matrix.rb +++ b/lib/svd_matrix.rb @@ -9,7 +9,7 @@ def initialize(m, n) @row_size = m @rows = Array.new(m) @column_size = n - m.times {|i| @rows[i] = Array.new(n)} + m.times {|i| @rows[i] = Array.new(n) {0} } end # Set the value of a row to an array