/matrix_cxx

this is the same as f03_exercise, but with C++.

Primary LanguageC++

this is the same as f03_exercise, but with C++.
like the following can be performed.

    Matrix A(size), B(size), C(size);
    A.set(-1.0, 1.0, 5555);
    B.set(-2.0, 2.0, 7777);

    A = A.transpose();
    B = B.transpose();
    C = 0.0;

    std::cout << "A:\n";
    A.show();
    std::cout << "B:\n";
    B.show();
    C += A;
    C -= A;
    std::cout << "C: \n";
    C.show();
    C = A*B;
    std::cout << "C = A*B\n";
    C.show();

    C /= B; // C = C * B^-1
    std::cout << "C /= B(= A)\n";
    C.show();
    if (C == A)
        std::cout << "C == A\n";
    if (A != B)
        std::cout << "A != B\n";

    Matrix Ainv = A.inverse();
    std::cout << "Ainv = A^-1\n";
    Ainv.show();


$ make
$ ./a.out
A:
   6.71751e-01   -5.11412e-01    5.03268e-01   -5.15220e-01
  -1.42823e-01   -4.56335e-01    1.01004e-01   -7.82845e-01
  -7.78005e-01    9.79638e-01    7.61025e-01   -6.15416e-01
  -8.88567e-01   -5.99848e-01    3.96229e-01   -8.35100e-01

B:
   0.00000e+00   -1.32831e-01   -3.12948e-01    1.46513e+00
  -1.44351e+00    0.00000e+00    1.67454e-01   -1.87368e+00
   1.24615e-01   -1.73444e+00    0.00000e+00    1.59954e-03
  -7.00869e-01   -3.26451e-01    1.82880e+00    0.00000e+00

C:
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00

C = A*B
   1.16204e+00   -7.93924e-01   -1.23809e+00    1.94323e+00
   1.21998e+00    9.93457e-02   -1.46338e+00    6.45931e-01
  -8.87953e-01   -1.01571e+00   -7.17952e-01   -2.97419e+00
   1.50056e+00   -2.96589e-01   -1.34960e+00   -1.77311e-01

C /= B(= A)
   6.71751e-01   -5.11412e-01    5.03268e-01   -5.15220e-01
  -1.42823e-01   -4.56335e-01    1.01004e-01   -7.82845e-01
  -7.78005e-01    9.79638e-01    7.61025e-01   -6.15416e-01
  -8.88567e-01   -5.99848e-01    3.96229e-01   -8.35100e-01

C == A
maximum error is: 2.71408e+00
A != B

Ainv = A^-1
   5.24346e-01    5.24421e-01    1.30336e-02   -8.24710e-01
  -3.50690e-01    7.29534e-01    6.14144e-01   -9.20109e-01
   1.20070e+00   -2.07358e+00    2.73936e-01    1.00117e+00
   2.63679e-01   -2.06586e+00   -3.25030e-01    8.15982e-01

A*Ainv (should equal to unit matrix)
   1.00000e+00   -2.22045e-16    5.55112e-17    2.77556e-16
   2.77556e-17    1.00000e+00    0.00000e+00    0.00000e+00
   8.32667e-17    2.22045e-16    1.00000e+00    0.00000e+00
   5.55112e-17    0.00000e+00    0.00000e+00    1.00000e+00

tr(A)                                  = 1.41341e-01
det(A)                                 = 6.91491e-01
det(Ainv)                              = 1.44615e+00
det(A)*det(Ainv) (should equal to one) = 1.00000e+00

trivial test: C = C - C (=0)
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00
   0.00000e+00    0.00000e+00    0.00000e+00    0.00000e+00

C == 0.0
maximum error is: 2.00000e+00
D != 2.0

performance comparison of C = A/B between Fortran 2003 vs C++:
matrix size: 1024x1024
compiler: intel compiler 2018u0
time measurement function: C++: std::chrono::system_clock::now(), Fortran 2003: system_clock()

-- Fortran 2003 --
$ OMP_NUM_THREADS=16 KMP_AFFINITY=compact ./a.out 1024
 size:        1024
 time[s]:   9.99890000000000

-- C++ --
$ OMP_NUM_THREADS=16 KMP_AFFINITY=compact ./a.out 1024
size: 1024
 time[s]: 9.08929