Main Page

From LibMIA Wiki
Revision as of 22:14, 26 April 2012 by Extragoya (Talk | contribs)

Jump to: navigation, search


Welcome to LibMIA.

LibMIA is a software library designed to make manipulation of multi-indexed arrays (MIAs) easy. Technical computing packages, such as MATLAB, GNU Octave, and SciPy, support matrix algebra, making code look remarkably similar to what a scientist or practitioner would write on paper. However, matrices are not well-suited to work with and operate on MIAs, such as those found in digital imagery. What's needed is a formalism and supporting software designed for MIAs.

MIA Formalism

If you're familiar with Einstein notation, then you already know much of MIA formalism. The biggest difference is the use of only one index type. There are other important differences.

An inner product, <math>c</math>, between two arrays <math>a_{i}</math> and <math>b_{i}</math>, each of dimension <math>n</math>, is the summation of the products of all corresponding elements:

   c=\sum_{i=1}^{n}a_{i}b_{i} \textrm{.} 

\end{align}</math> Index notation uses a repeated index to represent an inner product, where the dimensionality is understood from the context:

   c=a_{i}b_{i} \textrm{.} 

\end{align}</math> Index notation also provides a concise convention for outer products. An outer product, <math>c_{ij}</math>, of <math>a_{i}</math> and <math>b_{j}</math>, with dimensions <math>\{m,n\}</math>, is defined as the ordered product of all possible combinations of elements within the two arrays.

              a_{1}b_{1} & a_{1}b_{2} & \ldots & a_{1}b_{n} \\
              a_{2}b_{1} & a_{2}b_{2} & \ldots & a_{2}b_{n} \\
              \vdots & \vdots & \ddots & \vdots \\
              a_{m}b_{1} & a_{m}b_{2} & \ldots & a_{m}b_{n} \\

\end{align}</math> Index notation simply uses differing indices to represent an outer product, where again the dimensionality is understood from the context:

   c_{ij}=a_{i}b_{j} \textrm{.} 

\end{align}</math> MIA formalism supports another important product - the element-wise or inter product. Performed using two first-order MIAs, it is expressed using an underline:

   c_{i}=a_{\underline{i}}b_{\underline{i}} \textrm{.}

\end{align}</math> With the inter product defined, an MIA product can consist of any combination of <math>N</math>-order inner, inter, and outer products.


c_{lmji}=a_{\underline{i}jkl}b_{\underline{i}mj} \end{align}</math> Note that the order of indices do not have to be same on the left and right-hand sides of the expression. MIA formalism has other benefits, including the ability to represent addition and subtraction, MIA inversions. Inter products also also ternary or higher inner products to be associated.

Using LibMIA

<source lang="Cpp"> DenseMIA<double,3> a(4,6,5); //Could also be sparse DenseMIA<double,3> b(4,2,6); DenseMIA<double,3> c; PRODIND i; PRODIND j; //returns ProdIndex<id,false> PRODIND k; PRODIND l; c(j,l,k)=a(i,!k,l)*b(i,j,!k); //will compile c(j,l,k)=a(i,k,l)*b(i,j,!k); //will cause compilation error </source>