rubysl-matrix 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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,5 @@
1
+ module RubySL
2
+ module Matrix
3
+ VERSION = "1.0.0"
4
+ end
5
+ end
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ require './lib/rubysl/matrix/version'
3
+
4
+ Gem::Specification.new do |spec|
5
+ spec.name = "rubysl-matrix"
6
+ spec.version = RubySL::Matrix::VERSION
7
+ spec.authors = ["Brian Shirai"]
8
+ spec.email = ["brixen@gmail.com"]
9
+ spec.description = %q{Ruby standard library matrix.}
10
+ spec.summary = %q{Ruby standard library matrix.}
11
+ spec.homepage = "https://github.com/rubysl/rubysl-matrix"
12
+ spec.license = "BSD"
13
+
14
+ spec.files = `git ls-files`.split($/)
15
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
16
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
+ spec.require_paths = ["lib"]
18
+
19
+ spec.required_ruby_version = "~> 1.8.7"
20
+
21
+ spec.add_runtime_dependency "rubysl-e2mmap", "~> 1.0"
22
+
23
+ spec.add_development_dependency "bundler", "~> 1.3"
24
+ spec.add_development_dependency "rake", "~> 10.0"
25
+ spec.add_development_dependency "mspec", "~> 1.5"
26
+ spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
27
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../shared/identity', __FILE__)
2
+
3
+ describe "Matrix.I" do
4
+ it_behaves_like(:matrix_identity, :I)
5
+ end
@@ -0,0 +1,75 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ ruby_version_is "1.9" do
5
+ describe "Matrix.build" do
6
+
7
+ it "returns a Matrix object of the given size" do
8
+ m = Matrix.build(3, 4){1}
9
+ m.should be_an_instance_of(Matrix)
10
+ m.row_size.should == 3
11
+ m.column_size.should == 4
12
+ end
13
+
14
+ it "builds the Matrix using the given block" do
15
+ Matrix.build(2, 3){|col, row| 10*col - row}.should ==
16
+ Matrix[[0, -1, -2], [10, 9, 8]]
17
+ end
18
+
19
+ it "iterates through the first row, then the second, ..." do
20
+ acc = []
21
+ Matrix.build(2, 3){|*args| acc << args}
22
+ acc.should == [[0, 0], [0, 1], [0, 2], [1, 0], [1, 1], [1, 2]]
23
+ end
24
+
25
+ it "returns an Enumerator is no block is given" do
26
+ enum = Matrix.build(2, 1)
27
+ enum.should be_an_instance_of(enumerator_class)
28
+ enum.each{1}.should == Matrix[[1], [1]]
29
+ end
30
+
31
+ it "requires integers as parameters" do
32
+ lambda { Matrix.build("1", "2"){1} }.should raise_error(TypeError)
33
+ lambda { Matrix.build(nil, nil){1} }.should raise_error(TypeError)
34
+ lambda { Matrix.build(1..2){1} }.should raise_error(TypeError)
35
+ end
36
+
37
+ it "requires non-negative integers" do
38
+ lambda { Matrix.build(-1, 1){1} }.should raise_error(ArgumentError)
39
+ lambda { Matrix.build(+1,-1){1} }.should raise_error(ArgumentError)
40
+ end
41
+
42
+ it "returns empty Matrix if one argument is zero" do
43
+ m = Matrix.build(0, 3){
44
+ raise "Should not yield"
45
+ }
46
+ m.should be_empty
47
+ m.column_size.should == 3
48
+
49
+ m = Matrix.build(3, 0){
50
+ raise "Should not yield"
51
+ }
52
+ m.should be_empty
53
+ m.row_size.should == 3
54
+ end
55
+
56
+ it "tries to calls :to_int on arguments" do
57
+ int = mock('int')
58
+ int.should_receive(:to_int).twice.and_return(2)
59
+ Matrix.build(int, int){ 1 }.should == Matrix[ [1,1], [1,1] ]
60
+ end
61
+
62
+ it "builds an nxn Matrix when given only one argument" do
63
+ m = Matrix.build(3){1}
64
+ m.row_size.should == 3
65
+ m.column_size.should == 3
66
+ end
67
+ end
68
+
69
+ describe "for a subclass of Matrix" do
70
+ it "returns an instance of that subclass" do
71
+ MatrixSub.build(3){1}.should be_an_instance_of(MatrixSub)
72
+ end
73
+ end
74
+ end
75
+
@@ -0,0 +1,26 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix#clone" do
5
+ before(:each) do
6
+ @a = Matrix[[1, 2], [3, 4], [5, 6]]
7
+ end
8
+
9
+ it "returns a shallow copy of the matrix" do
10
+ b = @a.clone
11
+ @a.should_not equal(b)
12
+ b.should be_kind_of(Matrix)
13
+ b.should == @a
14
+ 0.upto(@a.row_size - 1) do |i|
15
+ @a.row(i).should_not equal(b.row(i))
16
+ end
17
+ end
18
+
19
+ ruby_bug "redmine #5307", "1.9.3" do
20
+ describe "for a subclass of Matrix" do
21
+ it "returns an instance of that subclass" do
22
+ MatrixSub.ins.clone.should be_an_instance_of(MatrixSub)
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,11 @@
1
+ require 'matrix'
2
+
3
+ describe "Matrix#coerce" do
4
+ it "needs to be reviewed for spec completeness"
5
+
6
+ ruby_bug "revision 24952", "1.8.7" do
7
+ it "allows the division of fixnum by a Matrix " do
8
+ (1/Matrix[[0,1],[-1,0]]).should == Matrix[[0,-1],[1,0]]
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ require File.expand_path('../shared/collect', __FILE__)
2
+
3
+ describe "Matrix#collect" do
4
+ it_behaves_like(:collect, :collect)
5
+ end
@@ -0,0 +1,14 @@
1
+ require 'matrix'
2
+
3
+ describe "Matrix#column_size" do
4
+ it "returns the number of columns" do
5
+ Matrix[ [1,2], [3,4] ].column_size.should == 2
6
+ end
7
+
8
+ ruby_bug "redmine:1532", "1.8.7" do
9
+ it "returns 0 for empty matrices" do
10
+ Matrix[ [], [] ].column_size.should == 0
11
+ Matrix[ ].column_size.should == 0
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,36 @@
1
+ require 'matrix'
2
+
3
+ describe "Matrix#column" do
4
+ before :all do
5
+ @m = Matrix[[1,2,3], [2,3,4]]
6
+ end
7
+
8
+ it "returns a Vector when called without a block" do
9
+ @m.column(1).should == Vector[2,3]
10
+ end
11
+
12
+ it "yields each element in the column to the block" do
13
+ a = []
14
+ @m.column(1) {|n| a << n }
15
+ a.should == [2,3]
16
+ end
17
+
18
+ it "counts backwards for negative argument" do
19
+ @m.column(-1).should == Vector[3, 4]
20
+ end
21
+
22
+ ruby_bug "redmine:1532", "1.8.7" do
23
+ it "returns self when called with a block" do
24
+ @m.column(0) { |x| x }.should equal(@m)
25
+ end
26
+
27
+ it "returns nil when out of bounds" do
28
+ @m.column(3).should == nil
29
+ end
30
+
31
+ it "never yields when out of bounds" do
32
+ lambda { @m.column(3){ raise } }.should_not raise_error
33
+ lambda { @m.column(-4){ raise } }.should_not raise_error
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,36 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix.column_vector" do
5
+
6
+ it "returns a single column Matrix when called with an Array" do
7
+ m = Matrix.column_vector([4,5,6])
8
+ m.should be_an_instance_of(Matrix)
9
+ m.should == Matrix[ [4],[5],[6] ]
10
+ end
11
+
12
+ ruby_bug "redmine:1532", "1.8.7" do
13
+ it "returns an empty Matrix when called with an empty Array" do
14
+ m = Matrix.column_vector([])
15
+ m.should be_an_instance_of(Matrix)
16
+ m.row_size.should == 0
17
+ m.column_size.should == 1
18
+ end
19
+ end
20
+
21
+ ruby_version_is ""..."1.9" do
22
+ describe "for a subclass of Matrix" do
23
+ it "returns an instance of Matrix" do
24
+ MatrixSub.column_vector([4,5,6]).should be_an_instance_of(Matrix)
25
+ end
26
+ end
27
+ end
28
+
29
+ ruby_version_is "1.9" do
30
+ describe "for a subclass of Matrix" do
31
+ it "returns an instance of that subclass" do
32
+ MatrixSub.column_vector([4,5,6]).should be_an_instance_of(MatrixSub)
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,25 @@
1
+ require 'matrix'
2
+
3
+ describe "Matrix#column_vectors" do
4
+
5
+ before(:each) do
6
+ @vectors = Matrix[ [1,2], [3,4] ].column_vectors
7
+ end
8
+
9
+ it "returns an Array" do
10
+ Matrix[ [1,2], [3,4] ].column_vectors.should be_an_instance_of(Array)
11
+ end
12
+
13
+ it "returns an Array of Vectors" do
14
+ @vectors.all? {|v| v.should be_an_instance_of(Vector)}
15
+ end
16
+
17
+ it "returns each column as a Vector" do
18
+ @vectors.should == [Vector[1,3], Vector[2,4]]
19
+ end
20
+
21
+ it "returns an empty Array for empty matrices" do
22
+ Matrix[ [] ].column_vectors.should == []
23
+ end
24
+
25
+ end
@@ -0,0 +1,45 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix.columns" do
5
+ before :each do
6
+ @a = [1, 2]
7
+ @b = [3, 4]
8
+ @m = Matrix.columns([@a, @b])
9
+ end
10
+
11
+ it "creates a Matrix from argument columns" do
12
+ @m.should be_an_instance_of(Matrix)
13
+ @m.column(0).to_a.should == @a
14
+ @m.column(1).to_a.should == @b
15
+ end
16
+
17
+ it "accepts Vectors as argument columns" do
18
+ m = Matrix.columns([Vector[*@a], Vector[*@b]])
19
+ m.should == @m
20
+ m.column(0).to_a.should == @a
21
+ m.column(1).to_a.should == @b
22
+ end
23
+
24
+ ruby_bug "redmine:1532", "1.8.7" do
25
+ it "handles empty matrices" do
26
+ e = Matrix.columns([])
27
+ e.row_size.should == 0
28
+ e.column_size.should == 0
29
+ e.should == Matrix[]
30
+
31
+ v = Matrix.columns([[],[],[]])
32
+ v.row_size.should == 0
33
+ v.column_size.should == 3
34
+ v.should == Matrix[[], [], []].transpose
35
+ end
36
+ end
37
+
38
+ ruby_bug "redmine #5307", "1.9.3" do
39
+ describe "for a subclass of Matrix" do
40
+ it "returns an instance of that subclass" do
41
+ MatrixSub.columns([[1]]).should be_an_instance_of(MatrixSub)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../shared/conjugate', __FILE__)
2
+
3
+ ruby_version_is "1.9" do
4
+ describe "Matrix#conj" do
5
+ it_behaves_like(:matrix_conjugate, :conj)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require File.expand_path('../shared/conjugate', __FILE__)
2
+
3
+ ruby_version_is "1.9" do
4
+ describe "Matrix#conjugate" do
5
+ it_behaves_like(:matrix_conjugate, :conjugate)
6
+ end
7
+ end
@@ -0,0 +1,68 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix.[]" do
5
+
6
+ ruby_bug "redmine:1532", "1.8.7" do
7
+ it "requires arrays as parameters" do
8
+ lambda { Matrix[5] }.should raise_error(TypeError)
9
+ lambda { Matrix[nil] }.should raise_error(TypeError)
10
+ lambda { Matrix[1..2] }.should raise_error(TypeError)
11
+ lambda { Matrix[[1, 2], 3] }.should raise_error(TypeError)
12
+ end
13
+
14
+ it "creates an empty Matrix with no arguments" do
15
+ m = Matrix[]
16
+ m.column_size.should == 0
17
+ m.row_size.should == 0
18
+ end
19
+
20
+ it "raises for non-rectangular matrices" do
21
+ lambda{ Matrix[ [0], [0,1] ] }.should \
22
+ raise_error(Matrix::ErrDimensionMismatch)
23
+ lambda{ Matrix[ [0,1], [0,1,2], [0,1] ]}.should \
24
+ raise_error(Matrix::ErrDimensionMismatch)
25
+ end
26
+
27
+ it "accepts vector arguments" do
28
+ a = Matrix[Vector[1, 2], Vector[3, 4]]
29
+ a.should be_an_instance_of(Matrix)
30
+ a.should == Matrix[ [1, 2], [3, 4] ]
31
+ end
32
+
33
+ it "tries to calls :to_ary on arguments" do
34
+ array = mock('ary')
35
+ array.should_receive(:to_ary).and_return([1,2])
36
+ Matrix[array, [3,4] ].should == Matrix[ [1,2], [3,4] ]
37
+ end
38
+
39
+ end
40
+
41
+ it "returns a Matrix object" do
42
+ Matrix[ [1] ].should be_an_instance_of(Matrix)
43
+ end
44
+
45
+ it "can create an nxn Matrix" do
46
+ m = Matrix[ [20,30], [40.5, 9] ]
47
+ m.row_size.should == 2
48
+ m.column_size.should == 2
49
+ m.column(0).should == Vector[20, 40.5]
50
+ m.column(1).should == Vector[30, 9]
51
+ m.row(0).should == Vector[20, 30]
52
+ m.row(1).should == Vector[40.5, 9]
53
+ end
54
+
55
+ it "can create a 0xn Matrix" do
56
+ m = Matrix[ [], [], [] ]
57
+ m.row_size.should == 3
58
+ m.column_size.should == 0
59
+ end
60
+
61
+ ruby_bug "redmine #5307", "1.9.3" do
62
+ describe "for a subclass of Matrix" do
63
+ it "returns an instance of that subclass" do
64
+ MatrixSub[ [20,30], [40.5, 9] ].should be_an_instance_of(MatrixSub)
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,6 @@
1
+ require File.expand_path('../shared/determinant', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix#det" do
5
+ it_behaves_like(:determinant, :det)
6
+ end
@@ -0,0 +1,6 @@
1
+ require File.expand_path('../shared/determinant', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix#determinant" do
5
+ it_behaves_like(:determinant, :determinant)
6
+ end
@@ -0,0 +1,73 @@
1
+ require File.expand_path('../fixtures/classes', __FILE__)
2
+ require 'matrix'
3
+
4
+ describe "Matrix.diagonal" do
5
+ before(:each) do
6
+ @m = Matrix.diagonal(10, 11, 12, 13, 14)
7
+ end
8
+
9
+ it "returns an object of type Matrix" do
10
+ @m.should be_kind_of(Matrix)
11
+ end
12
+
13
+ it "returns a square Matrix of the right size" do
14
+ @m.column_size.should == 5
15
+ @m.row_size.should == 5
16
+ end
17
+
18
+ it "sets the diagonal to the arguments" do
19
+ (0..4).each do |i|
20
+ @m[i, i].should == i + 10
21
+ end
22
+ end
23
+
24
+ it "fills all non-diagonal cells with 0" do
25
+ (0..4).each do |i|
26
+ (0..4).each do |j|
27
+ if i != j
28
+ @m[i, j].should == 0
29
+ end
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "for a subclass of Matrix" do
35
+ it "returns an instance of that subclass" do
36
+ MatrixSub.diagonal(1).should be_an_instance_of(MatrixSub)
37
+ end
38
+ end
39
+ end
40
+
41
+ ruby_version_is "1.9.3" do
42
+ describe "Matrix.diagonal?" do
43
+ it "returns true for a diagonal Matrix" do
44
+ Matrix.diagonal([1, 2, 3]).diagonal?.should be_true
45
+ end
46
+
47
+ it "returns true for a zero square Matrix" do
48
+ Matrix.zero(3).diagonal?.should be_true
49
+ end
50
+
51
+ it "returns false for a non diagonal square Matrix" do
52
+ Matrix[[0, 1], [0, 0]].diagonal?.should be_false
53
+ Matrix[[1, 2, 3], [1, 2, 3], [1, 2, 3]].diagonal?.should be_false
54
+ end
55
+
56
+ it "returns true for an empty 0x0 matrix" do
57
+ Matrix.empty(0,0).diagonal?.should be_true
58
+ end
59
+
60
+ it "raises an error for rectangular matrices" do
61
+ [
62
+ Matrix[[0], [0]],
63
+ Matrix[[0, 0]],
64
+ Matrix.empty(0, 2),
65
+ Matrix.empty(2, 0),
66
+ ].each do |rectangual_matrix|
67
+ lambda {
68
+ rectangual_matrix.diagonal?
69
+ }.should raise_error(Matrix::ErrDimensionMismatch)
70
+ end
71
+ end
72
+ end
73
+ end