Skip to content

A simple C++ templated multiarray class for array computation

Notifications You must be signed in to change notification settings

Cxx-mlr/multiarray

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 
 
 

Repository files navigation

multiarray


#include "multiarray.hpp"

int main() {
  cx::multiarray <int, 2, 3> m = {1, 2, 3, 4, 5, 6};

  std::cout << m; // 1 2 3 4 5 6
  
  int& min = m.min();
  int& max = m.max();
  
  std::cout << min; // 1
  std::cout << max; // 6
}

.....

  • Multidimensional
cx::multiarray <int, M> m_1 = {};
cx::multiarray <int, M, N> m_2 = {};
cx::multiarray <int, M, N, O> m_3 = {};
cx::multiarray <int, M, N, O, P...> m_ = {};

// linear index
m_1[i]
m_2[i]
m_3[i]

// subscript
m_1(i)
m_2(i, j)
m_3(i, j, k)

// index check
m_1.at(i)
m_2.at(i, j)
m_3.at(i, j, k)

.....

  • Arithmetic
cx::multiarray <int, 2, 3> m = {};

m *= value;
m /= value;
m %= value;
m += value;
m -= value;
m ^= value;
m |= value;
m &= value;
m <<= value;
m >>= value;

m * value;
m / value;
m % value;
m + value;
m - value;
m ^ value;
m | value;
m & value;
m << value;
m >> value;

m *= m;
m /= m;
m %= m;
m += m;
m -= m;
m ^= m;
m |= m;
m &= m;
m <<= m;
m >>= m;

m * m;
m / m;
m % m;
m + m;
m - m;
m ^ m;
m | m;
m & m;
m << m;
m >> m;
#include "multiarray.hpp"

int main() {
   cx::multiarray <int, 2, 3, 4> m =
      {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24};

   for (std::size_t i = 0; i < 24; ++i) {
      auto subscript = m.to_subscript(i);
   
      int &x = m(subscript);
      int &y = m[i];
      int &z = m.at(subscript);
   }
   
   for (std::size_t i = 0; i < 2; ++i) {
      for (std::size_t j = 0; j < 3; ++j) {
         for (std::size_t k = 0; k < 4; ++k) {
            std::size_t linear_index = m.to_linear_index(i, j, k);
            
            int &x = m(i, j, k);
            int &y = m[linear_index];
            int &z = m.at(i, j, k);
         }
      }
   }
   
   for (std::size_t i = 0; i < 100; ++i) {
      if (m.index_out_of_bounds(m.to_subscript(i))) {
         break;
      }
      
      std::cout << m[i] << ' '; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
   }
}

.....

  • Iterator
cx::multiarray <int, 2, 3> m = {};

m.begin();
m.end();
m.cbegin();
m.cend();
m.rbegin();
m.rend();
m.crbegin();
m.crend();

std::copy(m.begin(), m.end(), std::ostream_iterator <int>(std::cout, " ")); // 0 0 0 0 0 0

.....

cx::multiarray <std::string, 2, 3> m1 = {};
cx::multiarray <std::string, 2, 3> m2 = {};

m2.fill("X");

m1.swap(m2);

std::cout << m1; // X X X X X X

.....

  • Customization
#include <iostream>
#include "multiarray.hpp"

template <class t, std::size_t m, std::size_t n>
using matrix = cx::multiarray <t, m, n>;

int main() {
   matrix <int, 2, 3> m = {1, 2, 3, 4, 5, 6};
   
   for (std::size_t r = 0; r < 2; ++r) {
      for (std::size_t c = 0; c < 3; ++c) {
         std::size_t index =
             m.to_linear_index(r, c);
             
         std::cout << index << ' '; // 0 1 2 3 4 5
      }
   }
}
#include <iostream>
#include "multiarray.hpp"

template <class t, std::size_t m, std::size_t n>
struct matrix : cx::multiarray <t, m, n> {
   constexpr std::size_t rsize() {
      return m;
   }
   
   constexpr std::size_t csize() {
      return n;
   }
};

int main() {
   matrix <int, 3, 2> m = {1, 2, 3, 4, 5, 6};
   
   for (std::size_t r = 0; r < m.rsize(); ++r) {
      for (std::size_t c = 0; c < m.csize(); ++c) {
         std::size_t index =
             m.to_linear_index(r, c);
             
         std::cout << index << ' '; // 0 1 2 3 4 5
      }
   }
   
   puts("\n");
   
   for (std::size_t index = 0; index < m.rsize() * m.csize(); ++index) {
      auto subscript =
          m.to_subscript(index);
          
      std::size_t r = std::get <0>(subscript);
      std::size_t c = std::get <1>(subscript);
      
      std::cout << r << ' ' << c << std::endl;
      /*
          0 0
          0 1
          1 0
          1 1
          2 0
          2 1
          
          std::cout << m(subscript) << ' '; 1 2 3 4 5 6
      */
   }
}

About

A simple C++ templated multiarray class for array computation

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Languages