diff --git a/NEWS b/NEWS index 112fb0e..6d54696 100644 --- a/NEWS +++ b/NEWS @@ -63,6 +63,7 @@ with all sufficient information, see the ChangeLog file. * Vector * New methods: + * Vector.basis Creates a standard basis +n+-vector. * Vector#@+ and Vector#@- . * Method diff --git a/lib/matrix.rb b/lib/matrix.rb index e5dd833..0bc7b7c 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -1562,6 +1562,7 @@ end # To create a Vector: # * Vector.[](*array) # * Vector.elements(array, copy = true) +# * Vector.basis(n, k) # # To access elements: # * #[](i) @@ -1627,6 +1628,16 @@ class Vector end # + # Creates a standard basis +n+-vector. + # + def Vector.basis(n, k) + raise ArgumentError, "invalid n (#{n} for 1..)" if n < 1 + raise ArgumentError, "invalid k (#{k} for 0..#{n - 1})" unless 0 <= k && k < n + array = Array.new(n) {|i| i == k ? 1 : 0 } + new convert_to_array(array, false) + end + + # # Vector.new is private; use Vector[] or Vector.elements to create. # def initialize(array) diff --git a/test/matrix/test_vector.rb b/test/matrix/test_vector.rb index 337aaa8..820bce5 100644 --- a/test/matrix/test_vector.rb +++ b/test/matrix/test_vector.rb @@ -10,6 +10,13 @@ class TestVector < Test::Unit::TestCase @w1 = Vector[2,3,4] end + def test_basis + assert_equal(Vector[1, 0, 0], Vector.basis(3, 0)) + assert_raise(ArgumentError) { Vector.basis(-1, 2) } + assert_raise(ArgumentError) { Vector.basis(4, -1) } + assert_raise(ArgumentError) { Vector.basis(3, 3) } + end + def test_identity assert_same @v1, @v1 assert_not_same @v1, @v2