rmatrix 0.1.9 → 0.1.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rmatrix/core.rb +1 -0
- data/lib/rmatrix/indices.rb +69 -8
- data/lib/rmatrix/matrix.rb +71 -30
- data/lib/rmatrix/matrix_table.rb +83 -0
- data/lib/rmatrix/print_table.rb +107 -0
- data/lib/rmatrix/version.rb +1 -1
- data/rmatrix.todo +6 -2
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 66edec4fe60372252f4542b6c2adf5e7ff88349e
|
4
|
+
data.tar.gz: 363d633958bce93fb9ae62de0aa8d12ba1c441bc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cadab96ed60b3bc2912abe69502ef76ed8739a15834fe32938188b1a011e1906b2e10334f7d79853761263f494e842390bf4a28af7e47cafa35392fc330d8c36
|
7
|
+
data.tar.gz: 7d6ba92b3df5794e9a315d788b994b454825d54745dd93c62c987a2547d1288976be17ab63ebb3a73b871da0ca4b5a1d22e2e52f04152c802a2728b11bb008c5
|
data/lib/rmatrix/core.rb
CHANGED
data/lib/rmatrix/indices.rb
CHANGED
@@ -1,17 +1,74 @@
|
|
1
1
|
module RMatrix
|
2
2
|
module Indices
|
3
|
+
|
4
|
+
def []=(*args, value)
|
5
|
+
indices = unmap_args(args)
|
6
|
+
raw[*indices] = value
|
7
|
+
end
|
8
|
+
|
3
9
|
def [](*args)
|
4
10
|
indices = unmap_args(args)
|
5
11
|
result_row_map = build_result_map(self.row_map, indices.first, self.rows) if self.row_map
|
6
12
|
result_column_map = build_result_map(self.column_map, indices.last, self.columns) if self.column_map
|
7
|
-
|
13
|
+
|
14
|
+
row_indices, column_indices = indices
|
15
|
+
|
16
|
+
result_column_label_map = nil
|
17
|
+
result_row_label_map = nil
|
18
|
+
|
19
|
+
if row_label_map
|
20
|
+
case row_indices
|
21
|
+
when true then result_row_label_map = row_label_map
|
22
|
+
else
|
23
|
+
result_row_label_map = walk_indices(row_indices, row_label_map).each_slice(2).to_h
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
if column_label_map
|
28
|
+
case column_indices
|
29
|
+
when true then result_column_label_map = column_label_map
|
30
|
+
else
|
31
|
+
result_column_label_map = walk_indices(column_indices, column_label_map).each_slice(2).to_h
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
raw[*indices, column_map: result_column_map, column_label_map: result_column_label_map, row_map: result_row_map, row_label_map: result_row_label_map]
|
36
|
+
end
|
37
|
+
|
38
|
+
def method_missing(name, *args, &block)
|
39
|
+
if row_map && row_map.include?(name)
|
40
|
+
self[name, true]
|
41
|
+
elsif column_map && column_map.include?(name)
|
42
|
+
self[true, name]
|
43
|
+
else
|
44
|
+
super
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def walk_indices(indices, parent, i={index: 0})
|
49
|
+
Array(indices).flat_map do |index|
|
50
|
+
res = case index
|
51
|
+
when Array, Range then walk_indices(index.to_a, parent, i)
|
52
|
+
else [i[:index], parent[index]]
|
53
|
+
end
|
54
|
+
i[:index] += 1
|
55
|
+
res
|
56
|
+
end
|
8
57
|
end
|
9
58
|
|
10
59
|
def raw
|
11
60
|
@raw ||= begin
|
12
61
|
raw = Struct.new(:narray, :typecode).new(self.narray, self.typecode)
|
13
|
-
def raw.[](*args, column_map: nil, row_map: nil)
|
14
|
-
|
62
|
+
def raw.[](*args, column_map: nil, row_map: nil, row_label_map: nil, column_label_map: nil)
|
63
|
+
begin
|
64
|
+
args.all?{|x| Fixnum === x } ? narray[*args.reverse] : Matrix.new(narray[*args.reverse], typecode, column_map: column_map, row_map: row_map, row_label_map: row_label_map, column_label_map: column_label_map)
|
65
|
+
rescue StandardError => e
|
66
|
+
raise IndexError.new("Error accessing index at #{args}. Shape is #{narray.shape.reverse}")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def raw.[]=(*args, value)
|
71
|
+
narray[*args.reverse] = value
|
15
72
|
end
|
16
73
|
raw
|
17
74
|
end
|
@@ -66,16 +123,19 @@ module RMatrix
|
|
66
123
|
def unmap_args(args)
|
67
124
|
if args.length == 1
|
68
125
|
if row_map
|
69
|
-
return [unmap_index(self.row_map, args[0]), true] rescue nil
|
126
|
+
return [Array(unmap_index(self.row_map, args[0])), true] rescue nil
|
70
127
|
end
|
71
128
|
if column_map
|
72
|
-
return [true,
|
129
|
+
return [true, Array(unmap_index(self.column_map, args[0]))] rescue nil
|
73
130
|
end
|
74
131
|
return [args[0]]
|
75
132
|
else
|
133
|
+
row_index = self.row_map ? unmap_index(self.row_map, args[0]) : args[0]
|
134
|
+
column_index = self.column_map ? unmap_index(self.column_map, args[1]) : args[1]
|
135
|
+
column_index = [column_index] if column_index.kind_of?(Fixnum)
|
76
136
|
[
|
77
|
-
|
78
|
-
|
137
|
+
row_index,
|
138
|
+
column_index
|
79
139
|
]
|
80
140
|
end
|
81
141
|
end
|
@@ -98,7 +158,8 @@ module RMatrix
|
|
98
158
|
first..last
|
99
159
|
end
|
100
160
|
else
|
101
|
-
index = map[columns]
|
161
|
+
index = (map[columns] rescue nil)
|
162
|
+
index = columns if !index && columns.kind_of?(Fixnum)
|
102
163
|
raise "Value not present in index mapping: #{columns}" unless index
|
103
164
|
index
|
104
165
|
end
|
data/lib/rmatrix/matrix.rb
CHANGED
@@ -1,26 +1,51 @@
|
|
1
1
|
module RMatrix
|
2
2
|
class Matrix
|
3
|
+
|
4
|
+
class << self
|
5
|
+
attr_accessor :named_inspect
|
6
|
+
end
|
7
|
+
|
3
8
|
require 'narray'
|
4
9
|
require_relative 'typecode'
|
5
10
|
|
6
11
|
include Enumerable
|
7
12
|
include Indices
|
8
13
|
|
9
|
-
attr_accessor :invert_next_operation, :narray, :typecode, :row_map, :column_map
|
14
|
+
attr_accessor :invert_next_operation, :narray, :typecode, :row_map, :column_map, :row_label_map, :column_label_map
|
10
15
|
attr_writer :matrix
|
11
16
|
|
12
|
-
def initialize(source, typecode=Typecode::FLOAT, column_map: nil, row_map: nil)
|
13
|
-
self.typecode
|
14
|
-
self.narray
|
15
|
-
self.row_map
|
17
|
+
def initialize(source, typecode=Typecode::FLOAT, column_map: nil, row_map: nil, column_label_map: nil, row_label_map: nil)
|
18
|
+
self.typecode = typecode
|
19
|
+
self.narray = two_dimensional(source, typecode)
|
20
|
+
self.row_map = row_map
|
21
|
+
self.column_map = column_map
|
22
|
+
end
|
23
|
+
|
24
|
+
def row_map=(row_map)
|
25
|
+
@row_map = parse_map(row_map)
|
26
|
+
@row_label_map = @row_map.invert unless !@row_map || @row_map.default_proc
|
27
|
+
end
|
28
|
+
|
29
|
+
def column_map=(column_map)
|
30
|
+
@column_map = parse_map(column_map)
|
31
|
+
@column_label_map = @column_map.invert unless !@column_map || @column_map.default_proc
|
32
|
+
end
|
33
|
+
|
34
|
+
def parse_map(map, invert: false)
|
35
|
+
case map
|
36
|
+
when nil then map
|
37
|
+
when Array then invert ? map.each.with_index.map.to_h.invert : map.each.with_index.map.to_h
|
38
|
+
when Hash then map
|
39
|
+
else raise 'Invalid map type encountered'
|
40
|
+
end
|
16
41
|
end
|
17
42
|
|
18
43
|
def matrix
|
19
44
|
@matrix ||= narray.empty? ? narray : NMatrix.refer(narray)
|
20
45
|
end
|
21
46
|
|
22
|
-
def self.blank(rows: 1, columns: 1, typecode: Typecode::FLOAT, initial: 0)
|
23
|
-
source = self.new(NArray.new(typecode, columns, rows), typecode)
|
47
|
+
def self.blank(rows: 1, columns: 1, typecode: Typecode::FLOAT, initial: 0, column_map: nil, row_map: nil)
|
48
|
+
source = self.new(NArray.new(typecode, columns, rows), typecode, column_map: column_map, row_map: row_map)
|
24
49
|
source.narray[]= initial unless source.empty?
|
25
50
|
source
|
26
51
|
end
|
@@ -30,7 +55,7 @@ module RMatrix
|
|
30
55
|
end
|
31
56
|
|
32
57
|
def _dump(level)
|
33
|
-
|
58
|
+
narray.to_s << ':' << columns.to_s << ':' << rows.to_s << ':' << narray.typecode.to_s
|
34
59
|
end
|
35
60
|
|
36
61
|
def self._load arg
|
@@ -280,28 +305,43 @@ module RMatrix
|
|
280
305
|
end
|
281
306
|
|
282
307
|
def to_significant_figures(x, p)
|
283
|
-
x.
|
284
|
-
nm = Math.log(x, 10.0).floor + 1.0 - p
|
285
|
-
(((10.0 ** -nm) * x).round * (10.0 ** nm)).round(nm.abs)
|
286
|
-
end
|
308
|
+
("%-.#{p}e" % x).gsub(/0+e/,'e').gsub('.e+00','').gsub('e+00','')
|
287
309
|
end
|
288
310
|
|
289
|
-
def inspect(sz
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
values = values.map{|line| line.map{|val| val.rjust(max_width, ' ') }}
|
296
|
-
"#{rows} x #{columns} Matrix\nM[#{values.map{|row| "[#{row.join(", ")}]" }.join(",\n ")}"
|
311
|
+
def inspect(sz: 10, sig: 6, names: RMatrix::Matrix.named_inspect)
|
312
|
+
desc = case
|
313
|
+
when self.is_vector? then "Vector(#{self.length})"
|
314
|
+
else "Matrix(#{rows} x #{columns})"
|
315
|
+
end
|
316
|
+
"#{desc}\n#{RMatrix::MatrixTable.new(self).to_s}"
|
297
317
|
end
|
298
318
|
|
299
319
|
def to_tex(sz = 10, sig=6)
|
300
320
|
values = condensed(sz, sig)
|
321
|
+
column_headers = column_label_map ? values[0].map.with_index do |v, i|
|
322
|
+
case v
|
323
|
+
when '\\cdots' then '\\cdots'
|
324
|
+
else (column_label_map && column_label_map[i]) || i
|
325
|
+
end
|
326
|
+
end : []
|
327
|
+
|
328
|
+
row_headers = row_label_map ? values.map.with_index do |v, i|
|
329
|
+
case v[0]
|
330
|
+
when '\\vdots' then '\\vdots'
|
331
|
+
else (row_label_map && row_label_map[i]) || i
|
332
|
+
end
|
333
|
+
end : []
|
334
|
+
|
301
335
|
<<-TEX
|
302
|
-
|
303
|
-
|
304
|
-
\\end{
|
336
|
+
$
|
337
|
+
\\begin{array}{c} &
|
338
|
+
\\begin{array}{c} #{column_headers.join(" & ")} \\end{array}\\\\
|
339
|
+
\\begin{array}{c} #{row_headers.join(" \\\\ ")} \\end{array} &
|
340
|
+
\\left(\\begin{array}{ccc}
|
341
|
+
#{values.map{|line| line.join(" & ")}.join(" \\\\ ")}
|
342
|
+
\\end{array}\\right)
|
343
|
+
\\end{array}
|
344
|
+
$
|
305
345
|
TEX
|
306
346
|
end
|
307
347
|
|
@@ -333,21 +373,21 @@ TEX
|
|
333
373
|
blank.narray.to_a.map{|line| (sig ? Array(line).map{|v| Numeric === v ? to_significant_figures(v,sig) : v } : Array(line))}
|
334
374
|
end
|
335
375
|
|
336
|
-
def transpose
|
337
|
-
Matrix.new(self.matrix.transpose, typecode)
|
376
|
+
def transpose()
|
377
|
+
Matrix.new(self.matrix.transpose, typecode, column_map: self.row_map, row_map: self.column_map, column_label_map: self.row_label_map, row_label_map: self.column_label_map)
|
338
378
|
end
|
339
379
|
|
340
|
-
def self.[](*inputs, typecode: Typecode::FLOAT, row_map: nil, column_map: nil)
|
380
|
+
def self.[](*inputs, typecode: Typecode::FLOAT, row_map: nil, column_map: nil, column_label_map: nil, row_label_map: nil)
|
341
381
|
if inputs.length == 1 && Matrix === inputs[0]
|
342
382
|
inputs[0]
|
343
383
|
elsif inputs.length == 1 && [String, Symbol].include?(inputs[0].class)
|
344
384
|
if ['byte', 'sint', 'int', 'sfloat', 'float', 'scomplex', 'complex', 'object'].include?(inputs[0])
|
345
|
-
->(*source){ Matrix.new(source, inputs[0], row_map: row_map, column_map: column_map)}
|
385
|
+
->(*source){ Matrix.new(source, inputs[0], row_map: row_map, column_map: column_map, row_label_map: row_label_map, column_label_map: column_label_map)}
|
346
386
|
else
|
347
|
-
Matrix.new(inputs[0], typecode, row_map: row_map, column_map: column_map)
|
387
|
+
Matrix.new(inputs[0], typecode, row_map: row_map, column_map: column_map, row_label_map: row_label_map, column_label_map: column_label_map)
|
348
388
|
end
|
349
389
|
else
|
350
|
-
Matrix.new(inputs, typecode, row_map: row_map, column_map: column_map)
|
390
|
+
Matrix.new(inputs, typecode, row_map: row_map, column_map: column_map, row_label_map: row_label_map, column_label_map: column_label_map)
|
351
391
|
end
|
352
392
|
end
|
353
393
|
|
@@ -475,4 +515,5 @@ TEX
|
|
475
515
|
end
|
476
516
|
|
477
517
|
class ::NArray; include Enumerable; end
|
478
|
-
end
|
518
|
+
end
|
519
|
+
RMatrix::Matrix.named_inspect = true
|
@@ -0,0 +1,83 @@
|
|
1
|
+
module RMatrix
|
2
|
+
class MatrixTable < PrintTable
|
3
|
+
def initialize(matrix, max_columns: 10, max_rows: 10)
|
4
|
+
super()
|
5
|
+
column_offset, row_offset = 0, 0
|
6
|
+
column_labels = !!matrix.column_label_map
|
7
|
+
row_labels = !!matrix.row_label_map
|
8
|
+
|
9
|
+
printed_rows = [matrix.rows, max_rows].min
|
10
|
+
printed_columns = [matrix.columns, max_columns].min
|
11
|
+
|
12
|
+
if matrix.column_label_map
|
13
|
+
printed_columns.times do |i|
|
14
|
+
column_label = matrix.column_label_map[i]
|
15
|
+
if column_label
|
16
|
+
self[i+1 + (row_labels ? 1 : 0 ), 0] = column_label.inspect
|
17
|
+
end
|
18
|
+
end
|
19
|
+
row_offset += 1
|
20
|
+
end
|
21
|
+
|
22
|
+
if matrix.row_label_map
|
23
|
+
printed_rows.times do |i|
|
24
|
+
row_label = matrix.row_label_map[i]
|
25
|
+
if row_label
|
26
|
+
self[0, i + (column_labels ? 1 : 0)] = row_label.inspect
|
27
|
+
end
|
28
|
+
end
|
29
|
+
column_offset += 1
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
self[column_offset,row_offset] = "#{matrix.is_vector? ? 'V' : 'M'}["
|
34
|
+
column_offset += 1
|
35
|
+
matrix.each_row.with_index do |row, row_idx|
|
36
|
+
break if row_idx > printed_rows
|
37
|
+
row.each.with_index do |cell, column_idx|
|
38
|
+
break if column_idx > printed_columns
|
39
|
+
self[column_idx + column_offset, row_idx + row_offset] = cell
|
40
|
+
end
|
41
|
+
self[[matrix.columns + column_offset, printed_columns + column_offset + 1].min, row_idx + row_offset] = ',' if (row_idx + row_offset - 1) != printed_rows
|
42
|
+
end
|
43
|
+
|
44
|
+
column_overlap = matrix.columns > max_columns
|
45
|
+
row_overlap = matrix.rows > max_rows
|
46
|
+
both_overlap = column_overlap && row_overlap
|
47
|
+
|
48
|
+
if column_overlap
|
49
|
+
printed_rows.times do |row|
|
50
|
+
self[max_columns + column_offset - 1, row + row_offset] = '…'
|
51
|
+
self[max_columns + column_offset, row + row_offset] = matrix[row, -1].first
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if row_overlap
|
56
|
+
printed_columns.times do |column|
|
57
|
+
self[column + column_offset, max_rows + row_offset - 1] = '⋮'
|
58
|
+
self[column + column_offset, max_rows + row_offset] = matrix[column, -1].first
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
if both_overlap
|
63
|
+
self[printed_columns + column_offset - 1, printed_rows + row_offset - 1] = "⋱"
|
64
|
+
self[printed_columns + column_offset - 1, printed_rows + row_offset] = '⋮'
|
65
|
+
self[printed_columns + column_offset, printed_rows + row_offset - 1] = '…'
|
66
|
+
end
|
67
|
+
|
68
|
+
self[self.column_count - 1, self.row_count - 1] = ']'
|
69
|
+
|
70
|
+
if row_labels
|
71
|
+
self.set_column_separator( 0, ' ')
|
72
|
+
self.set_column_separator( 1, '[')
|
73
|
+
self.set_column_separator(self.column_count - 1, ']')
|
74
|
+
else
|
75
|
+
self.set_column_separator( 0, '[')
|
76
|
+
self.set_column_separator(self.column_count - 2, ']')
|
77
|
+
end
|
78
|
+
|
79
|
+
self.set_column_separator(self.column_count - 2, ']')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
@@ -0,0 +1,107 @@
|
|
1
|
+
module RMatrix
|
2
|
+
class PrintTable
|
3
|
+
attr_accessor :row_count, :column_count, :cells, :column_justifications, :separators
|
4
|
+
def initialize
|
5
|
+
self.row_count = self.column_count = 0
|
6
|
+
self.cells = {}
|
7
|
+
self.column_justifications = {}
|
8
|
+
self.separators = Hash.new(', ')
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_s
|
12
|
+
widths = self.column_widths
|
13
|
+
self.row_count.times.map do |row|
|
14
|
+
self.column_count.times.flat_map do |column|
|
15
|
+
cell_text = cell_repr(self.cells[[column, row]])
|
16
|
+
justification = column_justification(column)
|
17
|
+
width = widths[column]
|
18
|
+
contents = case justification
|
19
|
+
when :left then cell_text.ljust(width)
|
20
|
+
when :right then cell_text.rjust(width)
|
21
|
+
end
|
22
|
+
[contents,self.separators[[column, row]]]
|
23
|
+
end[0...-1].join
|
24
|
+
end.join("\n")
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_tex
|
28
|
+
tex_map = self.row_count.times.map do |row|
|
29
|
+
self.column_count.times.map do |column|
|
30
|
+
cell_repr(self.cells[[column, row]])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
<<-TEX
|
34
|
+
\\[
|
35
|
+
\\text{Mat}_{\\varphi\\text{ to }M} = \\kbordermatrix{
|
36
|
+
& c_1 & c_2 & c_3 & c_4 & c_5 \\\\
|
37
|
+
r_1 & 1 & 1 & 1 & 1 & 1 \\\\
|
38
|
+
r_2 & 0 & 1 & 0 & 0 & 1 \\\\
|
39
|
+
r_3 & 0 & 0 & 1 & 0 & 1 \\\\
|
40
|
+
r_4 & 0 & 0 & 0 & 1 & 1 \\\\
|
41
|
+
r_5 & 0 & 0 & 0 & 0 & 1
|
42
|
+
}
|
43
|
+
\\]
|
44
|
+
TEX
|
45
|
+
end
|
46
|
+
|
47
|
+
def column_justification(i)
|
48
|
+
case self.column_justifications[i]
|
49
|
+
when nil then :right
|
50
|
+
when :right then :right
|
51
|
+
when :left then :left
|
52
|
+
else raise "Unexpected justification for column #{self.column_justifications[i] }"
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def set_column_separator(column, separator)
|
57
|
+
self.row_count.times do |row|
|
58
|
+
self.separators[[column, row]] = separator
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def column_widths
|
63
|
+
column_count.times.map do |i|
|
64
|
+
column_width(i)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def column_width(column)
|
69
|
+
self.row_count.times.reduce(0) do |agg, row|
|
70
|
+
[agg, self.cell_repr(self.cells[[column, row]]).length].max
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
def cell_repr(cell)
|
75
|
+
case cell
|
76
|
+
when nil then ''
|
77
|
+
when Numeric then numeric_to_truncated_string(cell)
|
78
|
+
else "#{cell}"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def numeric_to_truncated_string(numeric)
|
83
|
+
("%-.4e" % numeric).gsub(/(?<!\.)0+e/,'e').gsub('.e+00','').gsub('e+00','')
|
84
|
+
end
|
85
|
+
|
86
|
+
def [](column, row)
|
87
|
+
self.cells[[column, row]]
|
88
|
+
end
|
89
|
+
|
90
|
+
def []=(column, row, value)
|
91
|
+
build_column!(column)
|
92
|
+
build_row!(row)
|
93
|
+
self.cells[[column, row]] = value
|
94
|
+
end
|
95
|
+
|
96
|
+
def build_column!(idx)
|
97
|
+
self.column_count = [self.column_count || 0, idx.succ].max
|
98
|
+
end
|
99
|
+
|
100
|
+
def build_row!(idx)
|
101
|
+
self.row_count = [self.row_count || 0 , idx.succ].max
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
end
|
107
|
+
require_relative 'matrix_table'
|
data/lib/rmatrix/version.rb
CHANGED
data/rmatrix.todo
CHANGED
@@ -1,6 +1,10 @@
|
|
1
|
+
☐ Refactor + tidy
|
2
|
+
Tests:
|
3
|
+
☐ Indexing
|
4
|
+
☐ Assignment
|
5
|
+
✔ Add matrix assignment @done (17-02-28 08:32)
|
1
6
|
✘ Use Numo::NArray (Not ready yet) @cancelled (16-09-29 08:23)
|
2
|
-
|
3
|
-
☐ Add random int matrix
|
7
|
+
✘ Add random int matrix @cancelled (17-02-27 09:19)
|
4
8
|
✔ Implement to_tex for notebooks @done (16-09-29 08:23)
|
5
9
|
✔ Update print @done (16-04-06 07:40)
|
6
10
|
✔ Basic matrix functions and tests @done (16-04-06 07:40)
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rmatrix
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.10
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wouter Coppieters
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -158,6 +158,8 @@ files:
|
|
158
158
|
- lib/rmatrix/core.rb
|
159
159
|
- lib/rmatrix/indices.rb
|
160
160
|
- lib/rmatrix/matrix.rb
|
161
|
+
- lib/rmatrix/matrix_table.rb
|
162
|
+
- lib/rmatrix/print_table.rb
|
161
163
|
- lib/rmatrix/shortcuts.rb
|
162
164
|
- lib/rmatrix/typecode.rb
|
163
165
|
- lib/rmatrix/vector.rb
|