class Matrix < Array
def initialize(ary)
@d = (ary.size ** 0.5).to_i
super ary
end
def +(other)
Matrix.new map.with_index { |m, i| m + other[i] }
end
def *(other)
Matrix.new size.times.map { |i|
@d.times.map { |j| self[i / @d * @d + j] * other[i % @d + @d * j] }.reduce :+
}
end
def /(scalar)
Matrix.new map { |m| m / scalar }
end
def identity
Matrix.new ([1] + [0] * @d) * (@d - 1) + [1]
end
def exponential
series = (2..size * 2).map { |i| ([self] * i).reduce(:*) / (1..i).reduce(:*) }
[self, series.reduce(:+), identity].reduce :+
end
end
test = Matrix.new [
0.0, -1.0, 3.0, 0.5,
1.0, 0.0, 0.45, 0.1,
-3.0, -0.45, 0.0, 0.4,
-0.5, -0.1, -0.4, 0.0
]
test.exponential.each_slice(4) { |row| p row.map { |e| e.round 7 } }
Y2xhc3MgTWF0cml4IDwgQXJyYXkKICBkZWYgaW5pdGlhbGl6ZShhcnkpCiAgICBAZCA9IChhcnkuc2l6ZSAqKiAwLjUpLnRvX2kKICAgIHN1cGVyIGFyeQogIGVuZAoKICBkZWYgKyhvdGhlcikKICAgIE1hdHJpeC5uZXcgbWFwLndpdGhfaW5kZXggeyB8bSwgaXwgbSArIG90aGVyW2ldIH0KICBlbmQKCiAgZGVmICoob3RoZXIpCiAgICBNYXRyaXgubmV3IHNpemUudGltZXMubWFwIHsgfGl8CiAgICAgIEBkLnRpbWVzLm1hcCB7IHxqfCBzZWxmW2kgLyBAZCAqIEBkICsgal0gKiBvdGhlcltpICUgQGQgKyBAZCAqIGpdIH0ucmVkdWNlIDorCiAgICB9CiAgZW5kCgogIGRlZiAvKHNjYWxhcikKICAgIE1hdHJpeC5uZXcgbWFwIHsgfG18IG0gLyBzY2FsYXIgfQogIGVuZAoKICBkZWYgaWRlbnRpdHkKICAgIE1hdHJpeC5uZXcgKFsxXSArIFswXSAqIEBkKSAqIChAZCAtIDEpICsgWzFdCiAgZW5kCgogIGRlZiBleHBvbmVudGlhbAogICBzZXJpZXMgPSAoMi4uc2l6ZSAqIDIpLm1hcCB7IHxpfCAoW3NlbGZdICogaSkucmVkdWNlKDoqKSAvICgxLi5pKS5yZWR1Y2UoOiopIH0KICAgW3NlbGYsIHNlcmllcy5yZWR1Y2UoOispLCBpZGVudGl0eV0ucmVkdWNlIDorCiAgZW5kCmVuZAoKdGVzdCA9IE1hdHJpeC5uZXcgWwogICAwLjAsIC0xLjAsICAzLjAsICAwLjUsCiAgIDEuMCwgIDAuMCwgIDAuNDUsIDAuMSwKICAtMy4wLCAtMC40NSwgMC4wLCAgMC40LAogIC0wLjUsIC0wLjEsIC0wLjQsICAwLjAKXQoKdGVzdC5leHBvbmVudGlhbC5lYWNoX3NsaWNlKDQpIHsgfHJvd3wgcCByb3cubWFwIHsgfGV8IGUucm91bmQgNyB9IH0K
[-0.9276446, -0.2437849, -0.2285533, 0.1667568]
[-0.2809791, 0.7661246, 0.5148905, 0.2626626]
[-0.0150871, 0.5946104, -0.7613132, -0.2580951]
[0.2455577, -0.0077772, -0.3210194, 0.9146516]