rubysl-matrix 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +8 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE +25 -0
  6. data/README.md +29 -0
  7. data/Rakefile +1 -0
  8. data/lib/matrix.rb +1 -0
  9. data/lib/rubysl/matrix.rb +2 -0
  10. data/lib/rubysl/matrix/matrix.rb +1537 -0
  11. data/lib/rubysl/matrix/version.rb +5 -0
  12. data/rubysl-matrix.gemspec +27 -0
  13. data/spec/I_spec.rb +5 -0
  14. data/spec/build_spec.rb +75 -0
  15. data/spec/clone_spec.rb +26 -0
  16. data/spec/coerce_spec.rb +11 -0
  17. data/spec/collect_spec.rb +5 -0
  18. data/spec/column_size_spec.rb +14 -0
  19. data/spec/column_spec.rb +36 -0
  20. data/spec/column_vector_spec.rb +36 -0
  21. data/spec/column_vectors_spec.rb +25 -0
  22. data/spec/columns_spec.rb +45 -0
  23. data/spec/conj_spec.rb +7 -0
  24. data/spec/conjugate_spec.rb +7 -0
  25. data/spec/constructor_spec.rb +68 -0
  26. data/spec/det_spec.rb +6 -0
  27. data/spec/determinant_spec.rb +6 -0
  28. data/spec/diagonal_spec.rb +73 -0
  29. data/spec/divide_spec.rb +60 -0
  30. data/spec/each_spec.rb +77 -0
  31. data/spec/each_with_index_spec.rb +84 -0
  32. data/spec/eigenvalue_decomposition/eigenvalue_matrix_spec.rb +10 -0
  33. data/spec/eigenvalue_decomposition/eigenvalues_spec.rb +23 -0
  34. data/spec/eigenvalue_decomposition/eigenvector_matrix_spec.rb +23 -0
  35. data/spec/eigenvalue_decomposition/eigenvectors_spec.rb +25 -0
  36. data/spec/eigenvalue_decomposition/initialize_spec.rb +27 -0
  37. data/spec/eigenvalue_decomposition/to_a_spec.rb +19 -0
  38. data/spec/element_reference_spec.rb +24 -0
  39. data/spec/empty_spec.rb +69 -0
  40. data/spec/eql_spec.rb +12 -0
  41. data/spec/equal_value_spec.rb +10 -0
  42. data/spec/exponent_spec.rb +66 -0
  43. data/spec/find_index_spec.rb +147 -0
  44. data/spec/fixtures/classes.rb +7 -0
  45. data/spec/hash_spec.rb +14 -0
  46. data/spec/hermitian_spec.rb +37 -0
  47. data/spec/identity_spec.rb +5 -0
  48. data/spec/imag_spec.rb +7 -0
  49. data/spec/imaginary_spec.rb +7 -0
  50. data/spec/inspect_spec.rb +30 -0
  51. data/spec/inv_spec.rb +6 -0
  52. data/spec/inverse_from_spec.rb +5 -0
  53. data/spec/inverse_spec.rb +6 -0
  54. data/spec/lower_triangular_spec.rb +25 -0
  55. data/spec/lup_decomposition/determinant_spec.rb +24 -0
  56. data/spec/lup_decomposition/initialize_spec.rb +14 -0
  57. data/spec/lup_decomposition/l_spec.rb +19 -0
  58. data/spec/lup_decomposition/p_spec.rb +19 -0
  59. data/spec/lup_decomposition/solve_spec.rb +54 -0
  60. data/spec/lup_decomposition/to_a_spec.rb +36 -0
  61. data/spec/lup_decomposition/u_spec.rb +19 -0
  62. data/spec/map_spec.rb +5 -0
  63. data/spec/minor_spec.rb +90 -0
  64. data/spec/minus_spec.rb +45 -0
  65. data/spec/multiply_spec.rb +73 -0
  66. data/spec/new_spec.rb +7 -0
  67. data/spec/normal_spec.rb +27 -0
  68. data/spec/orthogonal_spec.rb +27 -0
  69. data/spec/permutation_spec.rb +33 -0
  70. data/spec/plus_spec.rb +45 -0
  71. data/spec/rank_spec.rb +24 -0
  72. data/spec/real_spec.rb +45 -0
  73. data/spec/rect_spec.rb +7 -0
  74. data/spec/rectangular_spec.rb +7 -0
  75. data/spec/regular_spec.rb +34 -0
  76. data/spec/round_spec.rb +24 -0
  77. data/spec/row_size_spec.rb +12 -0
  78. data/spec/row_spec.rb +37 -0
  79. data/spec/row_vector_spec.rb +33 -0
  80. data/spec/row_vectors_spec.rb +25 -0
  81. data/spec/rows_spec.rb +40 -0
  82. data/spec/scalar/Fail_spec.rb +5 -0
  83. data/spec/scalar/Raise_spec.rb +5 -0
  84. data/spec/scalar/divide_spec.rb +5 -0
  85. data/spec/scalar/exponent_spec.rb +5 -0
  86. data/spec/scalar/included_spec.rb +5 -0
  87. data/spec/scalar/initialize_spec.rb +5 -0
  88. data/spec/scalar/minus_spec.rb +5 -0
  89. data/spec/scalar/multiply_spec.rb +5 -0
  90. data/spec/scalar/plus_spec.rb +5 -0
  91. data/spec/scalar_spec.rb +66 -0
  92. data/spec/shared/collect.rb +29 -0
  93. data/spec/shared/conjugate.rb +21 -0
  94. data/spec/shared/determinant.rb +53 -0
  95. data/spec/shared/equal_value.rb +35 -0
  96. data/spec/shared/identity.rb +21 -0
  97. data/spec/shared/imaginary.rb +22 -0
  98. data/spec/shared/inverse.rb +42 -0
  99. data/spec/shared/rectangular.rb +20 -0
  100. data/spec/shared/trace.rb +14 -0
  101. data/spec/shared/transpose.rb +23 -0
  102. data/spec/singular_spec.rb +34 -0
  103. data/spec/spec_helper.rb +35 -0
  104. data/spec/square_spec.rb +29 -0
  105. data/spec/symmetric_spec.rb +30 -0
  106. data/spec/t_spec.rb +5 -0
  107. data/spec/to_a_spec.rb +5 -0
  108. data/spec/to_s_spec.rb +5 -0
  109. data/spec/tr_spec.rb +6 -0
  110. data/spec/trace_spec.rb +6 -0
  111. data/spec/transpose_spec.rb +5 -0
  112. data/spec/unit_spec.rb +5 -0
  113. data/spec/unitary_spec.rb +29 -0
  114. data/spec/upper_triangular_spec.rb +26 -0
  115. data/spec/vector/cross_product_spec.rb +25 -0
  116. data/spec/vector/each2_spec.rb +52 -0
  117. data/spec/vector/eql_spec.rb +17 -0
  118. data/spec/vector/inner_product_spec.rb +25 -0
  119. data/spec/vector/normalize_spec.rb +19 -0
  120. data/spec/zero_spec.rb +55 -0
  121. metadata +341 -0
@@ -0,0 +1,60 @@
1
+ require File.expand_path('../spec_helper', __FILE__)
2
+ require File.expand_path('../fixtures/classes', __FILE__)
3
+ require 'matrix'
4
+
5
+ describe "Matrix#/" do
6
+ before :each do
7
+ @a = Matrix[ [1, 2], [3, 4] ]
8
+ @b = Matrix[ [4, 5], [6, 7] ]
9
+ @c = Matrix[ [1.2, 2.4], [3.6, 4.8] ]
10
+ end
11
+
12
+ ruby_bug "?", "1.8.7" do
13
+ it "returns the result of dividing self by another Matrix" do
14
+ (@a / @b).should be_close_to_matrix([[2.5, -1.5], [1.5, -0.5]])
15
+ end
16
+ end
17
+
18
+ conflicts_with :Prime do
19
+ it "returns the result of dividing self by a Fixnum" do
20
+ (@a / 2).should == Matrix[ [0, 1], [1, 2] ]
21
+ end
22
+ end
23
+
24
+ conflicts_with :Prime do
25
+ it "returns the result of dividing self by a Bignum" do
26
+ (@a / bignum_value).should == Matrix[ [0, 0], [0, 0] ]
27
+ end
28
+ end
29
+
30
+ it "returns the result of dividing self by a Float" do
31
+ (@c / 1.2).should == Matrix[ [1, 2], [3, 4] ]
32
+ end
33
+
34
+ it "raises a Matrix::ErrDimensionMismatch if the matrices are different sizes" do
35
+ lambda { @a / Matrix[ [1] ] }.should raise_error(Matrix::ErrDimensionMismatch)
36
+ end
37
+
38
+ it "returns an instance of Matrix" do
39
+ (@a /@b).should be_kind_of(Matrix)
40
+ end
41
+
42
+ ruby_bug "redmine #5307", "1.9.3" do
43
+ describe "for a subclass of Matrix" do
44
+ it "returns an instance of that subclass" do
45
+ m = MatrixSub.ins
46
+ (m/m).should be_an_instance_of(MatrixSub)
47
+ (m/1).should be_an_instance_of(MatrixSub)
48
+ end
49
+ end
50
+ end
51
+
52
+ ruby_bug "redmine:2365", "1.8.7" do
53
+ it "raises a TypeError if other is of wrong type" do
54
+ lambda { @a / nil }.should raise_error(TypeError)
55
+ lambda { @a / "a" }.should raise_error(TypeError)
56
+ lambda { @a / [ [1, 2] ] }.should raise_error(TypeError)
57
+ lambda { @a / Object.new }.should raise_error(TypeError)
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,77 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.1" do
4
+ describe "Matrix#each" do
5
+ before :all do
6
+ @m = Matrix[ [1, 2, 3], [4, 5, 6] ]
7
+ @result = (1..6).to_a
8
+ end
9
+
10
+ it "returns an Enumerator when called without a block" do
11
+ enum = @m.each
12
+ enum.should be_an_instance_of(enumerator_class)
13
+ enum.to_a.should == @result
14
+ end
15
+
16
+ it "returns self" do
17
+ @m.each{}.should equal(@m)
18
+ end
19
+
20
+ it "yields the elements starting with the those of the first row" do
21
+ a = []
22
+ @m.each {|x| a << x}
23
+ a.should == @result
24
+ end
25
+ end
26
+ end
27
+
28
+ ruby_version_is "1.9.3" do
29
+ describe "Matrix#each with an argument" do
30
+ before :all do
31
+ @m = Matrix[ [1, 2, 3, 4], [5, 6, 7, 8] ]
32
+ @t = Matrix[ [1, 2], [3, 4], [5, 6], [7, 8] ]
33
+ end
34
+
35
+ it "raises an ArgumentError for unrecognized argument" do
36
+ lambda {
37
+ @m.each("all"){}
38
+ }.should raise_error(ArgumentError)
39
+ lambda {
40
+ @m.each(nil){}
41
+ }.should raise_error(ArgumentError)
42
+ lambda {
43
+ @m.each(:left){}
44
+ }.should raise_error(ArgumentError)
45
+ end
46
+
47
+ it "yields the rights elements when passed :diagonal" do
48
+ @m.each(:diagonal).to_a.should == [1, 6]
49
+ @t.each(:diagonal).to_a.should == [1, 4]
50
+ end
51
+
52
+ it "yields the rights elements when passed :off_diagonal" do
53
+ @m.each(:off_diagonal).to_a.should == [2, 3, 4, 5, 7, 8]
54
+ @t.each(:off_diagonal).to_a.should == [2, 3, 5, 6, 7, 8]
55
+ end
56
+
57
+ it "yields the rights elements when passed :lower" do
58
+ @m.each(:lower).to_a.should == [1, 5, 6]
59
+ @t.each(:lower).to_a.should == [1, 3, 4, 5, 6, 7, 8]
60
+ end
61
+
62
+ it "yields the rights elements when passed :strict_lower" do
63
+ @m.each(:strict_lower).to_a.should == [5]
64
+ @t.each(:strict_lower).to_a.should == [3, 5, 6, 7, 8]
65
+ end
66
+
67
+ it "yields the rights elements when passed :strict_upper" do
68
+ @m.each(:strict_upper).to_a.should == [2, 3, 4, 7, 8]
69
+ @t.each(:strict_upper).to_a.should == [2]
70
+ end
71
+
72
+ it "yields the rights elements when passed :upper" do
73
+ @m.each(:upper).to_a.should == [1, 2, 3, 4, 6, 7, 8]
74
+ @t.each(:upper).to_a.should == [1, 2, 4]
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,84 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.1" do
4
+ describe "Matrix#each_with_index" do
5
+ before :all do
6
+ @m = Matrix[ [1, 2, 3], [4, 5, 6] ]
7
+ @result = [
8
+ [1, 0, 0],
9
+ [2, 0, 1],
10
+ [3, 0, 2],
11
+ [4, 1, 0],
12
+ [5, 1, 1],
13
+ [6, 1, 2]
14
+ ]
15
+ end
16
+
17
+ it "returns an Enumerator when called without a block" do
18
+ enum = @m.each_with_index
19
+ enum.should be_an_instance_of(enumerator_class)
20
+ enum.to_a.should == @result
21
+ end
22
+
23
+ it "returns self" do
24
+ @m.each_with_index{}.should equal(@m)
25
+ end
26
+
27
+ it "yields the elements starting with the those of the first row" do
28
+ a = []
29
+ @m.each_with_index {|x, r, c| a << [x, r, c]}
30
+ a.should == @result
31
+ end
32
+ end
33
+ end
34
+
35
+ ruby_version_is "1.9.3" do
36
+ describe "Matrix#each_with_index with an argument" do
37
+ before :all do
38
+ @m = Matrix[ [1, 2, 3, 4], [5, 6, 7, 8] ]
39
+ @t = Matrix[ [1, 2], [3, 4], [5, 6], [7, 8] ]
40
+ end
41
+
42
+ it "raises an ArgumentError for unrecognized argument" do
43
+ lambda {
44
+ @m.each_with_index("all"){}
45
+ }.should raise_error(ArgumentError)
46
+ lambda {
47
+ @m.each_with_index(nil){}
48
+ }.should raise_error(ArgumentError)
49
+ lambda {
50
+ @m.each_with_index(:left){}
51
+ }.should raise_error(ArgumentError)
52
+ end
53
+
54
+ it "yields the rights elements when passed :diagonal" do
55
+ @m.each_with_index(:diagonal).to_a.should == [[1, 0, 0], [6, 1, 1]]
56
+ @t.each_with_index(:diagonal).to_a.should == [[1, 0, 0], [4, 1, 1]]
57
+ end
58
+
59
+ it "yields the rights elements when passed :off_diagonal" do
60
+ @m.each_with_index(:off_diagonal).to_a.should == [[2, 0, 1], [3, 0, 2], [4, 0, 3], [5, 1, 0], [7, 1, 2], [8, 1, 3]]
61
+ @t.each_with_index(:off_diagonal).to_a.should == [[2, 0, 1], [3, 1, 0], [5, 2, 0], [6, 2, 1], [7, 3, 0], [8, 3, 1]]
62
+ end
63
+
64
+ it "yields the rights elements when passed :lower" do
65
+ @m.each_with_index(:lower).to_a.should == [[1, 0, 0], [5, 1, 0], [6, 1, 1]]
66
+ @t.each_with_index(:lower).to_a.should == [[1, 0, 0], [3, 1, 0], [4, 1, 1], [5, 2, 0], [6, 2, 1], [7, 3, 0], [8, 3, 1]]
67
+ end
68
+
69
+ it "yields the rights elements when passed :strict_lower" do
70
+ @m.each_with_index(:strict_lower).to_a.should == [[5, 1, 0]]
71
+ @t.each_with_index(:strict_lower).to_a.should == [[3, 1, 0], [5, 2, 0], [6, 2, 1], [7, 3, 0], [8, 3, 1]]
72
+ end
73
+
74
+ it "yields the rights elements when passed :strict_upper" do
75
+ @m.each_with_index(:strict_upper).to_a.should == [[2, 0, 1], [3, 0, 2], [4, 0, 3], [7, 1, 2], [8, 1, 3]]
76
+ @t.each_with_index(:strict_upper).to_a.should == [[2, 0, 1]]
77
+ end
78
+
79
+ it "yields the rights elements when passed :upper" do
80
+ @m.each_with_index(:upper).to_a.should == [[1, 0, 0], [2, 0, 1], [3, 0, 2], [4, 0, 3], [6, 1, 1], [7, 1, 2], [8, 1, 3]]
81
+ @t.each_with_index(:upper).to_a.should == [[1, 0, 0], [2, 0, 1], [4, 1, 1]]
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,10 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#eigenvalue_matrix" do
5
+ it "returns a diagonal matrix with the eigenvalues on the diagonal" do
6
+ Matrix[[14, 16], [-6, -6]].eigensystem.eigenvalue_matrix.should == Matrix[[6, 0],[0, 2]]
7
+ Matrix[[1, 1], [-1, 1]].eigensystem.eigenvalue_matrix.should == Matrix[[Complex(1,1), 0],[0, Complex(1,-1)]]
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,23 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#eigenvalues" do
5
+ it "returns an array of complex eigenvalues for a rotation matrix" do
6
+ Matrix[[ 1, 1],
7
+ [-1, 1]].eigensystem.eigenvalues.sort_by{|v| v.imag}.should ==
8
+ [ Complex(1, -1), Complex(1, 1)]
9
+ end
10
+
11
+ it "returns an array of real eigenvalues for a symetric matrix" do
12
+ Matrix[[1, 2],
13
+ [2, 1]].eigensystem.eigenvalues.sort.map!{|x| x.round(10)}.should ==
14
+ [ -1, 3 ]
15
+ end
16
+
17
+ it "returns an array of real eigenvalues for a matrix" do
18
+ Matrix[[14, 16],
19
+ [-6, -6]].eigensystem.eigenvalues.sort.map!{|x| x.round(10)}.should ==
20
+ [ 2, 6 ]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#eigenvector_matrix" do
5
+ ruby_bug '#7208', '1.9.3' do
6
+ it "returns a complex eigenvector matrix given a rotation matrix" do
7
+ # Fix me: should test for linearity, not for equality
8
+ Matrix[[ 1, 1],
9
+ [-1, 1]].eigensystem.eigenvector_matrix.should ==
10
+ Matrix[[1, 1],
11
+ [Complex(0, 1), Complex(0, -1)]]
12
+ end
13
+ end
14
+
15
+ it "returns an real eigenvector matrix for a symetric matrix" do
16
+ # Fix me: should test for linearity, not for equality
17
+ Matrix[[1, 2],
18
+ [2, 1]].eigensystem.eigenvector_matrix.should ==
19
+ Matrix[[0.7071067811865475, 0.7071067811865475],
20
+ [-0.7071067811865475, 0.7071067811865475]]
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,25 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#eigenvectors" do
5
+ ruby_bug '#7208', '1.9.3' do
6
+ it "returns an array of complex eigenvectors for a rotation matrix" do
7
+ # Fix me: should test for linearity, not for equality
8
+ Matrix[[ 1, 1],
9
+ [-1, 1]].eigensystem.eigenvectors.should ==
10
+ [ Vector[1, Complex(0, 1)],
11
+ Vector[1, Complex(0, -1)]
12
+ ]
13
+ end
14
+ end
15
+
16
+ it "returns an array of real eigenvectors for a symetric matrix" do
17
+ # Fix me: should test for linearity, not for equality
18
+ Matrix[[1, 2],
19
+ [2, 1]].eigensystem.eigenvectors.should ==
20
+ [ Vector[0.7071067811865475, -0.7071067811865475],
21
+ Vector[0.7071067811865475, 0.7071067811865475]
22
+ ]
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,27 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#initialize" do
5
+ it "raises an error if argument is not a matrix" do
6
+ lambda {
7
+ Matrix::EigenvalueDecomposition.new([[]])
8
+ }.should raise_error(TypeError)
9
+ lambda {
10
+ Matrix::EigenvalueDecomposition.new(42)
11
+ }.should raise_error(TypeError)
12
+ end
13
+
14
+ it "raises an error if matrix is not square" do
15
+ lambda {
16
+ Matrix::EigenvalueDecomposition.new(Matrix[[1, 2]])
17
+ }.should raise_error(Matrix::ErrDimensionMismatch)
18
+ end
19
+
20
+ ruby_bug "Fixed in Jama 1.0.3", "1.9.3" do
21
+ it "never hangs" do
22
+ m = Matrix[ [0,0,0,0,0], [0,0,0,0,1], [0,0,0,1,0], [1,1,0,0,1], [1,0,1,0,1] ]
23
+ Matrix::EigenvalueDecomposition.new(m).should_not == "infinite loop"
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ require 'matrix'
2
+
3
+ ruby_version_is "1.9.3" do
4
+ describe "Matrix::EigenvalueDecomposition#to_a" do
5
+ before :each do
6
+ @a = Matrix[[14, 16], [-6, -6]]
7
+ @e = Matrix::EigenvalueDecomposition.new(@a)
8
+ end
9
+
10
+ it "returns an array of with [V, D, V.inv]" do
11
+ @e.to_a.should == [@e.v, @e.d, @e.v_inv]
12
+ end
13
+
14
+ it "returns a factorization" do
15
+ v, d, v_inv = @e.to_a
16
+ (v * d * v_inv).map{|e| e.round(10)}.should == @a
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'matrix'
2
+
3
+ describe "Matrix#[]" do
4
+
5
+ before(:all) do
6
+ @m = Matrix[[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]]
7
+ end
8
+
9
+ it "returns element at (i, j)" do
10
+ (0..3).each do |i|
11
+ (0..2).each do |j|
12
+ @m[i, j].should == (i * 3) + j
13
+ end
14
+ end
15
+ end
16
+
17
+ ruby_bug "#1518", "1.8.7" do
18
+ it "returns nil for an invalid index pair" do
19
+ @m[8,1].should be_nil
20
+ @m[1,8].should be_nil
21
+ end
22
+ end
23
+
24
+ end
@@ -0,0 +1,69 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ ruby_version_is "1.8.8" do
5
+ describe "Matrix#empty?" do
6
+ it "returns true when the Matrix is empty" do
7
+ Matrix[ ].empty?.should be_true
8
+ Matrix[ [], [], [] ].empty?.should be_true
9
+ Matrix[ [], [], [] ].transpose.empty?.should be_true
10
+ end
11
+
12
+ it "returns false when the Matrix has elements" do
13
+ Matrix[ [1, 2] ].empty?.should be_false
14
+ Matrix[ [1], [2] ].empty?.should be_false
15
+ end
16
+
17
+ it "doesn't accept any parameter" do
18
+ lambda{
19
+ Matrix[ [1, 2] ].empty?(42)
20
+ }.should raise_error(ArgumentError)
21
+ end
22
+ end
23
+
24
+ describe "Matrix.empty" do
25
+ it "returns an empty matrix of the requested size" do
26
+ m = Matrix.empty(3, 0)
27
+ m.row_size.should == 3
28
+ m.column_size.should == 0
29
+
30
+ m = Matrix.empty(0, 3)
31
+ m.row_size.should == 0
32
+ m.column_size.should == 3
33
+ end
34
+
35
+ it "has arguments defaulting to 0" do
36
+ Matrix.empty.should == Matrix.empty(0, 0)
37
+ Matrix.empty(42).should == Matrix.empty(42, 0)
38
+ end
39
+
40
+ it "does not accept more than two parameters" do
41
+ lambda{
42
+ Matrix.empty(1, 2, 3)
43
+ }.should raise_error(ArgumentError)
44
+ end
45
+
46
+ it "raises an error if both dimensions are > 0" do
47
+ lambda{
48
+ Matrix.empty(1, 2)
49
+ }.should raise_error(ArgumentError)
50
+ end
51
+
52
+ it "raises an error if any dimension is < 0" do
53
+ lambda{
54
+ Matrix.empty(-2, 0)
55
+ }.should raise_error(ArgumentError)
56
+
57
+ lambda{
58
+ Matrix.empty(0, -2)
59
+ }.should raise_error(ArgumentError)
60
+ end
61
+
62
+ end
63
+
64
+ describe "for a subclass of Matrix" do
65
+ it "returns an instance of that subclass" do
66
+ MatrixSub.empty(0, 1).should be_an_instance_of(MatrixSub)
67
+ end
68
+ end
69
+ end