matrix_extensions 0.0.1 → 0.0.2
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.
- checksums.yaml +4 -4
- data/README.md +14 -14
- data/lib/matrix_extensions.rb +18 -28
- data/lib/matrix_extensions/version.rb +1 -1
- data/spec/matrix_extensions_spec.rb +205 -0
- data/spec/spec_helper.rb +13 -0
- metadata +7 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0888299dc382dbaf662109214f80784ce36def63
|
4
|
+
data.tar.gz: a9b398b17dafb6bfb75b782e99e23619daf83ec8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f95b5b0497717de92579bf5f51ed34d96470825f6dea7b151f42a75add60e288cfbb95238c501c4d789829c0a06c91ab9cf461733475c20f44ecdb8ba386c757
|
7
|
+
data.tar.gz: 3d010969030d91e918d5a63e1607d6925d55faa5cc4c24e6481fc5d434b18d3b207954493fdcf7e59b4556483e3c6308dd35548848667780540ee2f5f5d24910
|
data/README.md
CHANGED
@@ -25,8 +25,8 @@ Element-wise multiplication:
|
|
25
25
|
```ruby
|
26
26
|
require 'matrix_extensions' # if not loaded automatically
|
27
27
|
|
28
|
-
|
29
|
-
=>
|
28
|
+
Matrix[ [1,2,3], [4,5,6] ].element_multiplication Matrix[ [2,3,4], [5,6,7] ]
|
29
|
+
=> Matrix[[2, 6, 12], [20, 30, 42]]
|
30
30
|
```
|
31
31
|
|
32
32
|
Element-wise division:
|
@@ -34,8 +34,8 @@ Element-wise division:
|
|
34
34
|
```ruby
|
35
35
|
require 'matrix_extensions' # if not loaded automatically
|
36
36
|
|
37
|
-
|
38
|
-
=>
|
37
|
+
Matrix[ [2,4,6], [2.0,10,20] ].element_division Matrix[ [2,2,6], [4,5,10] ]
|
38
|
+
=> Matrix[[1, 2, 1], [0.5, 2, 2]]
|
39
39
|
```
|
40
40
|
|
41
41
|
Element-wise exponentiation:
|
@@ -43,8 +43,8 @@ Element-wise exponentiation:
|
|
43
43
|
```ruby
|
44
44
|
require 'matrix_extensions' # if not loaded automatically
|
45
45
|
|
46
|
-
|
47
|
-
=>
|
46
|
+
Matrix[ [2,4], [1,4] ].element_exponentiation Matrix[ [2,4], [1,4]] ]
|
47
|
+
=> Matrix[[4, 256], [1, 256]]
|
48
48
|
```
|
49
49
|
|
50
50
|
Prefilled matrix with zeros or ones:
|
@@ -52,11 +52,11 @@ Prefilled matrix with zeros or ones:
|
|
52
52
|
```ruby
|
53
53
|
require 'matrix_extensions' # if not loaded automatically
|
54
54
|
|
55
|
-
|
56
|
-
=>
|
55
|
+
Matrix.zeros(2,4)
|
56
|
+
=> Matrix[[0, 0, 0, 0], [0, 0, 0, 0]]
|
57
57
|
|
58
|
-
|
59
|
-
=>
|
58
|
+
Matrix.ones(2,2)
|
59
|
+
=> Matrix[[1, 1], [1, 1]]
|
60
60
|
```
|
61
61
|
|
62
62
|
Concatenating matrices and vectors horizontally:
|
@@ -70,8 +70,8 @@ m1 = Matrix[ [1,2,3], [4,5,6] ]
|
|
70
70
|
m2 = Matrix[ [2,3,4], [5,6,7] ]
|
71
71
|
v = Vector[ 3,4 ]
|
72
72
|
|
73
|
-
|
74
|
-
=>
|
73
|
+
Matrix.hconcat(m1, m2, v)
|
74
|
+
=> Matrix[[1, 2, 3, 2, 3, 4, 3], [4, 5, 6, 5, 6, 7, 4]]
|
75
75
|
```
|
76
76
|
|
77
77
|
Concatenating matrices and vectors vertically:
|
@@ -85,8 +85,8 @@ m1 = Matrix[ [1,2,3], [4,5,6] ]
|
|
85
85
|
m2 = Matrix[ [2,3,4], [5,6,7] ]
|
86
86
|
v = Vector[ 3,4,5 ]
|
87
87
|
|
88
|
-
|
89
|
-
=>
|
88
|
+
Matrix.vconcat(m1, m2, v)
|
89
|
+
=> Matrix[[1, 2, 3], [4, 5, 6], [2, 3, 4], [5, 6, 7], [3, 4, 5]]
|
90
90
|
```
|
91
91
|
|
92
92
|
## Contributing
|
data/lib/matrix_extensions.rb
CHANGED
@@ -3,35 +3,25 @@ require 'matrix'
|
|
3
3
|
|
4
4
|
# An extension to the Ruby Matrix class.
|
5
5
|
# @author Michael Imstepf
|
6
|
-
class
|
7
|
-
# Converts a Matrix to an MatrixExtended.
|
8
|
-
# @param m [Matrix] matrix
|
9
|
-
# @return [MatrixExtended] matrix
|
10
|
-
# @raise [TypeError] if matrices are not of type Matrix
|
11
|
-
def self.convert_to_matrix_extended(m)
|
12
|
-
raise TypeError, "#{m.class} is not a Matrix" unless m.is_a?(Matrix)
|
13
|
-
|
14
|
-
self.columns(m.column_vectors)
|
15
|
-
end
|
16
|
-
|
6
|
+
class Matrix
|
17
7
|
# Matrix prefilled with zeros.
|
18
|
-
# @param m [
|
19
|
-
# @return [
|
8
|
+
# @param m [Matrix] matrix
|
9
|
+
# @return [Matrix] matrix
|
20
10
|
def self.zeros(rows = 1, columns = 1)
|
21
|
-
|
11
|
+
Matrix.build(rows, columns) { 0 }
|
22
12
|
end
|
23
13
|
self.singleton_class.send(:alias_method, :zeroes, :zeros)
|
24
14
|
|
25
15
|
# Matrix prefilled with ones.
|
26
|
-
# @param m [
|
27
|
-
# @return [
|
16
|
+
# @param m [Matrix] matrix
|
17
|
+
# @return [Matrix] matrix
|
28
18
|
def self.ones(rows = 1, columns = 1)
|
29
|
-
|
19
|
+
Matrix.build(rows, columns) { 1 }
|
30
20
|
end
|
31
21
|
|
32
22
|
# Concatenates two matrices horizontally (resulting in more columns).
|
33
|
-
# @param *matrices [
|
34
|
-
# @return [
|
23
|
+
# @param *matrices [Matrix] matrices
|
24
|
+
# @return [Matrix] concatenated matrix
|
35
25
|
# @raise [ErrDimensionMismatch] if dimensions don't match
|
36
26
|
# @raise [TypeError] if matrices are not of type Matrix or Vector
|
37
27
|
def self.hconcat(*matrices)
|
@@ -57,8 +47,8 @@ class MatrixExtended < Matrix
|
|
57
47
|
end
|
58
48
|
|
59
49
|
# Concatenates two matrices vertically (resulting in more rows).
|
60
|
-
# @param *matrices [
|
61
|
-
# @return [
|
50
|
+
# @param *matrices [Matrix] matrices
|
51
|
+
# @return [Matrix] concatenated matrix
|
62
52
|
# @raise [ErrDimensionMismatch] if dimensions don't match
|
63
53
|
# @raise [TypeError] if matrices are not of type Matrix or Vector
|
64
54
|
def self.vconcat(*matrices)
|
@@ -84,8 +74,8 @@ class MatrixExtended < Matrix
|
|
84
74
|
end
|
85
75
|
|
86
76
|
# Element-wise division.
|
87
|
-
# @param m [
|
88
|
-
# @return [
|
77
|
+
# @param m [Matrix] matrix
|
78
|
+
# @return [Matrix] matrix
|
89
79
|
# @raise [ErrDimensionMismatch] if dimensions don't match
|
90
80
|
def element_division(m)
|
91
81
|
case m
|
@@ -115,8 +105,8 @@ class MatrixExtended < Matrix
|
|
115
105
|
end
|
116
106
|
|
117
107
|
# Element-wise multiplication.
|
118
|
-
# @param m [
|
119
|
-
# @return [
|
108
|
+
# @param m [Matrix] matrix
|
109
|
+
# @return [Matrix] matrix
|
120
110
|
# @raise [ErrDimensionMismatch] if dimensions don't match
|
121
111
|
def element_multiplication(m)
|
122
112
|
case m
|
@@ -146,8 +136,8 @@ class MatrixExtended < Matrix
|
|
146
136
|
end
|
147
137
|
|
148
138
|
# Element-wise exponentiation.
|
149
|
-
# @param m [
|
150
|
-
# @return [
|
139
|
+
# @param m [Matrix] matrix
|
140
|
+
# @return [Matrix] matrix
|
151
141
|
# @raise [ErrDimensionMismatch] if dimensions don't match
|
152
142
|
def element_exponentiation(m)
|
153
143
|
case m
|
@@ -185,7 +175,7 @@ class MatrixExtended < Matrix
|
|
185
175
|
# Convert vector to matrix for arithmetic operations.
|
186
176
|
# @param vector [Vector] vector
|
187
177
|
# @param dimension [Symbol] :row or :column
|
188
|
-
# @return [
|
178
|
+
# @return [Matrix] matrix
|
189
179
|
# @raise [TypeError] if vector ist not of type Vector
|
190
180
|
def self.convert_vector_to_matrix(v, dimension)
|
191
181
|
raise TypeError, "#{v.class} is not a Vector" unless v.is_a? Vector
|
@@ -0,0 +1,205 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Matrix do
|
4
|
+
m23a = Matrix[ [1,2,3], [4,5,6] ] # 2 rows, 3 columns
|
5
|
+
m23b = Matrix[ [2,3,4], [5,6,7] ] # 2 rows, 3 columns
|
6
|
+
m22 = Matrix[ [1,2], [3,4] ] # 2 rows, 2 columns
|
7
|
+
m12 = Matrix[ [1,2] ] # 1 row, 2 columns
|
8
|
+
m21 = Matrix[ [1], [2] ] # 2 rows, 1 column
|
9
|
+
v = Vector[ 1,2 ]
|
10
|
+
|
11
|
+
describe '#element_division' do
|
12
|
+
context 'when dimensions do not match' do
|
13
|
+
it 'raises an exception' do
|
14
|
+
expect {m23a.element_division m22}.to raise_exception(Matrix::ErrDimensionMismatch)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context 'when dimensions match' do
|
19
|
+
it 'returns correct Matrix' do
|
20
|
+
expect(m23a.element_division m23b).to eq Matrix[ [1/2,2/3,3/4], [4/5,5/6,6/7] ]
|
21
|
+
expect(m23b.element_division m23a).to eq Matrix[ [2,3/2,4/3], [5/4,6/5,7/6] ]
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'when one operator is numeric' do
|
26
|
+
it 'returns correct Matrix' do
|
27
|
+
expect(m23a.element_division 2).to eq Matrix[ [1/2,2/2,3/2], [4/2,5/2,6/2] ]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
context 'when one operator is a vector' do
|
32
|
+
context 'when dimensions do not match' do
|
33
|
+
it 'raises an exception' do
|
34
|
+
expect {m23a.element_division v}.to raise_exception(Matrix::ErrDimensionMismatch)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
context 'when dimensions match' do
|
39
|
+
it 'returns correct Matrix' do
|
40
|
+
expect(m21.element_division v).to eq Matrix[ [1],[1] ]
|
41
|
+
expect(m12.element_division v).to eq Matrix[ [1,1] ]
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#element_multiplication' do
|
48
|
+
context 'when dimensions do not match' do
|
49
|
+
it 'raises an exception' do
|
50
|
+
expect {m23a.element_multiplication m22}.to raise_exception(Matrix::ErrDimensionMismatch)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context 'when dimensions match' do
|
55
|
+
it 'returns correct Matrix' do
|
56
|
+
expect(m23a.element_multiplication m23b).to eq Matrix[ [1*2,2*3,3*4], [4*5,5*6,6*7] ]
|
57
|
+
expect(m23b.element_multiplication m23a).to eq Matrix[ [2,3*2,4*3], [5*4,6*5,7*6] ]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when one operator is numeric' do
|
62
|
+
it 'returns correct Matrix' do
|
63
|
+
expect(m23a.element_multiplication 2).to eq Matrix[ [1*2,2*2,3*2], [4*2,5*2,6*2] ]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
context 'when one operator is a vector' do
|
68
|
+
context 'when dimensions do not match' do
|
69
|
+
it 'raises an exception' do
|
70
|
+
expect {m23a.element_multiplication v}.to raise_exception(Matrix::ErrDimensionMismatch)
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when dimensions match' do
|
75
|
+
it 'returns correct Matrix' do
|
76
|
+
expect(m21.element_multiplication v).to eq Matrix[ [1],[4] ]
|
77
|
+
expect(m12.element_multiplication v).to eq Matrix[ [1,4] ]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe '#element_exponentiation' do
|
84
|
+
context 'when dimensions do not match' do
|
85
|
+
it 'raises an exception' do
|
86
|
+
expect {m23a.element_exponentiation m22}.to raise_exception(Matrix::ErrDimensionMismatch)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context 'when dimensions match' do
|
91
|
+
it 'returns correct Matrix' do
|
92
|
+
expect(m23a.element_exponentiation m23b).to eq Matrix[ [1,2**3,3**4], [4**5,5**6,6**7] ]
|
93
|
+
expect(m23b.element_exponentiation m23a).to eq Matrix[ [2,3**2,4**3], [5**4,6**5,7**6] ]
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
context 'when one operator is numeric' do
|
98
|
+
it 'returns correct Matrix' do
|
99
|
+
expect(m23a.element_exponentiation 2).to eq Matrix[ [1**2,2**2,3**2], [4**2,5**2,6**2] ]
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
context 'when one operator is a vector' do
|
104
|
+
context 'when dimensions do not match' do
|
105
|
+
it 'raises an exception' do
|
106
|
+
expect {m23a.element_exponentiation v}.to raise_exception(Matrix::ErrDimensionMismatch)
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
context 'when dimensions match' do
|
111
|
+
it 'returns correct Matrix' do
|
112
|
+
expect(m21.element_exponentiation v).to eq Matrix[ [1],[4] ]
|
113
|
+
expect(m12.element_exponentiation v).to eq Matrix[ [1,4] ]
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe '#ones' do
|
120
|
+
it 'creates matrix with ones' do
|
121
|
+
expect(Matrix.ones(2, 3)). to eq Matrix[ [1,1,1], [1,1,1] ]
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#zeros' do
|
126
|
+
it 'creates matrix with zeros' do
|
127
|
+
expect(Matrix.zeros(2, 3)). to eq Matrix[ [0,0,0], [0,0,0] ]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '#zeroes' do
|
132
|
+
it 'creates matrix with zeros' do
|
133
|
+
expect(Matrix.zeros(2, 3)). to eq Matrix[ [0,0,0], [0,0,0] ]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
describe '#hconcat' do
|
138
|
+
context 'when input is not a matrix or vector' do
|
139
|
+
it 'raises an exception' do
|
140
|
+
expect {Matrix.hconcat(m23a, m12, 5)}.to raise_exception(TypeError)
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
context 'when row dimensions do not match' do
|
145
|
+
it 'raises an exception' do
|
146
|
+
expect {Matrix.hconcat(m23a, m12)}.to raise_exception(Matrix::ErrDimensionMismatch)
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
context 'when row dimensions match' do
|
151
|
+
it 'concatenates' do
|
152
|
+
expect(Matrix.hconcat(m23a, m22, m23b)).to eq Matrix[ [1,2,3,1,2,2,3,4], [4,5,6,3,4,5,6,7] ]
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
context 'when matrix is concatenated with a vector' do
|
157
|
+
context 'when dimensions match' do
|
158
|
+
it 'concatenates' do
|
159
|
+
expect(Matrix.hconcat(m22, v)).to eq Matrix[ [1,2,1], [3,4,2] ]
|
160
|
+
expect(Matrix.hconcat(m21, v)).to eq Matrix[ [1,1], [2,2] ]
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
context 'when dimensions do not match' do
|
165
|
+
it 'raises an exception' do
|
166
|
+
expect {Matrix.hconcat(m12, v)}.to raise_exception(Matrix::ErrDimensionMismatch)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
|
172
|
+
describe '#vconcat' do
|
173
|
+
context 'when input is not a matrix or vector' do
|
174
|
+
it 'raises an exception' do
|
175
|
+
expect {Matrix.vconcat(m23a, m12, 5)}.to raise_exception(TypeError)
|
176
|
+
end
|
177
|
+
end
|
178
|
+
|
179
|
+
context 'when column dimensions do not match' do
|
180
|
+
it 'raises an exception' do
|
181
|
+
expect {Matrix.vconcat(m23a, m21)}.to raise_exception(Matrix::ErrDimensionMismatch)
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
context 'when column dimensions match' do
|
186
|
+
it 'concatenates' do
|
187
|
+
expect(Matrix.vconcat(m23a, m23b)).to eq Matrix[ [1,2,3], [4,5,6], [2,3,4], [5,6,7] ]
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
context 'when matrix is concatenated with a vector' do
|
192
|
+
context 'when dimensions match' do
|
193
|
+
it 'concatenates' do
|
194
|
+
expect(Matrix.vconcat(m12, v)).to eq Matrix[ [1,2], [1,2] ]
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
context 'when dimensions do not match' do
|
199
|
+
it 'raises an exception' do
|
200
|
+
expect {Matrix.vconcat(m21, v)}.to raise_exception(Matrix::ErrDimensionMismatch)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'matrix_extensions'
|
2
|
+
|
3
|
+
RSpec.configure do |config|
|
4
|
+
# Run specs in random order to surface order dependencies. If you find an
|
5
|
+
# order dependency and want to debug it, you can fix the order by providing
|
6
|
+
# the seed, which is printed after each run.
|
7
|
+
# --seed 1234
|
8
|
+
config.order = 'random'
|
9
|
+
|
10
|
+
# when a focus tag is present in RSpec, only run tests with focus tag: http://railscasts.com/episodes/285-spork
|
11
|
+
config.filter_run :focus
|
12
|
+
config.run_all_when_everything_filtered = true
|
13
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: matrix_extensions
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Imstepf
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-07-
|
11
|
+
date: 2014-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -68,6 +68,8 @@ files:
|
|
68
68
|
- lib/matrix_extensions.rb
|
69
69
|
- lib/matrix_extensions/version.rb
|
70
70
|
- matrix_extensions.gemspec
|
71
|
+
- spec/matrix_extensions_spec.rb
|
72
|
+
- spec/spec_helper.rb
|
71
73
|
homepage: https://github.com/michaelimstepf/matrix-extensions
|
72
74
|
licenses:
|
73
75
|
- MIT
|
@@ -92,4 +94,6 @@ rubygems_version: 2.2.2
|
|
92
94
|
signing_key:
|
93
95
|
specification_version: 4
|
94
96
|
summary: Extension of the Ruby Matrix class.
|
95
|
-
test_files:
|
97
|
+
test_files:
|
98
|
+
- spec/matrix_extensions_spec.rb
|
99
|
+
- spec/spec_helper.rb
|