Sha256: 8b5145ccb3f5155bff6fa4baba63635b033226e33ed4eb10f0e091ecc6aa9ab2

Contents?: true

Size: 1.4 KB

Versions: 7

Compression:

Stored size: 1.4 KB

Contents

##
# Class to orthonormalize a set of numbers
class Digiproc::Strategies::GramSchmidtOrthonormalize

    attr_reader :original_matrix, :orthonormalized_matrix

    ##
    # == Input Args
    # matrix:: 2D array, each row is a set of numbers that should be orthogonalized
    def initialize(matrix)
        @original_vectors = matrix
        # if matrix.is_a? Array
        #     matrix = Vector.elements(matrix)
        # end
        vector_matrix = matrix.map { |vector| vector.is_a?(Array) ? Vector.elements(vector) : vector }
        @orthonormalized_matrix = gram_schmidt(vector_matrix)
    end

    ##
    # No input arguments
    # Output is a 2D array of Orthonormalized sets of numbers corresponding to the input set of numbers
    def output
        @orthonormalized_matrix.map{|vector| vector.to_a } 
    end

    private

    def gram_schmidt(matrix)
        u = []
        u << normalize_vector(matrix.first)
        for i in 1...matrix.length do 
            u << matrix[i]
            for j in 0...i
                u[i] = u[i] - u[i].project_onto(u[j])
                # puts u.last.to_s if i == matrix.length - 1
            end
            u[i] = normalize_vector(u[i])
        end
        return u
    end

    def normalize_vector(vector)
        begin
           vector.normalize
        rescue Vector::ZeroVectorError
            vector
        end
    end

end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
digiproc-0.2.5 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.2.4 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.2.3 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.2.2 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.2.1 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.2.0 lib/strategies/orthogonalize/gram_schmidt.rb
digiproc-0.1.0 lib/strategies/orthogonalize/gram_schmidt.rb