ruby-mpfr 0.0.12 → 0.0.13
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.
- data/.gitignore +13 -0
- data/Gemfile +4 -0
- data/README.rdoc +8 -7
- data/Rakefile +26 -25
- data/ext/mpfr/ruby_mpfr.c +367 -219
- data/ext/mpfr_matrix/mpfr/func_mpfr_matrix.c +18 -21
- data/ext/mpfr_matrix/mpfr/ruby_mpfr_matrix.c +78 -62
- data/lib/mpfr/gmp.rb +1 -0
- data/lib/mpfr/matrix.rb +1 -0
- data/lib/mpfr/version.rb +3 -1
- data/ruby-mpfr.gemspec +19 -34
- data/spec/mpfr/comparison_spec.rb +59 -0
- data/spec/mpfr/conversion_spec.rb +174 -8
- metadata +53 -64
- data/.gemtest +0 -0
- data/Manifest.txt +0 -58
- data/PostInstall.txt +0 -7
- data/script/console +0 -10
- data/script/destroy +0 -14
- data/script/generate +0 -14
- data/tasks/extconf.rake +0 -36
@@ -1,12 +1,12 @@
|
|
1
1
|
#include "func_mpfr_matrix.h"
|
2
2
|
|
3
3
|
void mpfr_matrix_init(MPFRMatrix *mat, int row, int column){
|
4
|
+
int i;
|
4
5
|
mat->row = row;
|
5
6
|
mat->column = column;
|
6
7
|
mat->size = row * column;
|
7
8
|
/* mat->data = (MPFR *)malloc(sizeof(MPF) * mat->size); */
|
8
9
|
mat->data = ALLOC_N(MPFR, mat->size);
|
9
|
-
int i;
|
10
10
|
for(i = 0; i < mat->size; i++){
|
11
11
|
mpfr_init(mat->data + i);
|
12
12
|
}
|
@@ -76,7 +76,6 @@ void mpfr_matrix_neg(MPFRMatrix *new, MPFRMatrix *x){
|
|
76
76
|
}
|
77
77
|
}
|
78
78
|
|
79
|
-
|
80
79
|
/* Return 0 if *x and *y has the same elements. Otherwise return 1. */
|
81
80
|
int mpfr_matrix_equal_p(MPFRMatrix *x, MPFRMatrix *y){
|
82
81
|
int i, ret = 0;
|
@@ -150,8 +149,8 @@ void mpfr_matrix_div_scalar(MPFRMatrix *new, MPFRMatrix *x, MPFR *scalar){
|
|
150
149
|
|
151
150
|
void mpfr_matrix_inner_product(MPFR *pr, MPFRMatrix *x, MPFRMatrix *y){
|
152
151
|
MPFR *tmp;
|
153
|
-
r_mpfr_temp_alloc_init(tmp);
|
154
152
|
int i;
|
153
|
+
r_mpfr_temp_alloc_init(tmp);
|
155
154
|
mpfr_set_si(pr, 0, GMP_RNDN);
|
156
155
|
for(i = 0; i < x->size; i++){
|
157
156
|
mpfr_mul(tmp, x->data + i, y->data + i, GMP_RNDN);
|
@@ -162,8 +161,8 @@ void mpfr_matrix_inner_product(MPFR *pr, MPFRMatrix *x, MPFRMatrix *y){
|
|
162
161
|
|
163
162
|
void mpfr_matrix_vector_distance(MPFR *distance, MPFRMatrix *x, MPFRMatrix *y){
|
164
163
|
MPFR *tmp;
|
165
|
-
r_mpfr_temp_alloc_init(tmp);
|
166
164
|
int i;
|
165
|
+
r_mpfr_temp_alloc_init(tmp);
|
167
166
|
mpfr_set_si(distance, 0, GMP_RNDN);
|
168
167
|
for(i = 0; i < x->size; i++){
|
169
168
|
mpfr_sub(tmp, x->data + i, y->data + i, GMP_RNDN);
|
@@ -176,8 +175,8 @@ void mpfr_matrix_vector_distance(MPFR *distance, MPFRMatrix *x, MPFRMatrix *y){
|
|
176
175
|
|
177
176
|
void mpfr_matrix_vector_norm(MPFR *norm, MPFRMatrix *x){
|
178
177
|
MPFR *tmp;
|
179
|
-
r_mpfr_temp_alloc_init(tmp);
|
180
178
|
int i;
|
179
|
+
r_mpfr_temp_alloc_init(tmp);
|
181
180
|
mpfr_set_si(norm, 0, GMP_RNDN);
|
182
181
|
for(i = 0; i < x->size; i++){
|
183
182
|
mpfr_mul(tmp, x->data + i, x->data + i, GMP_RNDN);
|
@@ -189,8 +188,8 @@ void mpfr_matrix_vector_norm(MPFR *norm, MPFRMatrix *x){
|
|
189
188
|
|
190
189
|
void mpfr_matrix_max_norm(MPFR *norm, MPFRMatrix *x){
|
191
190
|
MPFR *tmp;
|
192
|
-
r_mpfr_temp_alloc_init(tmp);
|
193
191
|
int i;
|
192
|
+
r_mpfr_temp_alloc_init(tmp);
|
194
193
|
mpfr_set_si(norm, 0, GMP_RNDN);
|
195
194
|
for(i = 0; i < x->size; i++){
|
196
195
|
mpfr_abs(tmp, x->data + i, GMP_RNDN);
|
@@ -202,24 +201,24 @@ void mpfr_matrix_max_norm(MPFR *norm, MPFRMatrix *x){
|
|
202
201
|
}
|
203
202
|
|
204
203
|
void mpfr_col_vector_init(MPFRMatrix *mat, int row){
|
204
|
+
int i;
|
205
205
|
mat->row = row;
|
206
206
|
mat->column = 1;
|
207
207
|
mat->size = row;
|
208
208
|
/* mat->data = (MPFR *)malloc(sizeof(MPF) * mat->size); */
|
209
209
|
mat->data = ALLOC_N(MPFR, mat->size);
|
210
|
-
int i;
|
211
210
|
for(i = 0; i < mat->size; i++){
|
212
211
|
mpfr_init(mat->data + i);
|
213
212
|
}
|
214
213
|
}
|
215
214
|
|
216
215
|
void mpfr_row_vector_init(MPFRMatrix *mat, int column){
|
216
|
+
int i;
|
217
217
|
mat->row = 1;
|
218
218
|
mat->column = column;
|
219
219
|
mat->size = column;
|
220
220
|
/* mat->data = (MPFR *)malloc(sizeof(MPF) * mat->size); */
|
221
221
|
mat->data = ALLOC_N(MPFR, mat->size);
|
222
|
-
int i;
|
223
222
|
for(i = 0; i < mat->size; i++){
|
224
223
|
mpfr_init(mat->data + i);
|
225
224
|
}
|
@@ -228,9 +227,9 @@ void mpfr_row_vector_init(MPFRMatrix *mat, int column){
|
|
228
227
|
/* If length of MPFRMatrix *x is zero, return 1. Otherwise return 0. */
|
229
228
|
int mpfr_vector_normalize(MPFRMatrix *new, MPFRMatrix *x){
|
230
229
|
MPFR *norm;
|
230
|
+
int i, j, index, ret = 0;
|
231
231
|
r_mpfr_temp_alloc_init(norm);
|
232
232
|
mpfr_matrix_vector_norm(norm, x);
|
233
|
-
int i, j, index, ret = 0;
|
234
233
|
if(mpfr_cmp_ui(norm, 0) > 0){
|
235
234
|
for(j = 0; j < x->column; j++){
|
236
235
|
index = j * x->row;
|
@@ -248,9 +247,9 @@ int mpfr_vector_normalize(MPFRMatrix *new, MPFRMatrix *x){
|
|
248
247
|
/* If length of MPFRMatrix *x is zero, return 1. Otherwise return 0. */
|
249
248
|
int mpfr_vector_set_length(MPFRMatrix *new, MPFRMatrix *x, MPFR *length){
|
250
249
|
MPFR *factor;
|
250
|
+
int i, j, index, ret = 0;
|
251
251
|
r_mpfr_temp_alloc_init(factor);
|
252
252
|
mpfr_matrix_vector_norm(factor, x);
|
253
|
-
int i, j, index, ret = 0;
|
254
253
|
if(mpfr_cmp_ui(factor, 0) > 0){
|
255
254
|
mpfr_ui_div(factor, 1, factor, GMP_RNDN);
|
256
255
|
mpfr_mul(factor, factor, length, GMP_RNDN);
|
@@ -278,10 +277,10 @@ void mpfr_vector_midpoint(MPFRMatrix *new, MPFRMatrix *x, MPFRMatrix *y){
|
|
278
277
|
/* "distance between *new and *x" / "distance between *y and *x" = *div */
|
279
278
|
void mpfr_vector_dividing_point(MPFRMatrix *new, MPFRMatrix *x, MPFRMatrix *y, MPFR *div){
|
280
279
|
MPFRMatrix *tmp_x, *tmp_y;
|
280
|
+
MPFR *ratio;
|
281
281
|
r_mpfr_matrix_temp_alloc_init(tmp_x, new->row, new->column);
|
282
282
|
r_mpfr_matrix_temp_alloc_init(tmp_y, new->row, new->column);
|
283
283
|
|
284
|
-
MPFR *ratio;
|
285
284
|
r_mpfr_temp_alloc_init(ratio);
|
286
285
|
mpfr_ui_sub(ratio, 1, div, GMP_RNDN);
|
287
286
|
mpfr_matrix_mul_scalar(tmp_y, y, ratio);
|
@@ -441,8 +440,9 @@ void mpfr_square_matrix_determinant(MPFR *det, MPFRMatrix *x){
|
|
441
440
|
mpfr_3d_square_matrix_determinant(det, x);
|
442
441
|
}else{
|
443
442
|
MPFRMatrix *ptr_lu;
|
443
|
+
int i, *indx;
|
444
444
|
r_mpfr_matrix_temp_alloc_init(ptr_lu, x->row, x->column);
|
445
|
-
int
|
445
|
+
indx = (int *)malloc(sizeof(int) * x->row);
|
446
446
|
if((i = mpfr_square_matrix_lu_decomp (ptr_lu, indx, x)) >= 0){
|
447
447
|
if (i == 0) {
|
448
448
|
mpfr_set_si(det, 1, GMP_RNDN);
|
@@ -456,22 +456,21 @@ void mpfr_square_matrix_determinant(MPFR *det, MPFRMatrix *x){
|
|
456
456
|
mpfr_set_ui(det, 0, GMP_RNDN);
|
457
457
|
}
|
458
458
|
r_mpfr_matrix_temp_free(ptr_lu);
|
459
|
+
free(indx);
|
459
460
|
}
|
460
|
-
|
461
461
|
}
|
462
462
|
|
463
463
|
void mpfr_square_matrix_qr_decomp(MPFRMatrix *q, MPFRMatrix *r, MPFRMatrix *x){
|
464
|
-
MPFRMatrix *q_mat, *r_mat;
|
464
|
+
MPFRMatrix *q_mat, *r_mat, *ary;
|
465
|
+
int i, j, k, ind1, ind2, ind3, size;
|
466
|
+
MPFR *tmp;
|
465
467
|
r_mpfr_matrix_temp_alloc_init(q_mat, q->row, q->column);
|
466
468
|
r_mpfr_matrix_temp_alloc_init(r_mat, r->row, r->column);
|
467
469
|
|
468
|
-
|
469
|
-
MPFRMatrix *ary;
|
470
|
+
size = x->row;
|
470
471
|
r_mpfr_matrix_temp_alloc_init(ary, size, size);
|
471
472
|
mpfr_matrix_set(ary, x);
|
472
|
-
MPFR *tmp;
|
473
473
|
r_mpfr_temp_alloc_init(tmp);
|
474
|
-
int i, j, k, ind1, ind2, ind3;
|
475
474
|
for (i = 0; i < size; i++) {
|
476
475
|
ind1 = i * size;
|
477
476
|
ind2 = i + ind1;
|
@@ -518,7 +517,5 @@ void mpfr_square_matrix_identity(MPFRMatrix *id){
|
|
518
517
|
mpfr_set_si(id->data + i + index, 0, GMP_RNDN);
|
519
518
|
}
|
520
519
|
}
|
521
|
-
}
|
522
|
-
|
520
|
+
}
|
523
521
|
}
|
524
|
-
|
@@ -195,10 +195,10 @@ static VALUE r_mpfr_matrix_initialize_copy (VALUE self, VALUE other)
|
|
195
195
|
static VALUE r_mpfr_matrix_marshal_dump(VALUE self)
|
196
196
|
{
|
197
197
|
MPFRMatrix *ptr;
|
198
|
-
r_mpfr_get_matrix_struct(ptr, self);
|
199
198
|
int i;
|
200
199
|
char *tmp_str;
|
201
200
|
VALUE ret_ary;
|
201
|
+
r_mpfr_get_matrix_struct(ptr, self);
|
202
202
|
ret_ary = rb_ary_new();
|
203
203
|
rb_ary_push(ret_ary, INT2FIX(ptr->row));
|
204
204
|
rb_ary_push(ret_ary, INT2FIX(ptr->column));
|
@@ -215,15 +215,15 @@ static VALUE r_mpfr_matrix_marshal_dump(VALUE self)
|
|
215
215
|
static VALUE r_mpfr_matrix_marshal_load(VALUE self, VALUE dump_ary)
|
216
216
|
{
|
217
217
|
MPFRMatrix *ptr;
|
218
|
+
int i;
|
219
|
+
char *dump;
|
220
|
+
VALUE dump_element;
|
218
221
|
r_mpfr_get_matrix_struct(ptr, self);
|
219
222
|
|
220
223
|
ptr->row = NUM2INT(rb_ary_entry(dump_ary, 0));
|
221
224
|
ptr->column = NUM2INT(rb_ary_entry(dump_ary, 1));
|
222
225
|
ptr->size = ptr->row * ptr->column;
|
223
226
|
ptr->data = ALLOC_N(MPFR, ptr->size);
|
224
|
-
int i;
|
225
|
-
char *dump;
|
226
|
-
VALUE dump_element;
|
227
227
|
|
228
228
|
for(i = 0; i < ptr->size; i++){
|
229
229
|
dump_element = rb_ary_entry(dump_ary, i + 2);
|
@@ -342,11 +342,11 @@ static VALUE r_mpfr_matrix_equal_p (VALUE self, VALUE other)
|
|
342
342
|
MPFRMatrix *ptr_self, *ptr_other;
|
343
343
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
344
344
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
345
|
-
VALUE ret = Qtrue;
|
346
345
|
if (mpfr_matrix_equal_p(ptr_self, ptr_other) != 0) {
|
347
|
-
|
346
|
+
return Qnil;
|
347
|
+
} else {
|
348
|
+
return Qtrue;
|
348
349
|
}
|
349
|
-
return ret;
|
350
350
|
}
|
351
351
|
|
352
352
|
/* Return size of data array which equals to column * row. */
|
@@ -377,8 +377,9 @@ static VALUE r_mpfr_matrix_row_size (VALUE self)
|
|
377
377
|
static VALUE r_mpfr_matrix_element (VALUE self, VALUE row, VALUE column)
|
378
378
|
{
|
379
379
|
MPFRMatrix *ptr_self;
|
380
|
+
int i, j;
|
380
381
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
381
|
-
|
382
|
+
i = NUM2INT(row), j = NUM2INT(column);
|
382
383
|
if (i < ptr_self->row && j < ptr_self->column) {
|
383
384
|
VALUE ret;
|
384
385
|
MPFR *ptr_ret;
|
@@ -394,8 +395,9 @@ static VALUE r_mpfr_matrix_element (VALUE self, VALUE row, VALUE column)
|
|
394
395
|
static VALUE r_mpfr_matrix_at (VALUE self, VALUE arg)
|
395
396
|
{
|
396
397
|
MPFRMatrix *ptr_self;
|
398
|
+
int i;
|
397
399
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
398
|
-
|
400
|
+
i = NUM2INT(arg);
|
399
401
|
if (i < ptr_self->size) {
|
400
402
|
VALUE ret;
|
401
403
|
MPFR *ptr_ret;
|
@@ -411,8 +413,9 @@ static VALUE r_mpfr_matrix_at (VALUE self, VALUE arg)
|
|
411
413
|
static VALUE r_mpfr_matrix_set_element (VALUE self, VALUE row, VALUE column, VALUE robj)
|
412
414
|
{
|
413
415
|
MPFRMatrix *ptr_self;
|
416
|
+
int i, j;
|
414
417
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
415
|
-
|
418
|
+
i = NUM2INT(row), j = NUM2INT(column);
|
416
419
|
if (i < ptr_self->row && j < ptr_self->column) {
|
417
420
|
r_mpfr_set_robj(mpfr_matrix_get_element(ptr_self, i, j), robj, GMP_RNDN);
|
418
421
|
}
|
@@ -423,9 +426,10 @@ static VALUE r_mpfr_matrix_set_element (VALUE self, VALUE row, VALUE column, VAL
|
|
423
426
|
static VALUE r_mpfr_matrix_each_element (VALUE self)
|
424
427
|
{
|
425
428
|
MPFRMatrix *ptr_self;
|
426
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
427
|
-
VALUE ret = Qnil;
|
428
429
|
int i, j;
|
430
|
+
VALUE ret;
|
431
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
432
|
+
ret = Qnil;
|
429
433
|
for (i = 0; i < ptr_self->row; i++) {
|
430
434
|
for (j = 0; j < ptr_self->column; j++) {
|
431
435
|
volatile VALUE arg = r_mpfr_make_new_fr_obj(mpfr_matrix_get_element(ptr_self, i, j));
|
@@ -439,9 +443,10 @@ static VALUE r_mpfr_matrix_each_element (VALUE self)
|
|
439
443
|
static VALUE r_mpfr_matrix_each_element_with_index (VALUE self)
|
440
444
|
{
|
441
445
|
MPFRMatrix *ptr_self;
|
442
|
-
|
443
|
-
VALUE ret = Qnil, tmp_i;
|
446
|
+
VALUE ret, tmp_i;
|
444
447
|
int i, j;
|
448
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
449
|
+
ret = Qnil;
|
445
450
|
for (i = 0; i < ptr_self->row; i++) {
|
446
451
|
tmp_i = INT2NUM(i);
|
447
452
|
for (j = 0; j < ptr_self->column; j++) {
|
@@ -456,10 +461,11 @@ static VALUE r_mpfr_matrix_each_element_with_index (VALUE self)
|
|
456
461
|
static VALUE r_mpfr_matrix_str_ary(VALUE self, VALUE format_str)
|
457
462
|
{
|
458
463
|
MPFRMatrix *ptr_self;
|
464
|
+
char *format, *tmp_str;
|
465
|
+
int i;
|
459
466
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
460
|
-
char *format = StringValuePtr(format_str), *tmp_str;
|
461
467
|
VALUE ret_val[ptr_self->size];
|
462
|
-
|
468
|
+
format = StringValuePtr(format_str);
|
463
469
|
for (i = 0; i < ptr_self->size; i++) {
|
464
470
|
if (!mpfr_asprintf(&tmp_str, format, ptr_self->data + i)) {
|
465
471
|
rb_raise(rb_eFatal, "Can not allocate a string by mpfr_asprintf.");
|
@@ -474,10 +480,11 @@ static VALUE r_mpfr_matrix_str_ary(VALUE self, VALUE format_str)
|
|
474
480
|
static VALUE r_mpfr_matrix_str_ary2(VALUE self, VALUE format_str)
|
475
481
|
{
|
476
482
|
MPFRMatrix *ptr_self;
|
483
|
+
char *format, *tmp_str;
|
484
|
+
int i, j;
|
477
485
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
478
|
-
|
486
|
+
format = StringValuePtr(format_str);
|
479
487
|
VALUE ary[ptr_self->row];
|
480
|
-
int i, j;
|
481
488
|
for(i = 0; i < ptr_self->row; i++){
|
482
489
|
ary[i] = rb_ary_new();
|
483
490
|
}
|
@@ -497,9 +504,9 @@ static VALUE r_mpfr_matrix_str_ary2(VALUE self, VALUE format_str)
|
|
497
504
|
static VALUE r_mpfr_matrix_to_array(VALUE self)
|
498
505
|
{
|
499
506
|
MPFRMatrix *ptr_self;
|
507
|
+
int i;
|
500
508
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
501
509
|
VALUE ret_val[ptr_self->size];
|
502
|
-
int i;
|
503
510
|
for (i = 0; i < ptr_self->size; i++) {
|
504
511
|
ret_val[i] = r_mpfr_make_new_fr_obj(ptr_self->data + i);
|
505
512
|
}
|
@@ -510,9 +517,9 @@ static VALUE r_mpfr_matrix_to_array(VALUE self)
|
|
510
517
|
static VALUE r_mpfr_matrix_to_array2(VALUE self)
|
511
518
|
{
|
512
519
|
MPFRMatrix *ptr_self;
|
520
|
+
int i, j;
|
513
521
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
514
522
|
VALUE ary[ptr_self->row];
|
515
|
-
int i, j;
|
516
523
|
for(i = 0; i < ptr_self->row; i++){
|
517
524
|
ary[i] = rb_ary_new();
|
518
525
|
}
|
@@ -528,9 +535,10 @@ static VALUE r_mpfr_matrix_to_array2(VALUE self)
|
|
528
535
|
static VALUE r_mpfr_matrix_row (VALUE self, VALUE arg)
|
529
536
|
{
|
530
537
|
MPFRMatrix *ptr_self, *ptr_ret;
|
531
|
-
|
532
|
-
int num = NUM2INT(arg);
|
538
|
+
int num;
|
533
539
|
VALUE ret;
|
540
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
541
|
+
num = NUM2INT(arg);
|
534
542
|
if(num < ptr_self->row){
|
535
543
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, 1, ptr_self->column);
|
536
544
|
mpfr_matrix_row(ptr_ret, ptr_self, num);
|
@@ -544,9 +552,10 @@ static VALUE r_mpfr_matrix_row (VALUE self, VALUE arg)
|
|
544
552
|
static VALUE r_mpfr_matrix_column (VALUE self, VALUE arg)
|
545
553
|
{
|
546
554
|
MPFRMatrix *ptr_self, *ptr_ret;
|
547
|
-
|
548
|
-
int num = NUM2INT(arg);
|
555
|
+
int num;
|
549
556
|
VALUE ret;
|
557
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
558
|
+
num = NUM2INT(arg);
|
550
559
|
if(num < ptr_self->column){
|
551
560
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, 1);
|
552
561
|
mpfr_matrix_column(ptr_ret, ptr_self, num);
|
@@ -560,8 +569,8 @@ static VALUE r_mpfr_matrix_column (VALUE self, VALUE arg)
|
|
560
569
|
static VALUE r_mpfr_matrix_transpose (VALUE self)
|
561
570
|
{
|
562
571
|
MPFRMatrix *ptr_self, *ptr_ret;
|
563
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
564
572
|
VALUE ret;
|
573
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
565
574
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->column, ptr_self->row);
|
566
575
|
mpfr_matrix_transpose(ptr_ret, ptr_self);
|
567
576
|
return ret;
|
@@ -571,6 +580,7 @@ static VALUE r_mpfr_matrix_transpose (VALUE self)
|
|
571
580
|
static VALUE r_mpfr_matrix_transpose2 (VALUE self)
|
572
581
|
{
|
573
582
|
MPFRMatrix *ptr_self, tmp;
|
583
|
+
int i;
|
574
584
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
575
585
|
if (ptr_self->column > 1 && ptr_self->row > 1) {
|
576
586
|
mpfr_matrix_init(&tmp, ptr_self->column, ptr_self->row);
|
@@ -578,7 +588,6 @@ static VALUE r_mpfr_matrix_transpose2 (VALUE self)
|
|
578
588
|
mpfr_matrix_set(ptr_self, &tmp);
|
579
589
|
mpfr_matrix_clear(&tmp);
|
580
590
|
}
|
581
|
-
int i;
|
582
591
|
i = ptr_self->column;
|
583
592
|
ptr_self->column = ptr_self->row;
|
584
593
|
ptr_self->row = i;
|
@@ -589,8 +598,8 @@ static VALUE r_mpfr_matrix_transpose2 (VALUE self)
|
|
589
598
|
static VALUE r_mpfr_matrix_neg (VALUE self)
|
590
599
|
{
|
591
600
|
MPFRMatrix *ptr_self, *ptr_ret;
|
592
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
593
601
|
VALUE ret;
|
602
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
594
603
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
595
604
|
mpfr_matrix_neg(ptr_ret, ptr_self);
|
596
605
|
return ret;
|
@@ -600,9 +609,9 @@ static VALUE r_mpfr_matrix_neg (VALUE self)
|
|
600
609
|
static VALUE r_mpfr_matrix_add (VALUE self, VALUE other)
|
601
610
|
{
|
602
611
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
612
|
+
VALUE ret;
|
603
613
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
604
614
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
605
|
-
VALUE ret;
|
606
615
|
if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
|
607
616
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
608
617
|
mpfr_matrix_add(ptr_ret, ptr_self, ptr_other);
|
@@ -616,9 +625,9 @@ static VALUE r_mpfr_matrix_add (VALUE self, VALUE other)
|
|
616
625
|
static VALUE r_mpfr_matrix_add2 (VALUE self, VALUE other)
|
617
626
|
{
|
618
627
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
628
|
+
VALUE ret;
|
619
629
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
620
630
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
621
|
-
VALUE ret;
|
622
631
|
r_mpfr_make_matrix_struct(ret, ptr_ret);
|
623
632
|
if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
|
624
633
|
mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_self->column);
|
@@ -633,9 +642,9 @@ static VALUE r_mpfr_matrix_add2 (VALUE self, VALUE other)
|
|
633
642
|
static VALUE r_mpfr_matrix_sub (VALUE self, VALUE other)
|
634
643
|
{
|
635
644
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
645
|
+
VALUE ret;
|
636
646
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
637
647
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
638
|
-
VALUE ret;
|
639
648
|
r_mpfr_make_matrix_struct(ret, ptr_ret);
|
640
649
|
if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
|
641
650
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
@@ -650,9 +659,9 @@ static VALUE r_mpfr_matrix_sub (VALUE self, VALUE other)
|
|
650
659
|
static VALUE r_mpfr_matrix_sub2 (VALUE self, VALUE other)
|
651
660
|
{
|
652
661
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
662
|
+
VALUE ret;
|
653
663
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
654
664
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
655
|
-
VALUE ret;
|
656
665
|
r_mpfr_make_matrix_struct(ret, ptr_ret);
|
657
666
|
if (ptr_self->column == ptr_other->column && ptr_self->row == ptr_other->row) {
|
658
667
|
mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_self->column);
|
@@ -667,10 +676,10 @@ static VALUE r_mpfr_matrix_sub2 (VALUE self, VALUE other)
|
|
667
676
|
static VALUE r_mpfr_vector_inner_product (VALUE self, VALUE arg)
|
668
677
|
{
|
669
678
|
MPFRMatrix *ptr_self, *ptr_arg;
|
670
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
671
|
-
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
672
679
|
VALUE ret;
|
673
680
|
MPFR *ptr_ret;
|
681
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
682
|
+
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
674
683
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
675
684
|
if(ptr_self->size == ptr_arg->size){
|
676
685
|
mpfr_matrix_inner_product(ptr_ret, ptr_self, ptr_arg);
|
@@ -684,9 +693,9 @@ static VALUE r_mpfr_vector_inner_product (VALUE self, VALUE arg)
|
|
684
693
|
static VALUE r_mpfr_matrix_mul_matrix (VALUE self, VALUE other)
|
685
694
|
{
|
686
695
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
696
|
+
VALUE ret;
|
687
697
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
688
698
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
689
|
-
VALUE ret;
|
690
699
|
r_mpfr_make_matrix_struct(ret, ptr_ret);
|
691
700
|
if (ptr_self->column == ptr_other->row) {
|
692
701
|
if((ptr_other->column == 1) && (ptr_self->row == 1)){
|
@@ -705,9 +714,9 @@ static VALUE r_mpfr_matrix_mul_matrix (VALUE self, VALUE other)
|
|
705
714
|
static VALUE r_mpfr_matrix_mul_matrix2 (VALUE self, VALUE other)
|
706
715
|
{
|
707
716
|
MPFRMatrix *ptr_self, *ptr_other, *ptr_ret;
|
717
|
+
VALUE ret;
|
708
718
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
709
719
|
r_mpfr_get_matrix_struct(ptr_other, other);
|
710
|
-
VALUE ret;
|
711
720
|
r_mpfr_make_matrix_struct(ret, ptr_ret);
|
712
721
|
if (ptr_self->column == ptr_other->row) {
|
713
722
|
mpfr_matrix_init(ptr_ret, ptr_self->row, ptr_other->column);
|
@@ -723,8 +732,8 @@ static VALUE r_mpfr_matrix_mul_scalar (VALUE self, VALUE scalar)
|
|
723
732
|
{
|
724
733
|
MPFRMatrix *ptr_self, *ptr_ret;
|
725
734
|
MPFR *ptr_scalar;
|
726
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
727
735
|
VALUE ret;
|
736
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
728
737
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
729
738
|
if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, scalar))){
|
730
739
|
r_mpfr_get_struct(ptr_scalar, scalar);
|
@@ -743,8 +752,8 @@ static VALUE r_mpfr_matrix_div_scalar (VALUE self, VALUE scalar)
|
|
743
752
|
{
|
744
753
|
MPFRMatrix *ptr_self, *ptr_ret;
|
745
754
|
MPFR *ptr_scalar;
|
746
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
747
755
|
VALUE ret;
|
756
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
748
757
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
749
758
|
if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, scalar))){
|
750
759
|
r_mpfr_get_struct(ptr_scalar, scalar);
|
@@ -762,9 +771,9 @@ static VALUE r_mpfr_matrix_div_scalar (VALUE self, VALUE scalar)
|
|
762
771
|
static VALUE r_mpfr_matrix_vector_norm (VALUE self)
|
763
772
|
{
|
764
773
|
MPFRMatrix *ptr_self;
|
765
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
766
774
|
VALUE ret;
|
767
775
|
MPFR *ptr_ret;
|
776
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
768
777
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
769
778
|
mpfr_matrix_vector_norm(ptr_ret, ptr_self);
|
770
779
|
return ret;
|
@@ -774,9 +783,9 @@ static VALUE r_mpfr_matrix_vector_norm (VALUE self)
|
|
774
783
|
static VALUE r_mpfr_matrix_max_norm (VALUE self)
|
775
784
|
{
|
776
785
|
MPFRMatrix *ptr_self;
|
777
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
778
786
|
VALUE ret;
|
779
787
|
MPFR *ptr_ret;
|
788
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
780
789
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
781
790
|
mpfr_matrix_max_norm(ptr_ret, ptr_self);
|
782
791
|
return ret;
|
@@ -795,13 +804,13 @@ static VALUE r_mpfr_square_matrix_lu_decomp (VALUE self)
|
|
795
804
|
{
|
796
805
|
MPFRMatrix *ptr_self, *ptr_ret_l, *ptr_ret_u;
|
797
806
|
VALUE ret_l, ret_u;
|
807
|
+
int i, j;
|
798
808
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
799
809
|
r_mpfr_matrix_suitable_matrix_init (&ret_l, &ptr_ret_l, ptr_self->row, ptr_self->column);
|
800
810
|
r_mpfr_matrix_suitable_matrix_init (&ret_u, &ptr_ret_u, ptr_self->row, ptr_self->column);
|
801
811
|
VALUE ret_indx[ptr_self->row];
|
802
812
|
int indx[ptr_self->row];
|
803
813
|
if(mpfr_square_matrix_lu_decomp (ptr_ret_u, indx, ptr_self) >= 0){
|
804
|
-
int i, j;
|
805
814
|
for(i = 1; i < ptr_ret_u->row; i++){
|
806
815
|
for(j = 0; j < i; j++){
|
807
816
|
mpfr_set(mpfr_matrix_get_element(ptr_ret_l, i, j), mpfr_matrix_get_element(ptr_ret_u, i, j), GMP_RNDN);
|
@@ -829,9 +838,9 @@ static VALUE r_mpfr_square_matrix_lu_decomp (VALUE self)
|
|
829
838
|
static VALUE r_mpfr_square_matrix_determinant (VALUE self)
|
830
839
|
{
|
831
840
|
MPFRMatrix *ptr_self;
|
832
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
833
841
|
MPFR *ptr_ret;
|
834
842
|
VALUE ret;
|
843
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
835
844
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
836
845
|
mpfr_square_matrix_determinant(ptr_ret, ptr_self);
|
837
846
|
return ret;
|
@@ -841,8 +850,8 @@ static VALUE r_mpfr_square_matrix_determinant (VALUE self)
|
|
841
850
|
static VALUE r_mpfr_square_matrix_qr_decomp (VALUE self)
|
842
851
|
{
|
843
852
|
MPFRMatrix *ptr_self, *ptr_q, *ptr_r;
|
844
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
845
853
|
VALUE q, r;
|
854
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
846
855
|
r_mpfr_matrix_suitable_matrix_init (&q, &ptr_q, ptr_self->row, ptr_self->column);
|
847
856
|
r_mpfr_matrix_suitable_matrix_init (&r, &ptr_r, ptr_self->column, ptr_self->column);
|
848
857
|
mpfr_square_matrix_qr_decomp(ptr_q, ptr_r, ptr_self);
|
@@ -872,9 +881,9 @@ static VALUE r_mpfr_vector_dim (VALUE self)
|
|
872
881
|
static VALUE r_mpfr_vector_abs (VALUE self)
|
873
882
|
{
|
874
883
|
MPFRMatrix *ptr_self;
|
875
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
876
884
|
VALUE ret;
|
877
885
|
MPFR *ptr_ret;
|
886
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
878
887
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
879
888
|
mpfr_matrix_vector_norm(ptr_ret, ptr_self);
|
880
889
|
return ret;
|
@@ -884,8 +893,9 @@ static VALUE r_mpfr_vector_abs (VALUE self)
|
|
884
893
|
static VALUE r_mpfr_vector_element (VALUE self, VALUE arg)
|
885
894
|
{
|
886
895
|
MPFRMatrix *ptr_self;
|
896
|
+
int i;
|
887
897
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
888
|
-
|
898
|
+
i = NUM2INT(arg);
|
889
899
|
if (i < ptr_self->size) {
|
890
900
|
VALUE ret;
|
891
901
|
MPFR *ptr_ret;
|
@@ -901,8 +911,9 @@ static VALUE r_mpfr_vector_element (VALUE self, VALUE arg)
|
|
901
911
|
static VALUE r_mpfr_vector_set_element (VALUE self, VALUE arg, VALUE robj)
|
902
912
|
{
|
903
913
|
MPFRMatrix *ptr_self;
|
914
|
+
int i;
|
904
915
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
905
|
-
|
916
|
+
i = NUM2INT(arg);
|
906
917
|
if (i < ptr_self->size) {
|
907
918
|
r_mpfr_set_robj(ptr_self->data + i, robj, GMP_RNDN);
|
908
919
|
}
|
@@ -913,11 +924,12 @@ static VALUE r_mpfr_vector_set_element (VALUE self, VALUE arg, VALUE robj)
|
|
913
924
|
static VALUE r_mpfr_vector_each_element (VALUE self)
|
914
925
|
{
|
915
926
|
MPFRMatrix *ptr_self;
|
916
|
-
|
917
|
-
VALUE ret = Qnil, tmp;
|
927
|
+
VALUE ret, tmp;
|
918
928
|
MPFR *tmp_ptr;
|
919
|
-
r_mpfr_make_struct_init(tmp, tmp_ptr);
|
920
929
|
int i;
|
930
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
931
|
+
ret = Qnil;
|
932
|
+
r_mpfr_make_struct_init(tmp, tmp_ptr);
|
921
933
|
for (i = 0; i < ptr_self->size; i++) {
|
922
934
|
mpfr_set(tmp_ptr, ptr_self->data + i, GMP_RNDN);
|
923
935
|
ret = rb_yield(tmp);
|
@@ -929,11 +941,12 @@ static VALUE r_mpfr_vector_each_element (VALUE self)
|
|
929
941
|
static VALUE r_mpfr_vector_each_element_with_index (VALUE self)
|
930
942
|
{
|
931
943
|
MPFRMatrix *ptr_self;
|
932
|
-
|
933
|
-
VALUE ret = Qnil, tmp;
|
944
|
+
VALUE ret, tmp;
|
934
945
|
MPFR *tmp_ptr;
|
935
|
-
r_mpfr_make_struct_init(tmp, tmp_ptr);
|
936
946
|
int i;
|
947
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
948
|
+
ret = Qnil;
|
949
|
+
r_mpfr_make_struct_init(tmp, tmp_ptr);
|
937
950
|
for (i = 0; i < ptr_self->size; i++) {
|
938
951
|
mpfr_set(tmp_ptr, ptr_self->data + i, GMP_RNDN);
|
939
952
|
ret = rb_yield(rb_ary_new3(2, tmp, INT2NUM(i)));
|
@@ -945,10 +958,10 @@ static VALUE r_mpfr_vector_each_element_with_index (VALUE self)
|
|
945
958
|
static VALUE r_mpfr_vector_distance_from (VALUE self, VALUE arg)
|
946
959
|
{
|
947
960
|
MPFRMatrix *ptr_self, *ptr_arg;
|
948
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
949
|
-
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
950
961
|
VALUE ret;
|
951
962
|
MPFR *ptr_ret;
|
963
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
964
|
+
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
952
965
|
r_mpfr_make_struct_init(ret, ptr_ret);
|
953
966
|
if(ptr_self->size == ptr_arg->size){
|
954
967
|
mpfr_matrix_vector_distance(ptr_ret, ptr_self, ptr_arg);
|
@@ -962,9 +975,9 @@ static VALUE r_mpfr_vector_distance_from (VALUE self, VALUE arg)
|
|
962
975
|
static VALUE r_mpfr_vector_midpoint (VALUE self, VALUE arg)
|
963
976
|
{
|
964
977
|
MPFRMatrix *ptr_self, *ptr_arg, *ptr_ret;
|
978
|
+
VALUE ret;
|
965
979
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
966
980
|
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
967
|
-
VALUE ret;
|
968
981
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
969
982
|
mpfr_vector_midpoint(ptr_ret, ptr_self, ptr_arg);
|
970
983
|
return ret;
|
@@ -974,11 +987,11 @@ static VALUE r_mpfr_vector_midpoint (VALUE self, VALUE arg)
|
|
974
987
|
static VALUE r_mpfr_vector_dividing_point (VALUE self, VALUE arg, VALUE div)
|
975
988
|
{
|
976
989
|
MPFRMatrix *ptr_self, *ptr_arg, *ptr_ret;
|
990
|
+
MPFR *ptr_div;
|
991
|
+
VALUE ret;
|
977
992
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
978
993
|
r_mpfr_get_matrix_struct(ptr_arg, arg);
|
979
|
-
MPFR *ptr_div;
|
980
994
|
r_mpfr_get_struct(ptr_div, div);
|
981
|
-
VALUE ret;
|
982
995
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
983
996
|
mpfr_vector_dividing_point(ptr_ret, ptr_self, ptr_arg, ptr_div);
|
984
997
|
return ret;
|
@@ -988,8 +1001,8 @@ static VALUE r_mpfr_vector_dividing_point (VALUE self, VALUE arg, VALUE div)
|
|
988
1001
|
static VALUE r_mpfr_vector_normalize (VALUE self)
|
989
1002
|
{
|
990
1003
|
MPFRMatrix *ptr_self, *ptr_ret;
|
991
|
-
r_mpfr_get_matrix_struct(ptr_self, self);
|
992
1004
|
VALUE ret;
|
1005
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
993
1006
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
994
1007
|
if(mpfr_vector_normalize(ptr_ret, ptr_self) == 0){
|
995
1008
|
return ret;
|
@@ -1002,8 +1015,9 @@ static VALUE r_mpfr_vector_normalize (VALUE self)
|
|
1002
1015
|
static VALUE r_mpfr_vector_normalize2 (VALUE self)
|
1003
1016
|
{
|
1004
1017
|
MPFRMatrix *ptr_self, tmp;
|
1018
|
+
VALUE ret;
|
1005
1019
|
r_mpfr_get_matrix_struct(ptr_self, self);
|
1006
|
-
|
1020
|
+
ret = self;
|
1007
1021
|
mpfr_matrix_init(&tmp, ptr_self->column, ptr_self->row);
|
1008
1022
|
if(mpfr_vector_normalize(&tmp, ptr_self) == 0){
|
1009
1023
|
mpfr_matrix_set(ptr_self, &tmp);
|
@@ -1018,9 +1032,10 @@ static VALUE r_mpfr_vector_normalize2 (VALUE self)
|
|
1018
1032
|
static VALUE r_mpfr_vector_set_length (VALUE self, VALUE arg)
|
1019
1033
|
{
|
1020
1034
|
MPFRMatrix *ptr_self, *ptr_ret;
|
1021
|
-
|
1022
|
-
VALUE ret, returned_value = Qnil;
|
1035
|
+
VALUE ret, returned_value;
|
1023
1036
|
MPFR *ptr_l;
|
1037
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
1038
|
+
returned_value = Qnil;
|
1024
1039
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
1025
1040
|
if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, arg))){
|
1026
1041
|
r_mpfr_get_struct(ptr_l, arg);
|
@@ -1042,9 +1057,10 @@ static VALUE r_mpfr_vector_set_length (VALUE self, VALUE arg)
|
|
1042
1057
|
static VALUE r_mpfr_vector_set_length2 (VALUE self, VALUE arg)
|
1043
1058
|
{
|
1044
1059
|
MPFRMatrix *ptr_self, *ptr_ret;
|
1045
|
-
|
1046
|
-
VALUE ret, returned_value = Qnil;
|
1060
|
+
VALUE ret, returned_value;
|
1047
1061
|
MPFR *ptr_l;
|
1062
|
+
r_mpfr_get_matrix_struct(ptr_self, self);
|
1063
|
+
returned_value = Qnil;
|
1048
1064
|
r_mpfr_matrix_suitable_matrix_init (&ret, &ptr_ret, ptr_self->row, ptr_self->column);
|
1049
1065
|
if(RTEST(rb_funcall(r_mpfr_class, eqq, 1, arg))){
|
1050
1066
|
r_mpfr_get_struct(ptr_l, arg);
|