90 lines
3.1 KiB
C++
90 lines
3.1 KiB
C++
//
|
|
// Copyright (c) 2018-2019, Cem Bassoy, cem.bassoy@gmail.com
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE_1_0.txt or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
// The authors gratefully acknowledge the support of
|
|
// Fraunhofer IOSB, Ettlingen, Germany
|
|
//
|
|
|
|
#include <boost/numeric/ublas/tensor.hpp>
|
|
#include <boost/multiprecision/cpp_bin_float.hpp>
|
|
|
|
#include <ostream>
|
|
|
|
int main()
|
|
{
|
|
using namespace boost::numeric::ublas;
|
|
using namespace boost::multiprecision;
|
|
|
|
|
|
// creates a three-dimensional tensor with extents 3,4 and 2
|
|
// tensor A stores single-precision floating-point number according
|
|
// to the first-order storage format
|
|
using ftype = float;
|
|
auto A = tensor<ftype>{3,4,2};
|
|
|
|
// initializes the tensor with increasing values along the first-index
|
|
// using a single index.
|
|
auto vf = ftype(0);
|
|
for(auto i = 0u; i < A.size(); ++i, vf += ftype(1))
|
|
A[i] = vf;
|
|
|
|
// formatted output
|
|
std::cout << "% --------------------------- " << std::endl;
|
|
std::cout << "% --------------------------- " << std::endl << std::endl;
|
|
std::cout << "A=" << A << ";" << std::endl << std::endl;
|
|
|
|
// creates a four-dimensional tensor with extents 5,4,3 and 2
|
|
// tensor A stores complex floating-point extended double precision numbers
|
|
// according to the last-order storage format
|
|
// and initializes it with the default value.
|
|
using ctype = std::complex<cpp_bin_float_double_extended>;
|
|
auto B = tensor<ctype,last_order>(shape{5,4,3,2},ctype{});
|
|
|
|
// initializes the tensor with increasing values along the last-index
|
|
// using a single-index
|
|
auto vc = ctype(0,0);
|
|
for(auto i = 0u; i < B.size(); ++i, vc += ctype(1,1))
|
|
B[i] = vc;
|
|
|
|
// formatted output
|
|
std::cout << "% --------------------------- " << std::endl;
|
|
std::cout << "% --------------------------- " << std::endl << std::endl;
|
|
std::cout << "B=" << B << ";" << std::endl << std::endl;
|
|
|
|
|
|
|
|
auto C = tensor<ctype,last_order>(B.extents());
|
|
// computes the complex conjugate of elements of B
|
|
// using multi-index notation.
|
|
for(auto i = 0u; i < B.size(0); ++i)
|
|
for(auto j = 0u; j < B.size(1); ++j)
|
|
for(auto k = 0u; k < B.size(2); ++k)
|
|
for(auto l = 0u; l < B.size(3); ++l)
|
|
C.at(i,j,k,l) = std::conj(B.at(i,j,k,l));
|
|
|
|
std::cout << "% --------------------------- " << std::endl;
|
|
std::cout << "% --------------------------- " << std::endl << std::endl;
|
|
std::cout << "C=" << C << ";" << std::endl << std::endl;
|
|
|
|
|
|
// computes the complex conjugate of elements of B
|
|
// using iterators.
|
|
auto D = tensor<ctype,last_order>(B.extents());
|
|
std::transform(B.begin(), B.end(), D.begin(), [](auto const& b){ return std::conj(b); });
|
|
std::cout << "% --------------------------- " << std::endl;
|
|
std::cout << "% --------------------------- " << std::endl << std::endl;
|
|
std::cout << "D=" << D << ";" << std::endl << std::endl;
|
|
|
|
// reshaping tensors.
|
|
auto new_extents = B.extents().base();
|
|
std::next_permutation( new_extents.begin(), new_extents.end() );
|
|
D.reshape( shape(new_extents) );
|
|
std::cout << "% --------------------------- " << std::endl;
|
|
std::cout << "% --------------------------- " << std::endl << std::endl;
|
|
std::cout << "newD=" << D << ";" << std::endl << std::endl;
|
|
}
|