37 using std::runtime_error;
50 cout <<
"v.nelem() = " << v.
nelem() <<
"\n";
54 cout <<
"v.begin() = " << *v.
begin() <<
"\n";
56 cout <<
"v = \n" << v <<
"\n";
63 cout <<
"v2 = \n" << v2 <<
"\n";
74 cout <<
"v = \n" << v <<
"\n";
75 cout <<
"v2 = \n" << v2 <<
"\n";
76 cout <<
"v2.nelem() = \n" << v2.nelem() <<
"\n";
82 cout <<
"\nv3 = \n" << v3 <<
"\n";
84 cout <<
"\nv3 after junking v2 = \n" << v3 <<
"\n";
86 cout <<
"\nv3 after *2 = \n" << v3 <<
"\n";
95 cout <<
"\nM =\n" << M <<
"\n";
97 cout <<
"\nM(Range(2,4),Range(2,4)) =\n" 100 cout <<
"\nM(Range(2,4),Range(2,4))(Range(1,2),Range(1,2)) =\n" 103 cout <<
"\nM(1,Range(joker)) =\n" <<
M(1,
Range(
joker)) <<
"\n";
105 cout <<
"\nFilling M(1,Range(1,2)) with junk.\n";
108 cout <<
"\nM(Range(0,4),Range(0,4)) =\n" 111 cout <<
"\nFilling M(Range(4,2,2),Range(6,3)) with junk.\n";
116 cout <<
"\nM =\n" << M <<
"\n";
120 cout <<
"\nC(Range(3,4,2),Range(2,3,3)) =\n" 123 cout <<
"\nC(Range(3,4,2),Range(2,3,3)).transpose() =\n" 132 cout <<
"v.nelem() = " << v.
nelem() <<
"\n";
150 cout <<
"a = \n" << a <<
"\n";
151 cout <<
"b = \n" << b <<
"\n";
152 cout <<
"a*b \n= " << a * b <<
"\n";
164 cout <<
"\nB*C =\n" << A <<
"\n";
176 cout <<
"b = \n" << b <<
"\n";
177 cout <<
"M =\n" << M <<
"\n";
180 cout <<
"\na = M*b = \n" << a <<
"\n";
193 cout <<
"Transforming.\n";
199 transform(y, sin, static_cast<MatrixView>(x));
211 cout <<
"min(sin(x)), max(sin(x)) = " <<
min(y) <<
", " <<
max(y) <<
"\n";
225 cout <<
"B = " << B <<
"\n";
235 cout <<
"M = " << M <<
"\n";
246 cout <<
"M = " << M <<
"\n";
259 cout <<
"sb = \n" << sb <<
"\n";
263 cout <<
"sc = \n" << sc <<
"\n";
273 cout <<
"M = \n" << M <<
"\n";
280 Array<Numeric> c{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
281 cout <<
"a = \n" << a <<
"\n";
282 cout <<
"b = \n" << b <<
"\n";
283 cout <<
"c = \n" << c <<
"\n";
288 String a =
"Nur ein Test.";
289 cout <<
"a = " << a <<
"\n";
291 cout <<
"b = " << b <<
"\n";
311 cout <<
"a.sum() = " << a.
sum() <<
"\n";
318 cout <<
"a *= a =\n" << a <<
"\n";
328 cout <<
"a =\n" << a <<
"\n";
329 cout <<
"b =\n" << b <<
"\n";
334 Vector a{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
335 cout <<
"a =\n" << a <<
"\n";
341 cout <<
"By reference:\n";
346 cout <<
"s = " << s <<
"\n";
352 cout <<
"By value:\n";
357 cout <<
"s = " << s <<
"\n";
363 cout <<
"a =\n" << a <<
"\n";
365 cout <<
"b =\n" << b <<
"\n";
373 cout <<
"a*=b =\n" << a <<
"\n";
375 cout <<
"a/=b =\n" << a <<
"\n";
377 cout <<
"a+=b =\n" << a <<
"\n";
379 cout <<
"a-=b =\n" << a <<
"\n";
384 Array<Index> a{1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1};
385 cout <<
"min/max of a = " <<
min(a) <<
"/" <<
max(a) <<
"\n";
389 cout <<
"Test filling constructor for Array:\n";
391 cout <<
"a =\n" << a <<
"\n";
395 cout <<
"Test Arrays of Vectors:\n";
397 a.push_back({1.0, 2.0});
398 a.push_back(
Vector(1.0, 10, 1.0));
399 cout <<
"a =\n" << a <<
"\n";
403 cout <<
"Test default constructor for Matrix:\n";
406 cout <<
"b =\n" << b <<
"\n";
410 cout <<
"Test Arrays of Matrix:\n";
430 cout <<
"a =\n" << a <<
"\n";
434 cout <<
"Test Matrices of size 0:\n";
439 cout <<
"a =\n" << a <<
"\n";
445 cout <<
"b =\n" << b <<
"\n";
451 cout <<
"c =\n" << c <<
"\n";
455 cout <<
"Test Tensor3:\n";
466 cout <<
"a =\n" << a <<
"\n";
468 cout <<
"Taking out first row of first page:\n" 471 cout <<
"Taking out last column of second page:\n" 474 cout <<
"Taking out the first letter on every page:\n" 477 cout <<
"Taking out first page:\n" 480 cout <<
"Taking out last row of all pages:\n" 483 cout <<
"Taking out second column of all pages:\n" 488 cout <<
"After element-vise multiplication with 2:\n" << a <<
"\n";
492 cout <<
"After taking the square-root:\n" << a <<
"\n";
495 cout <<
"Let's allocate a large tensor, " 496 << (
Numeric)(s * s * s * 8) / 1024. / 1024. <<
" MB...\n";
500 cout <<
"Set it to 1...\n";
504 cout <<
"a(900,900,900) = " << a(90, 90, 90) <<
"\n";
508 cout <<
"Fill with running numbers, using for loops...\n";
509 for (
Index i = 0;
i < a.npages(); ++
i)
510 for (
Index j = 0; j < a.nrows(); ++j)
511 for (
Index k = 0; k < a.ncols(); ++k) a(
i, j, k) = (
Numeric)(++fill);
513 cout <<
"Max(a) = ...\n";
515 cout <<
max(a) <<
"\n";
519 cout <<
"Test von X = A*X:\n";
520 Matrix X(3, 3), A(3, 3), B(3, 3);
522 for (
Index j = 0; j < A.nrows(); ++j)
523 for (
Index k = 0; k < A.ncols(); ++k) {
527 cout <<
"A:\n" << A <<
"\n";
528 cout <<
"X:\n" << X <<
"\n";
531 cout <<
"B = A*X:\n" << B <<
"\n";
533 cout <<
"X = A*X:\n" << X <<
"\n";
535 cout <<
"This is not the same, and should not be, because you\n" 536 <<
"are not allowed to use the same matrix as input and output\n" 541 cout <<
"Making things look bigger than they are...\n";
544 cout <<
"1. Make a scalar look like a vector:\n";
547 cout <<
"a, viewed as a vector: " << av <<
"\n";
548 cout <<
"Describe a: " <<
describe(a) <<
"\n";
550 cout <<
"a, after the first element\n" 551 <<
"of the vector has been increased by 1: " << a <<
"\n";
556 <<
"\n2. Make a vector look like a matrix:\n" 557 <<
"This is an exception, because the new dimension is added at the end.\n";
560 cout <<
"a, viewed as a matrix:\n" << am <<
"\n";
561 cout <<
"Trasnpose view:\n" <<
transpose(am) <<
"\n";
564 cout <<
"\n3. Make a matrix look like a tensor3:\n";
566 cout <<
"at3 = \n" << at3 <<
"\n";
567 cout <<
"Describe at3: " <<
describe(at3) <<
"\n";
569 cout <<
"a after Increasing element at3(0,2,0) by 1: \n" << a <<
"\n\n";
572 cout <<
"at4 = \n" << at4 <<
"\n";
573 cout <<
"Describe at4: " <<
describe(at4) <<
"\n";
576 cout <<
"at5 = \n" << at5 <<
"\n";
577 cout <<
"Describe at5: " <<
describe(at5) <<
"\n";
580 cout <<
"at6 = \n" << at6 <<
"\n";
581 cout <<
"Describe at6: " <<
describe(at6) <<
"\n";
584 cout <<
"at7 = \n" << at7 <<
"\n";
585 cout <<
"Describe at7: " <<
describe(at7) <<
"\n";
587 at7(0, 0, 0, 0, 0, 2, 0) -= 1;
589 cout <<
"After subtracting 1 from at7(0,0,0,0,0,2,0)\n" 590 <<
"a = " << a <<
"\n";
592 cout <<
"\nAll in one go:\n";
596 cout <<
"bt7:\n" << bt7 <<
"\n";
597 cout <<
"Describe bt7: " <<
describe(bt7) <<
"\n";
606 cout <<
"Test, if dimension expansion works implicitly.\n";
616 cout <<
"Test the new copy semantics.\n";
621 cout <<
"b = " << b <<
"\n";
626 cout <<
"b = " << b <<
"\n";
631 cout <<
"b = " << b <<
"\n";
635 cout <<
"Test using naked joker on Vector.\n";
638 cout <<
"a = " << a <<
"\n";
639 cout <<
"b = " << b <<
"\n";
643 Vector v1(5e-15, 10, 0.42e-15 / 11);
664 cout << endl <<
"========================" << endl << endl;
672 cout << endl <<
"========================" << endl << endl;
707 cout <<
"Vector: " << v1 << endl;
708 cout <<
"VectorView: " << vv << endl;
712 }
catch (
const std::runtime_error& e) {
713 std::cerr << e.what() << endl;
717 cout <<
"VectorView: " << vv << endl;
718 cout <<
"Vector: " << v1 << endl;
726 Vector x{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
727 cout <<
"x: " << x << endl;
730 cout <<
"y: " << y << endl;
733 cout <<
"z:\n" << z << endl;
735 cout <<
"Every other z:\n" << z(
Range(1, 2, 2),
joker) << endl;
740 cout <<
"zz:\n" << zz << endl;
741 cout <<
"New x: " << x << endl;
753 throw std::logic_error(
"Fail to initialize");;
761 static_assert(r.Nom() == 3,
"Rational fail to initialize properly");
762 static_assert(r.Denom() == 2,
"Rational fail to initialize properly");
766 static_assert(r2.Nom() == 5,
"Rational fail to initialize properly");
767 static_assert(r2.Denom() == 2,
"Rational fail to initialize properly");
771 static_assert(r3.Nom() == 0,
"Rational fail to initialize properly");
772 static_assert(r3.Denom() == 0,
"Rational fail to initialize properly");
773 static_assert(r3 not_eq r3,
"Rational fail to initialize properly");
774 static_assert(r3.isUndefined(),
"Rational fail to initialize properly");
778 static_assert(r4.Nom() == 0,
"Rational fail to initialize properly");
779 static_assert(r4.Denom() == 1,
"Rational fail to initialize properly");
783 static_assert(r5.Nom() == 1,
"Rational fail to initialize properly");
784 static_assert(r5.Denom() == 6,
"Rational fail to initialize properly");
788 static_assert(r6.Nom() == 1,
"Rational fail to initialize properly");
789 static_assert(r6.Denom() == 1,
"Rational fail to initialize properly");
790 static_assert(r6.toInt() == 1,
"Rational fail to initialize properly");
791 static_assert(r6.toIndex() == 1,
"Rational fail to initialize properly");
792 static_assert(r6.toNumeric() == 1e0,
"Rational fail to initialize properly");
794 constexpr
Index rattest=1<<8;
796 static_assert(r7 == 2,
"Rational fail to initialize properly");
800 #define docheck(fn, val, expect) \ 801 cout << #fn << "(" << val << ") = " << fn(x) << " (expected " << #expect \ 839 auto compare_func = [](
Numeric n) {
return n != 0; };
840 cout << std::any_of(v1.
begin(), v1.
end(), compare_func) << endl;
842 cout << std::any_of(v1.begin(), v1.end(), compare_func) << endl;
861 for (
Index i = 0;
i < ntests;
i++) {
877 for (
Index j = 0; j < n_diag; j++) {
878 pass = pass && (v[j] == A(j, j));
879 pass = pass && (vt[j] == AT(j, j));
881 if (j < vb.nelem()) pass = pass && (vb[j] == B(j, j));
887 cout <<
"test diagonal: Passed all tests." << endl;
889 cout <<
"test diagonal: Failed." << endl;
897 Vector x(n), xt, x_ref(n), y(m), y_ref(m);
902 for (
Index i = 0;
i < ntests;
i++) {
912 if (err_mul > max_err) max_err = err_mul;
915 cout <<
"\t A * x: max. rel. error = " << err_mul << endl;
924 if (err_mul > max_err) max_err = err_mul;
927 cout <<
"\t A^T * x: max. rel. error = " << err_mul << endl;
931 Index column_stride(random_column_stride()),
932 row_stride(random_row_stride());
935 m_sub = (m - 1) / row_stride + 1;
936 n_sub = (n - 1) / column_stride + 1;
948 if (err_mul > max_err) max_err = err_mul;
951 cout <<
"\t Random stride: max. rel. error = " << err_mul << endl << endl;
955 if ((m > 1) && (n > 1)) {
956 Index y_offset = rand() % (m - 1);
957 Index x_offset = rand() % (n - 1);
959 m_sub = m - y_offset - 1;
960 n_sub = n - x_offset - 1;
963 A(
Range(y_offset, m_sub),
Range(x_offset, n_sub)),
964 x[
Range(x_offset, n_sub)]);
966 A(
Range(y_offset, m_sub),
Range(x_offset, n_sub)),
967 x[
Range(x_offset, n_sub)]);
970 y[
Range(y_offset, m_sub)], y_ref[
Range(y_offset, m_sub)],
true);
971 if (err_mul > max_err) max_err = err_mul;
974 cout <<
"\t Random offset: max. rel. error = " << err_mul << endl
987 cout <<
"Matrix-Vector Multiplication: n = m = 100, ntests = 100" << endl;
992 cout <<
"Matrix-Vector Multiplication: n = 100, m = 20, ntests = 100" 997 if (err > max_err) max_err = err;
1000 cout <<
"Matrix-Vector Multiplication: n = 20, m = 100, ntests = 100" 1005 if (err > max_err) max_err = err;
1008 cout << endl <<
"Matrix Vector Multiplication: PASSED" << endl;
1010 cout << endl <<
"Matrix Vector Multiplication: FAILED" << endl;
1014 if (err > max_err) max_err = err;
1017 cout <<
"Matrix-Vector Multiplication: n = 20, m = 100, ntests = 100" 1022 if (err > max_err) max_err = err;
1025 cout <<
"Matrix-Vector Multiplication: n = 20, m = 100, ntests = 100" 1031 cout << endl <<
"Matrix Vector Multiplication: PASSED" << endl;
1033 cout << endl <<
"Matrix Vector Multiplication: FAILED" << endl;
1061 Matrix A(m, k), B(k, n),
C(m, n), C_ref(m, n);
1063 for (
Index i = 0;
i < ntests;
i++) {
1069 cout <<
"MATRIX MULTIPLICATION: m = " << m <<
", k = " << k;
1070 cout <<
", n = " << n << endl;
1082 if (err_mul > max_err) max_err = err_mul;
1086 <<
"A * B: max. rel. error = " << err_mul << endl;
1097 if (err_trans1 > max_err) max_err = err_trans1;
1101 <<
"A^T * B: max. rel. err = " << err_trans1 << endl;
1112 if (err_trans2 > max_err) max_err = err_trans2;
1116 <<
"A * B^T: max. rel. err = " << err_trans2 << endl;
1124 if (err_trans3 > max_err) max_err = err_trans3;
1128 <<
"A^T * B^T: max. rel. err = " << err_trans3 << endl;
1134 Rand<Index> k_rand(1, k - 1), m_rand(1, m - 1), n_rand(1, n - 1);
1136 for (
Index i = 0;
i < nsubtests - 1;
i++) {
1137 Index k1(k_rand()), m1(m_rand()), n1(n_rand());
1149 mult(C_sub, A_sub, B_sub);
1153 if (err > max_err) max_err = err;
1157 <<
"Submatrix multiplication: max. rel. err = " << err;
1189 if (err > max_err) max_err = err;
1193 if (err > max_err) max_err = err;
1197 if (err > max_err) max_err = err;
1201 if (err > max_err) max_err = err;
1204 err =
matrix_mult(200, 200, 200, 20, 20, verbose);
1205 if (err > max_err) max_err = err;
1209 if (err > max_err) max_err = err;
1213 if (err > max_err) max_err = err;
1216 err =
matrix_mult(100, 100, 100, 0, 100, verbose);
1217 if (err > max_err) max_err = err;
1225 cout <<
"Array" << endl;
1228 cout << v.empty() << endl;
1230 cout << v.empty() << endl;
1233 cout <<
"Vector" << endl;
1236 cout << v.
empty() << endl;
1238 cout << v.
empty() << endl;
1241 cout <<
"Matrix" << endl;
1244 cout << v.
empty() << endl;
1246 cout << v.
empty() << endl;
1248 cout << v.
empty() << endl;
1251 cout <<
"Tensor3" << endl;
1254 cout << v.
empty() << endl;
1256 cout << v.
empty() << endl;
1258 cout << v.
empty() << endl;
1260 cout << v.
empty() << endl;
1263 cout <<
"Tensor4" << endl;
1266 cout << v.
empty() << endl;
1268 cout << v.
empty() << endl;
1270 cout << v.
empty() << endl;
1272 cout << v.
empty() << endl;
1274 cout << v.
empty() << endl;
1277 cout <<
"Tensor5" << endl;
1280 cout << v.
empty() << endl;
1282 cout << v.
empty() << endl;
1284 cout << v.
empty() << endl;
1286 cout << v.
empty() << endl;
1288 cout << v.
empty() << endl;
1290 cout << v.
empty() << endl;
1293 cout <<
"Tensor6" << endl;
1295 v.
resize(0, 1, 1, 1, 1, 1);
1296 cout << v.
empty() << endl;
1297 v.
resize(1, 0, 1, 1, 1, 1);
1298 cout << v.
empty() << endl;
1299 v.
resize(1, 1, 0, 1, 1, 1);
1300 cout << v.
empty() << endl;
1301 v.
resize(1, 1, 1, 0, 1, 1);
1302 cout << v.
empty() << endl;
1303 v.
resize(1, 1, 1, 1, 0, 1);
1304 cout << v.
empty() << endl;
1305 v.
resize(1, 1, 1, 1, 1, 0);
1306 cout << v.
empty() << endl;
1307 v.
resize(1, 1, 1, 1, 1, 1);
1308 cout << v.
empty() << endl;
1311 cout <<
"Tensor7" << endl;
1313 v.
resize(0, 1, 1, 1, 1, 1, 1);
1314 cout << v.
empty() << endl;
1315 v.
resize(1, 0, 1, 1, 1, 1, 1);
1316 cout << v.
empty() << endl;
1317 v.
resize(1, 1, 0, 1, 1, 1, 1);
1318 cout << v.
empty() << endl;
1319 v.
resize(1, 1, 1, 0, 1, 1, 1);
1320 cout << v.
empty() << endl;
1321 v.
resize(1, 1, 1, 1, 0, 1, 1);
1322 cout << v.
empty() << endl;
1323 v.
resize(1, 1, 1, 1, 1, 0, 1);
1324 cout << v.
empty() << endl;
1325 v.
resize(1, 1, 1, 1, 1, 1, 0);
1326 cout << v.
empty() << endl;
1327 v.
resize(1, 1, 1, 1, 1, 1, 1);
1328 cout << v.
empty() << endl;
1339 for (
Index i = 0;
i < n - 1;
i++) x[
i] = start + (
double)
i * step;
1351 std::cout <<
"vv.nelem: " << vv.
nelem() << std::endl;
1352 std::cout <<
"mv.nrows: " << mv.
nrows() <<
" ";
1353 std::cout <<
"mv.ncols: " << mv.
ncols() << std::endl;
1357 std::cout <<
"mv2.nrows: " << mv2.
nrows() <<
" ";
1358 std::cout <<
"mv2.ncols: " << mv2.
ncols() << std::endl;
INDEX Index
The type to use for all integer numbers and indices.
Utility functions for testing.
Range random_range(Index n)
Generate random sub-range of the range [0, n-1].
void junk2(ConstVectorView a)
Numeric matrix_vector_mult(Index m, Index n, Index ntests, bool verbose)
bool empty() const
Check if variable is empty.
Index nelem() const
Number of elements.
void resize(Index s, Index b, Index p, Index r, Index c)
Resize function.
bool empty() const
Returns true if variable size is zero.
bool test_diagonal(Index ntests)
Test diagonal vector.
ConstVectorView diagonal() const
Matrix diagonal as vector.
String describe(ConstTensor7View x)
Describe Tensor7.
const Numeric * get_c_array() const
Conversion to plain C-array.
Header file for describe.cc.
bool is_increasing(ConstVectorView x)
Checks if a vector is sorted and strictly increasing.
bool empty() const
Check if variable is empty.
bool empty() const
Returns true if variable size is zero.
invlib::Vector< ArtsVector > Vector
invlib wrapper type for ARTS vectors.
bool empty() const
Check if variable is empty.
void fill_with_junk(VectorView x)
Index nrows() const
Returns the number of rows.
Numeric matrix_mult(Index k, Index m, Index n, Index ntests, Index nsubtests, bool verbose)
Perform matrix multiplication test.
void random_fill_vector(VectorView v, Numeric range, bool positive)
Fill vector with random values.
Wigner symbol interactions.
Index nelem() const
Returns the number of elements.
Numeric test_matrix_multiplication(bool verbose)
Perform matrix multiplication tests.
void test_empty()
Check if the empty function is working correctly.
This file contains the definition of Array.
Iterator1D begin()
Return iterator to first element.
Index ncols() const
Returns the number of columns.
Iterator1D end()
Return iterator behind last element.
const Numeric * get_c_array() const
Conversion to plain C-array, const-version.
Numeric by_value(Numeric x)
void mult_general(VectorView y, const ConstMatrixView &M, const ConstVectorView &x)
Matrix Vector multiplication.
constexpr Rational test_numeric2rational(const Index i, const Index maxi, const Rational r=0_rat, const Rational n2r=0_rat)
Header file for sparse matrices.
void random_fill_matrix(MatrixView A, Numeric range, bool positive)
Fill matrix with random values.
bool is_sorted(ConstVectorView x)
Checks if a vector is sorted in ascending order.
Index ncols() const
Returns the number of columns.
Numeric by_reference(const Numeric &x)
Numeric sum() const
The sum of all elements of a Vector.
void junk4(Tensor4View a)
Implements rational numbers to work with other ARTS types.
The declarations of all the exception classes.
NUMERIC Numeric
The type to use for all floating point numbers.
#define docheck(fn, val, expect)
void resize(Index p, Index r, Index c)
Resize function.
void mult(ComplexVectorView y, const ConstComplexMatrixView &M, const ConstComplexVectorView &x)
Matrix-Vector Multiplication.
Header file for logic.cc.
Index npages() const
Returns the number of pages.
ConstComplexMatrixView transpose(ConstComplexMatrixView m)
Const version of transpose.
bool empty() const
Check if variable is empty.
void resize(Index n)
Resize function.
bool empty() const
Check if variable is empty.
A constant view of a Vector.
constexpr Rational numeric2rational(Numeric x, size_t maxdec=4)
Rational from Numeric.
void test37(const Index &i)
constexpr Rational start(Rational Ju, Rational Jl, Polarization type) noexcept
Gives the lowest M for a polarization type of this transition.
Contains the rational class definition.
A constant view of a Matrix.
Numeric test_matrix_vector_multiplication(bool verbose)
void resize(Index v, Index s, Index b, Index p, Index r, Index c)
Resize function.
void transform(VectorView y, double(&my_func)(double), ConstVectorView x)
A generic transform function for vectors, which can be used to implement mathematical functions opera...
Numeric get_maximum_error(ConstVectorView v1, ConstVectorView v2, bool relative)
Maximum element-wise error of two vectors.
bool is_decreasing(ConstVectorView x)
Checks if a vector is sorted in reversed order and is strictly decreasing.
const Numeric * get_c_array() const
Conversion to plain C-array.
void nlinspace(Vector &x, const Numeric start, const Numeric stop, const Index n)
nlinspace
void resize(Index l, Index v, Index s, Index b, Index p, Index r, Index c)
Resize function.
Index nrows() const
Returns the number of rows.
void resize(Index b, Index p, Index r, Index c)
Resize function.
This file contains the definition of String, the ARTS string class.
Numeric sqrt(const Rational r)
Square root.
void resize(Index r, Index c)
Resize function.