fast_matrix 0.1.6 → 0.1.7

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: b595a00ec07bf1d240037d16e3691d99f02b1313f0601ddc384c1bbc46378511
4
- data.tar.gz: 0bc5cd22534b4add7364cc0531a438e5b909ab157c4778af1aaa3eb13e0afe9c
3
+ metadata.gz: f561247c42ab2329857835462917a1a1a3ca520cb262ab89b7cc968c903f5d55
4
+ data.tar.gz: e606f0ca2ce438c5f0656203fb71ec70d747c8be82efc5090dd9f35fc735204c
5
5
  SHA512:
6
- metadata.gz: 1eebf62db5b0214d6a04414cff95b6179bcfea2fc972397da325bb8a4efd871768711a9989572d18f7eb6ca1f51da7b0de84d3c1aa56547703ed4e0d72c4958b
7
- data.tar.gz: 823754bfaf70c9ec3b1dafe6ba409ec954e332a7d48f66ef8e9327bbddcd9288a8d4dc55f053c990279f1ad17455384d92a68bd7b214e074dbd9f295b98f3019
6
+ metadata.gz: c3bbb8b3e6c3d1dfaff7de547dadbc559d86318b63e2321303bf821c8b1ed3e350034798cacb47f802b86712f7b7b1bf33cce7d71a0d46bb9a3d36c1687a83fe
7
+ data.tar.gz: 31c9b5884b15bdcf1d82ade4090f256f30ec0dba5f1394e4b46e390ea4b5dd0df4c829823f668381253122f6cc1e9c8f19c45cfa6e7ce7bb483eec2ed51cbed1
@@ -10,4 +10,3 @@
10
10
  *.gem
11
11
  Gemfile.lock
12
12
  *.so
13
- *.md
@@ -20,4 +20,5 @@ deploy:
20
20
  gem: fast_matrix
21
21
  on:
22
22
  tags: true
23
- repo: mmcs-ruby/fast_matrix
23
+ repo: mmcs-ruby/fast_matrix
24
+ branch: master
data/README.md CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
  # FastMatrix
6
6
 
7
- Ruby wrapper around C matrices implementation written as exercise by two MMCS students.
7
+ Ruby wrapper around C matrices implementation written as exercise by MMCS students.
8
8
 
9
9
  ## Installation
10
10
 
@@ -22,14 +22,9 @@ Or install it yourself as:
22
22
 
23
23
  $ gem install fast_matrix
24
24
 
25
- ## Usage
25
+ ## Usage and documentation
26
26
 
27
- TODO: Write usage instructions here
28
-
29
- ### Differences with the standard matrix
30
- * Supported only double values
31
- * Can't be empty
32
- * Some faster
27
+ See our [GitHub Wiki](https://github.com/mmcs-ruby/fast_matrix/wiki).
33
28
 
34
29
  ## Development
35
30
 
@@ -28,10 +28,16 @@ void raise_check_range(int v, int min, int max)
28
28
  rb_raise(fm_eIndexError, "Index out of range");
29
29
  }
30
30
 
31
+ void raise_check_rbasic(VALUE v, VALUE rBasic, const char* rbasic_name)
32
+ {
33
+ if(RBASIC_CLASS(v) != rBasic)
34
+ rb_raise(fm_eTypeError, "Expected class %s", rbasic_name);
35
+ }
36
+
31
37
  void init_fm_errors()
32
38
  {
33
39
  VALUE mod = rb_define_module("FastMatrix");
34
40
 
35
41
  fm_eTypeError = rb_define_class_under(mod, "TypeError", rb_eTypeError);
36
42
  fm_eIndexError = rb_define_class_under(mod, "IndexError", rb_eIndexError);
37
- }
43
+ }
@@ -12,7 +12,9 @@ double raise_rb_value_to_double(VALUE v);
12
12
  int raise_rb_value_to_int(VALUE v);
13
13
  // check if the value is in range and raise an error if not
14
14
  void raise_check_range(int v, int min, int max);
15
+ // check if the basic class of value is rBasic and raise an error if not
16
+ void raise_check_rbasic(VALUE v, VALUE rBasic, const char* rbasic_name);
15
17
 
16
18
  void init_fm_errors();
17
19
 
18
- #endif /* FAST_MATRIX_ERRORS_H */
20
+ #endif /* FAST_MATRIX_ERRORS_H */
@@ -125,8 +125,9 @@ void c_matrix_multiply(int n, int k, int m, const double* A, const double* B, do
125
125
  {
126
126
  const double* p_b = B + m * t;
127
127
  double d_a = p_a[t];
128
- for(int i = 0; i < m; ++i)
129
- p_c[i] += d_a * p_b[i];
128
+ if(d_a != 0)
129
+ for(int i = 0; i < m; ++i)
130
+ p_c[i] += d_a * p_b[i];
130
131
  }
131
132
  }
132
133
  }
@@ -190,10 +191,13 @@ void strassen_iteration(int n, int k, int m, const double* A, const double* B, d
190
191
 
191
192
  bool check_strassen(int m, int n, int k)
192
193
  {
193
- return n > 2 && m > 2 && k > 2 && (double)m * (double)n * (double)k > 100000000;
194
+ return n > 2 && m > 2 && k > 2 && (double)m * (double)n * (double)k > 1000000;
194
195
  }
195
196
 
196
-
197
+ // A B
198
+ // [x x x] [x x x]
199
+ // [x x x] => [x x x]
200
+ // [x x x] [x x x]
197
201
  void strassen_copy(int m, int n, const double* A, double* B, int s_a, int s_b)
198
202
  {
199
203
  for(int i = 0; i < n; ++i)
@@ -205,6 +209,41 @@ void strassen_copy(int m, int n, const double* A, double* B, int s_a, int s_b)
205
209
  }
206
210
  }
207
211
 
212
+ // if right = false and down = false | if right = true and down = false:
213
+ // A B | A B
214
+ // [x x x] [x x x] | [x x x] [x x x 0]
215
+ // [x x x] => [x x x] | [x x x] => [x x x 0]
216
+ // [x x x] [x x x] | [x x x] [x x x 0]
217
+ // |
218
+ // if right = false and down = true | if right = true and down = true:
219
+ // A B | A B
220
+ // [x x x] [x x x] | [x x x] [x x x 0]
221
+ // [x x x] => [x x x] | [x x x] => [x x x 0]
222
+ // [x x x] [x x x] | [x x x] [x x x 0]
223
+ // [0 0 0] | [0 0 0 0]
224
+ void strassen_copy_with_zero(int m, int n, const double* A, double* B, int s_a, int s_b, bool right, bool down)
225
+ {
226
+ double* p_B;
227
+ for(int i = 0; i < n; ++i)
228
+ {
229
+ const double* p_A = A + i * s_a;
230
+ p_B = B + i * s_b;
231
+ for(int j = 0; j < m; ++j)
232
+ p_B[j] = p_A[j];
233
+ if(right)
234
+ p_B[m] = 0;
235
+ }
236
+
237
+ if(down)
238
+ {
239
+ p_B = B + n * s_b;
240
+ for(int j = 0; j < m; ++j)
241
+ p_B[j] = 0;
242
+ if(right)
243
+ p_B[m] = 0;
244
+ }
245
+ }
246
+
208
247
  void strassen_sum_to_first(int m, int n, double* A, const double* B, int s_a, int s_b)
209
248
  {
210
249
  for(int i = 0; i < n; ++i)
@@ -253,8 +292,6 @@ void recursive_strassen(int n, int k, int m, const double* A, const double* B, d
253
292
  double* P6 = P5 + m1 * n1;
254
293
  double* P7 = P6 + m1 * n1;
255
294
  fill_d_array(7 * m1 * n1, P1, 0);
256
- fill_d_array(k1 * n1, termA, 0);
257
- fill_d_array(m1 * k1, termB, 0);
258
295
 
259
296
  // -----------P1-----------
260
297
  strassen_copy(k1, n1, A, termA, k, k1);
@@ -264,55 +301,47 @@ void recursive_strassen(int n, int k, int m, const double* A, const double* B, d
264
301
  strassen_sum_to_first(m2, k2, termB, B + m1 + m * k1, m1, m);
265
302
 
266
303
  recursive_strassen(n1, k1, m1, termA, termB, P1);
267
- fill_d_array(k1 * n1, termA, 0);
268
304
  // -----------P2-----------
269
- strassen_copy(k1, n2, A + k * n1, termA, k, k1);
305
+ strassen_copy_with_zero(k1, n2, A + k * n1, termA, k, k1, false, n1 != n2);
270
306
  strassen_sum_to_first(k2, n2, termA, A + k1 + k * n1, k1, k);
271
307
 
272
308
  strassen_copy(m1, k1, B, termB, m, m1);
273
309
 
274
310
  recursive_strassen(n1, k1, m1, termA, termB, P2);
275
- fill_d_array(m1 * k1, termB, 0);
276
311
  // -----------P3-----------
277
312
  strassen_copy(k1, n1, A, termA, k, k1);
278
313
 
279
- strassen_copy(m2, k1, B + m1, termB, m, m1);
314
+ strassen_copy_with_zero(m2, k1, B + m1, termB, m, m1, m1 != m2, false);
280
315
  strassen_sub_to_first(m2, k2, termB, B + m1 + m * k1, m1, m);
281
316
 
282
317
  recursive_strassen(n1, k1, m1, termA, termB, P3);
283
- fill_d_array(k1 * n1, termA, 0);
284
- fill_d_array(m1 * k1, termB, 0);
285
318
  // -----------P4-----------
286
- strassen_copy(k2, n2, A + k1 + k * n1, termA, k, k1);
287
-
288
- strassen_copy(m1, k2, B + m * k1, termB, m, m1);
319
+ strassen_copy_with_zero(k2, n2, A + k1 + k * n1, termA, k, k1, k1 != k2, n1 != n2);
320
+
321
+ strassen_copy_with_zero(m1, k2, B + m * k1, termB, m, m1, false, k1 != k2);
289
322
  strassen_sub_to_first(m1, k1, termB, B, m1, m);
290
323
 
291
324
  recursive_strassen(n1, k1, m1, termA, termB, P4);
292
- fill_d_array(m1 * k1, termB, 0);
293
325
  // -----------P5-----------
294
326
  strassen_copy(k1, n1, A, termA, k, k1);
295
327
  strassen_sum_to_first(k2, n1, termA, A + k1, k1, k);
296
328
 
297
- strassen_copy(m2, k2, B + m1 + m * k1, termB, m, m1);
298
-
329
+ strassen_copy_with_zero(m2, k2, B + m1 + m * k1, termB, m, m1, m1 != m2, k1 != k2);
330
+
299
331
  recursive_strassen(n1, k1, m1, termA, termB, P5);
300
- fill_d_array(k1 * n1, termA, 0);
301
332
  // -----------P6-----------
302
- strassen_copy(k1, n2, A + k * n1, termA, k, k1);
333
+ strassen_copy_with_zero(k1, n2, A + k * n1, termA, k, k1, false, n1 != n2);
303
334
  strassen_sub_to_first(k1, n1, termA, A, k1, k);
304
335
 
305
336
  strassen_copy(m1, k1, B, termB, m, m1);
306
337
  strassen_sum_to_first(m2, k1, termB, B + m1, m1, m);
307
338
 
308
339
  recursive_strassen(n1, k1, m1, termA, termB, P6);
309
- fill_d_array(k1 * n1, termA, 0);
310
- fill_d_array(m1 * k1, termB, 0);
311
340
  // -----------P7-----------
312
- strassen_copy(k2, n1, A + k1, termA, k, k1);
341
+ strassen_copy_with_zero(k2, n1, A + k1, termA, k, k1, k1 != k2, false);
313
342
  strassen_sub_to_first(k2, n2, termA, A + k1 + k * n1, k1, k);
314
343
 
315
- strassen_copy(m1, k2, B + k1 * m, termB, m, m1);
344
+ strassen_copy_with_zero(m1, k2, B + k1 * m, termB, m, m1, false, k1 != k2);
316
345
  strassen_sum_to_first(m2, k2, termB, B + m1 + m * k1, m1, m);
317
346
 
318
347
  recursive_strassen(n1, k1, m1, termA, termB, P7);
@@ -412,7 +441,7 @@ VALUE matrix_multiply(VALUE self, VALUE v)
412
441
  || RB_TYPE_P(v, T_BIGNUM))
413
442
  return matrix_multiply_mn(self, v);
414
443
  if(RBASIC_CLASS(v) == cMatrix)
415
- return matrix_multiply_mm(self, v);
444
+ return strassen(self, v);
416
445
  if(RBASIC_CLASS(v) == cVector);
417
446
  return matrix_multiply_mv(self, v);
418
447
  rb_raise(fm_eTypeError, "Invalid klass for multiply");
@@ -462,6 +491,7 @@ VALUE transpose(VALUE self)
462
491
 
463
492
  VALUE matrix_add_with(VALUE self, VALUE value)
464
493
  {
494
+ raise_check_rbasic(value, cMatrix, "matrix");
465
495
  struct matrix* A;
466
496
  struct matrix* B;
467
497
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
@@ -484,6 +514,7 @@ VALUE matrix_add_with(VALUE self, VALUE value)
484
514
 
485
515
  VALUE matrix_add_from(VALUE self, VALUE value)
486
516
  {
517
+ raise_check_rbasic(value, cMatrix, "matrix");
487
518
  struct matrix* A;
488
519
  struct matrix* B;
489
520
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
@@ -500,9 +531,9 @@ VALUE matrix_add_from(VALUE self, VALUE value)
500
531
  return self;
501
532
  }
502
533
 
503
-
504
534
  VALUE matrix_sub_with(VALUE self, VALUE value)
505
535
  {
536
+ raise_check_rbasic(value, cMatrix, "matrix");
506
537
  struct matrix* A;
507
538
  struct matrix* B;
508
539
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
@@ -523,6 +554,25 @@ VALUE matrix_sub_with(VALUE self, VALUE value)
523
554
  return result;
524
555
  }
525
556
 
557
+ VALUE matrix_sub_from(VALUE self, VALUE value)
558
+ {
559
+ raise_check_rbasic(value, cMatrix, "matrix");
560
+ struct matrix* A;
561
+ struct matrix* B;
562
+ TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
563
+ TypedData_Get_Struct(value, struct matrix, &matrix_type, B);
564
+
565
+ if(A->m != B->m && A->n != B->n)
566
+ rb_raise(fm_eIndexError, "Different sizes matrices");
567
+
568
+ int m = B->m;
569
+ int n = A->n;
570
+
571
+ sub_d_arrays_to_first(n * m, A->data, B->data);
572
+
573
+ return self;
574
+ }
575
+
526
576
  double determinant(int n, const double* A)
527
577
  {
528
578
  double* M = malloc(n * n * sizeof(double));
@@ -559,7 +609,6 @@ VALUE matrix_determinant(VALUE self)
559
609
  struct matrix* A;
560
610
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
561
611
 
562
-
563
612
  int m = A->m;
564
613
  int n = A->n;
565
614
  if(m != n)
@@ -568,24 +617,6 @@ VALUE matrix_determinant(VALUE self)
568
617
  return DBL2NUM(determinant(n, A->data));
569
618
  }
570
619
 
571
- VALUE matrix_sub_from(VALUE self, VALUE value)
572
- {
573
- struct matrix* A;
574
- struct matrix* B;
575
- TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
576
- TypedData_Get_Struct(value, struct matrix, &matrix_type, B);
577
-
578
- if(A->m != B->m && A->n != B->n)
579
- rb_raise(fm_eIndexError, "Different sizes matrices");
580
-
581
- int m = B->m;
582
- int n = A->n;
583
-
584
- sub_d_arrays_to_first(n * m, A->data, B->data);
585
-
586
- return self;
587
- }
588
-
589
620
  VALUE matrix_fill(VALUE self, VALUE value)
590
621
  {
591
622
  double d = raise_rb_value_to_double(value);
@@ -599,13 +630,15 @@ VALUE matrix_fill(VALUE self, VALUE value)
599
630
 
600
631
  VALUE matrix_equal(VALUE self, VALUE value)
601
632
  {
633
+ if(RBASIC_CLASS(value) != cMatrix)
634
+ return Qfalse;
602
635
  struct matrix* A;
603
636
  struct matrix* B;
604
637
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
605
638
  TypedData_Get_Struct(value, struct matrix, &matrix_type, B);
606
639
 
607
640
  if(A->n != B->n || A->m != B->m)
608
- return Qfalse;
641
+ return Qfalse;
609
642
 
610
643
  int n = A->n;
611
644
  int m = B->m;
@@ -634,6 +667,8 @@ VALUE matrix_abs(VALUE self)
634
667
 
635
668
  VALUE matrix_greater_or_equal(VALUE self, VALUE value)
636
669
  {
670
+ if(RBASIC_CLASS(value) != cMatrix)
671
+ rb_raise(fm_eTypeError, "Expected class matrix");
637
672
  struct matrix* A;
638
673
  struct matrix* B;
639
674
  TypedData_Get_Struct(self, struct matrix, &matrix_type, A);
@@ -670,7 +705,7 @@ void init_fm_matrix()
670
705
  rb_define_method(cMatrix, "-", matrix_sub_with, 1);
671
706
  rb_define_method(cMatrix, "-=", matrix_sub_from, 1);
672
707
  rb_define_method(cMatrix, "fill!", matrix_fill, 1);
673
- rb_define_method(cMatrix, "strassen", strassen, 1);
708
+ //rb_define_method(cMatrix, "strassen", strassen, 1);
674
709
  rb_define_method(cMatrix, "abs", matrix_abs, 0);
675
710
  rb_define_method(cMatrix, ">=", matrix_greater_or_equal, 1);
676
711
  rb_define_method(cMatrix, "determinant", matrix_determinant, 0);
@@ -102,6 +102,7 @@ VALUE c_vector_size(VALUE self)
102
102
 
103
103
  VALUE vector_add_with(VALUE self, VALUE value)
104
104
  {
105
+ raise_check_rbasic(value, cVector, "vector");
105
106
  struct vector* A;
106
107
  struct vector* B;
107
108
  TypedData_Get_Struct(self, struct vector, &vector_type, A);
@@ -124,6 +125,7 @@ VALUE vector_add_with(VALUE self, VALUE value)
124
125
 
125
126
  VALUE vector_add_from(VALUE self, VALUE value)
126
127
  {
128
+ raise_check_rbasic(value, cVector, "vector");
127
129
  struct vector* A;
128
130
  struct vector* B;
129
131
  TypedData_Get_Struct(self, struct vector, &vector_type, A);
@@ -139,8 +141,51 @@ VALUE vector_add_from(VALUE self, VALUE value)
139
141
  return self;
140
142
  }
141
143
 
144
+ VALUE vector_sub_with(VALUE self, VALUE value)
145
+ {
146
+ raise_check_rbasic(value, cVector, "vector");
147
+ struct vector* A;
148
+ struct vector* B;
149
+ TypedData_Get_Struct(self, struct vector, &vector_type, A);
150
+ TypedData_Get_Struct(value, struct vector, &vector_type, B);
151
+
152
+ if(A->n != B->n)
153
+ rb_raise(fm_eIndexError, "Different sizes matrices");
154
+
155
+ int n = A->n;
156
+
157
+ struct vector* C;
158
+ VALUE result = TypedData_Make_Struct(cVector, struct vector, &vector_type, C);
159
+
160
+ c_vector_init(C, n);
161
+ sub_d_arrays_to_result(n, A->data, B->data, C->data);
162
+
163
+ return result;
164
+ }
165
+
166
+
167
+ VALUE vector_sub_from(VALUE self, VALUE value)
168
+ {
169
+ raise_check_rbasic(value, cVector, "vector");
170
+ struct vector* A;
171
+ struct vector* B;
172
+ TypedData_Get_Struct(self, struct vector, &vector_type, A);
173
+ TypedData_Get_Struct(value, struct vector, &vector_type, B);
174
+
175
+ if(A->n != B->n)
176
+ rb_raise(fm_eIndexError, "Different sizes matrices");
177
+
178
+ int n = A->n;
179
+
180
+ sub_d_arrays_to_first(n, A->data, B->data);
181
+
182
+ return self;
183
+ }
184
+
142
185
  VALUE vector_equal(VALUE self, VALUE value)
143
186
  {
187
+ if(RBASIC_CLASS(value) != cVector)
188
+ return Qfalse;
144
189
  struct vector* A;
145
190
  struct vector* B;
146
191
  TypedData_Get_Struct(self, struct vector, &vector_type, A);
@@ -271,6 +316,8 @@ void init_fm_vector()
271
316
  rb_define_method(cVector, "size", c_vector_size, 0);
272
317
  rb_define_method(cVector, "+", vector_add_with, 1);
273
318
  rb_define_method(cVector, "+=", vector_add_from, 1);
319
+ rb_define_method(cVector, "-", vector_sub_with, 1);
320
+ rb_define_method(cVector, "-=", vector_sub_from, 1);
274
321
  rb_define_method(cVector, "eql?", vector_equal, 1);
275
322
  rb_define_method(cVector, "clone", vector_copy, 0);
276
323
  rb_define_method(cVector, "*", vector_multiply, 1);
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
 
11
11
  spec.summary = %q{Ruby wrapper around C matrices implementation}
12
12
  spec.description = %q{Ruby wrapper around C matrices implementation}
13
- spec.homepage = "https://github.com/mmcs-ruby/fast_matrix"
13
+ spec.homepage = "https://github.com/mmcs-ruby/fast_matrix/wiki"
14
14
  spec.license = "MIT"
15
15
 
16
16
  spec.metadata["homepage_uri"] = spec.homepage
@@ -1,3 +1,3 @@
1
1
  module FastMatrix
2
- VERSION = '0.1.6'
2
+ VERSION = '0.1.7'
3
3
  end
@@ -19,14 +19,26 @@ module FastMatrix
19
19
  alias element []
20
20
  alias component []
21
21
 
22
- def to_s
23
- convert.to_s
22
+ def collect
23
+ collected_rows = []
24
+ rows.each do |i|
25
+ collected_rows.push(yield i)
26
+ end
27
+ collected_rows
24
28
  end
25
29
 
26
- def inspect
27
- convert.inspect
30
+ #
31
+ # Overrides Object#to_s
32
+ #
33
+ def to_s
34
+ "#{self.class}[#{collect do |row|
35
+ '[' + row.join(', ') + ']'
36
+ end.join(', ')}]"
28
37
  end
29
38
 
39
+ alias to_str to_s
40
+ alias inspect to_str
41
+
30
42
  #
31
43
  # Create fast matrix from standard matrix
32
44
  #
@@ -40,14 +52,42 @@ module FastMatrix
40
52
  fast_matrix
41
53
  end
42
54
 
55
+ #
56
+ # Yields all elements of the matrix, starting with those of the first row
57
+ #
58
+ # Matrix[ [1,2], [3,4] ].each { |e| puts e }
59
+ # # => prints the numbers 1 to 4
60
+ def each(&block)
61
+ raise NotSupportedError unless block_given?
62
+
63
+ each_with_index { |elem, _, _| block.call(elem) }
64
+ self
65
+ end
66
+
67
+ #
68
+ # Same as #each, but the row index and column index in addition to the element
69
+ #
70
+ # Matrix[ [1,2], [3,4] ].each_with_index do |e, row, col|
71
+ # puts "#{e} at #{row}, #{col}"
72
+ # end
73
+ # # => Prints:
74
+ # # 1 at 0, 0
75
+ # # 2 at 0, 1
76
+ # # 3 at 1, 0
77
+ # # 4 at 1, 1
78
+ #
43
79
  def each_with_index
80
+ raise NotSupportedError unless block_given?
81
+
44
82
  (0...row_count).each do |i|
45
83
  (0...column_count).each do |j|
46
84
  yield self[i, j], i, j
47
85
  end
48
86
  end
87
+ self
49
88
  end
50
89
 
90
+ # don't use (Issue#1)
51
91
  def each_with_index!
52
92
  (0...row_count).each do |i|
53
93
  (0...column_count).each do |j|
@@ -76,5 +116,19 @@ module FastMatrix
76
116
  end
77
117
  result
78
118
  end
119
+
120
+ private
121
+
122
+ def rows
123
+ rows = []
124
+ (0...row_count).each do |i|
125
+ row = []
126
+ (0...column_count).each do |j|
127
+ row.push(element(i, j))
128
+ end
129
+ rows.push(row)
130
+ end
131
+ rows
132
+ end
79
133
  end
80
134
  end
@@ -21,12 +21,32 @@ module FastMatrix
21
21
  Array.new(size) { |i| self[i] }
22
22
  end
23
23
 
24
+ def to_s
25
+ "#{self.class}[#{to_ary.join(', ')}]"
26
+ end
27
+ alias to_str to_s
28
+ alias inspect to_str
29
+
30
+ #
31
+ # Iterate over the elements of this vector
32
+ #
33
+ def each
34
+ raise NotSupportedError unless block_given?
35
+
36
+ (0...size).each do |i|
37
+ yield self[i]
38
+ end
39
+ self
40
+ end
41
+
24
42
  def each_with_index
25
43
  (0...size).each do |i|
26
44
  yield self[i], i
27
45
  end
46
+ self
28
47
  end
29
48
 
49
+ # don't use (Issue#1)
30
50
  def each_with_index!
31
51
  (0...size).each do |i|
32
52
  self[i] = yield self[i], i
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fast_matrix
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - mmcs_ruby
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-29 00:00:00.000000000 Z
11
+ date: 2019-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -117,11 +117,11 @@ files:
117
117
  - lib/scalar.rb
118
118
  - lib/vector/constructors.rb
119
119
  - lib/vector/vector.rb
120
- homepage: https://github.com/mmcs-ruby/fast_matrix
120
+ homepage: https://github.com/mmcs-ruby/fast_matrix/wiki
121
121
  licenses:
122
122
  - MIT
123
123
  metadata:
124
- homepage_uri: https://github.com/mmcs-ruby/fast_matrix
124
+ homepage_uri: https://github.com/mmcs-ruby/fast_matrix/wiki
125
125
  source_code_uri: https://github.com/mmcs-ruby/fast_matrix
126
126
  post_install_message:
127
127
  rdoc_options: []