summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS4
-rw-r--r--lib/matrix.rb9
-rw-r--r--spec/ruby/library/matrix/reflexive_spec.rb31
3 files changed, 43 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index d1be38cfb9..cfdd975dae 100644
--- a/NEWS
+++ b/NEWS
@@ -264,10 +264,12 @@ sufficient information, see the ChangeLog file or Redmine
* `Matrix`
- * New method:
+ * New methods:
* `Matrix#antisymmetric?`
+ * `Matrix#reflexive?`
+
* `Net`
* New options:
diff --git a/lib/matrix.rb b/lib/matrix.rb
index 7639b1de6d..62852bdad0 100644
--- a/lib/matrix.rb
+++ b/lib/matrix.rb
@@ -814,6 +814,15 @@ class Matrix
end
#
+ # Returns +true+ if this is a reflexive matrix.
+ # Raises an error if matrix is not square.
+ #
+ def reflexive?
+ Matrix.Raise ErrDimensionMismatch unless square?
+ each(:diagonal).all? { |e| e == 1 }
+ end
+
+ #
# Returns +true+ if this is a unitary matrix
# Raises an error if matrix is not square.
#
diff --git a/spec/ruby/library/matrix/reflexive_spec.rb b/spec/ruby/library/matrix/reflexive_spec.rb
new file mode 100644
index 0000000000..380fbb7ed6
--- /dev/null
+++ b/spec/ruby/library/matrix/reflexive_spec.rb
@@ -0,0 +1,31 @@
+require File.expand_path('../../../spec_helper', __FILE__)
+require 'matrix'
+
+ruby_version_is '2.6' do
+ describe "Matrix.reflexive?" do
+ it "returns true for a reflexive Matrix" do
+ Matrix[[1, 2, 3], [4, 1, 3], [5, 3, 1]].reflexive?.should be_true
+ end
+
+ it "returns true for a 0x0 empty matrix" do
+ Matrix.empty.reflexive?.should be_true
+ end
+
+ it "returns false for a non-reflexive Matrix" do
+ Matrix[[1, 1],[2, 2]].reflexive?.should be_false
+ end
+
+ it "raises an error for non-square matrices" do
+ [
+ Matrix[[0], [0]],
+ Matrix[[0, 0]],
+ Matrix.empty(0, 2),
+ Matrix.empty(2, 0),
+ ].each do |rectangular_matrix|
+ lambda {
+ rectangular_matrix.reflexive?
+ }.should raise_error(Matrix::ErrDimensionMismatch)
+ end
+ end
+ end
+end