matrix_extensions 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- 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
|