matrix 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dafdb5e3baa2132e9e57ffa5058e7a868a3cf82a9ac3433af6e41744dee5af5c
4
- data.tar.gz: 76ab3fcd078ceae78238eed7bc479f6038fe24106199406c3caa03b934cd7b3a
3
+ metadata.gz: bfd415fd47ead13b790454f50a6959b76bdc68da569efefd53bf11424ad9c93f
4
+ data.tar.gz: 78f73f4aed336e4903b48dc1de5a8835dbe019015f9f6d534bd89b380d0d6d16
5
5
  SHA512:
6
- metadata.gz: 52fd28e647cc8fec54e63eb1be9625a731c82c43508020d006d90e51d46863354bc60942878cbcf6aaa08a1cf00748cc07db139e75fe690c209dbfdbadb2f1ca
7
- data.tar.gz: aaac184716f5efef477961ae5325d35829e004975f859007748f0e3352968244f02b3e15dbc4acdd21e211a233d707566293fcc28f1253d203c6073dc0734da4
6
+ metadata.gz: efe3e7cb0fcce4e68c58530a8f290df1b0ea4bfe94d92b0a0310e537b8bfa4c19f468128e2b505ad33e10a522ed366a996b384c4f7528f111ac5b8982693c99b
7
+ data.tar.gz: cd798bc7bac9fdaa7586b25691bb2e69402b70a36bf66c821dc7ff406dd2b2f5e7d221535b7516ae809c29ea960cd04bd31072549db8150aebba33d3ef10f95d
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Matrix [![Version](https://badge.fury.io/rb/matrix.svg)](https://badge.fury.io/rb/matrix) [![Default Gem](https://img.shields.io/badge/stdgem-default-9c1260.svg)](https://stdgems.org/matrix/) [![Travis](https://travis-ci.com/ruby/matrix.svg)](https://travis-ci.com/ruby/matrix)
1
+ # Matrix [![Version](https://badge.fury.io/rb/matrix.svg)](https://badge.fury.io/rb/matrix) [![Default Gem](https://img.shields.io/badge/stdgem-default-9c1260.svg)](https://stdgems.org/matrix/) [![Test](https://github.com/ruby/matrix/workflows/test/badge.svg)](https://github.com/ruby/matrix/actions?query=workflow%3Atest)
2
2
 
3
3
  An implementation of `Matrix` and `Vector` classes.
4
4
 
@@ -20,7 +20,7 @@ And then execute:
20
20
 
21
21
  $ bundle
22
22
 
23
- To make sure the gem takes over the builtin library, be to call `bundle exec ...` (or to call `gem 'matrix' explicitly).
23
+ To make sure that the gem takes precedence over the builtin library, call `bundle exec ...` (or call `gem 'matrix'` explicitly).
24
24
 
25
25
  ## Usage
26
26
 
@@ -532,7 +532,8 @@ class Matrix
532
532
  alias map! collect!
533
533
 
534
534
  def freeze
535
- @rows.freeze
535
+ @rows.each(&:freeze).freeze
536
+
536
537
  super
537
538
  end
538
539
 
@@ -1233,26 +1234,49 @@ class Matrix
1233
1234
  # # => 67 96
1234
1235
  # # 48 99
1235
1236
  #
1236
- def **(other)
1237
- case other
1237
+ def **(exp)
1238
+ case exp
1238
1239
  when Integer
1239
- x = self
1240
- if other <= 0
1241
- x = self.inverse
1242
- return self.class.identity(self.column_count) if other == 0
1243
- other = -other
1244
- end
1245
- z = nil
1246
- loop do
1247
- z = z ? z * x : x if other[0] == 1
1248
- return z if (other >>= 1).zero?
1249
- x *= x
1240
+ case
1241
+ when exp == 0
1242
+ _make_sure_it_is_invertible = inverse
1243
+ self.class.identity(column_count)
1244
+ when exp < 0
1245
+ inverse.power_int(-exp)
1246
+ else
1247
+ power_int(exp)
1250
1248
  end
1251
1249
  when Numeric
1252
1250
  v, d, v_inv = eigensystem
1253
- v * self.class.diagonal(*d.each(:diagonal).map{|e| e ** other}) * v_inv
1251
+ v * self.class.diagonal(*d.each(:diagonal).map{|e| e ** exp}) * v_inv
1252
+ else
1253
+ raise ErrOperationNotDefined, ["**", self.class, exp.class]
1254
+ end
1255
+ end
1256
+
1257
+ protected def power_int(exp)
1258
+ # assumes `exp` is an Integer > 0
1259
+ #
1260
+ # Previous algorithm:
1261
+ # build M**2, M**4 = (M**2)**2, M**8, ... and multiplying those you need
1262
+ # e.g. M**0b1011 = M**11 = M * M**2 * M**8
1263
+ # ^ ^
1264
+ # (highlighted the 2 out of 5 multiplications involving `M * x`)
1265
+ #
1266
+ # Current algorithm has same number of multiplications but with lower exponents:
1267
+ # M**11 = M * (M * M**4)**2
1268
+ # ^ ^ ^
1269
+ # (highlighted the 3 out of 5 multiplications involving `M * x`)
1270
+ #
1271
+ # This should be faster for all (non nil-potent) matrices.
1272
+ case
1273
+ when exp == 1
1274
+ self
1275
+ when exp.odd?
1276
+ self * power_int(exp - 1)
1254
1277
  else
1255
- raise ErrOperationNotDefined, ["**", self.class, other.class]
1278
+ sqrt = power_int(exp / 2)
1279
+ sqrt * sqrt
1256
1280
  end
1257
1281
  end
1258
1282
 
@@ -2118,6 +2142,9 @@ class Vector
2118
2142
  all?(&:zero?)
2119
2143
  end
2120
2144
 
2145
+ #
2146
+ # Makes the matrix frozen and Ractor-shareable
2147
+ #
2121
2148
  def freeze
2122
2149
  @elements.freeze
2123
2150
  super
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Matrix
4
- VERSION = "0.3.0"
4
+ VERSION = "0.3.1"
5
5
  end
@@ -16,7 +16,7 @@ Gem::Specification.new do |spec|
16
16
  spec.summary = %q{An implementation of Matrix and Vector classes.}
17
17
  spec.description = %q{An implementation of Matrix and Vector classes.}
18
18
  spec.homepage = "https://github.com/ruby/matrix"
19
- spec.license = "BSD-2-Clause"
19
+ spec.licenses = ["Ruby", "BSD-2-Clause"]
20
20
  spec.required_ruby_version = ">= 2.5.0"
21
21
 
22
22
  spec.files = [".gitignore", "Gemfile", "LICENSE.txt", "README.md", "Rakefile", "bin/console", "bin/setup", "lib/matrix.rb", "lib/matrix/eigenvalue_decomposition.rb", "lib/matrix/lup_decomposition.rb", "lib/matrix/version.rb", "matrix.gemspec"]
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: matrix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Marc-Andre Lafortune
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-05-01 00:00:00.000000000 Z
11
+ date: 2021-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -59,9 +59,10 @@ files:
59
59
  - matrix.gemspec
60
60
  homepage: https://github.com/ruby/matrix
61
61
  licenses:
62
+ - Ruby
62
63
  - BSD-2-Clause
63
64
  metadata: {}
64
- post_install_message:
65
+ post_install_message:
65
66
  rdoc_options: []
66
67
  require_paths:
67
68
  - lib
@@ -76,8 +77,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
77
  - !ruby/object:Gem::Version
77
78
  version: '0'
78
79
  requirements: []
79
- rubygems_version: 3.1.2
80
- signing_key:
80
+ rubygems_version: 3.2.3
81
+ signing_key:
81
82
  specification_version: 4
82
83
  summary: An implementation of Matrix and Vector classes.
83
84
  test_files: []