Efficient Java Matrix Library
- 4 min read
- 2 chapters
Explore on Lably
ToursExplore Lably’s 3D toursEJML has three distinct ways to interact with it: 1) Procedural, 2) SimpleMatrix, and 3) Equations. The procedural style provides all capabilities of EJML and almost complete control over matrix creation, speed, and specific algorithms. The SimpleMatrix style provides a simplified subset of the core capabilities in an easy to use flow-styled object-oriented API, inspired by JAMA. The Equations style provides a symbolic interface, similar in spirit to Matlab and other CAS, that provides a compact way of writing equations.
Capabilities
EJML provides the following capabilities for dense matrices.
- Basic Operators (addition, multiplication, ... )
- Matrix Manipulation (extract, insert, combine, ... )
- Linear Solvers (linear, least squares, incremental, ... )
- Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)
- Matrix Features (rank, symmetric, definitiveness, ... )
- Random Matrices (covariance, orthogonal, symmetric, ... )
- Different Internal Formats (row-major, block)
- Unit Testing
Sign in to keep reading
One more chapter is free with a Lably account.
Usage examples
Equation style
Computing the Kalman gain:
<span id="mwHg"></span><span class="n" id="mwHw">eq</span><span class="p" id="mwIA">.</span><span class="na" id="mwIQ">process</span><span class="p" id="mwIg">(</span><span class="s" id="mwIw">"K = P*H'*inv( H*P*H' + R )"</span><span class="p" id="mwJA">);</span>
Procedural style
Computing Kalman gain:
<span id="mwKQ"></span><span class="n" id="mwKg">mult</span><span class="p" id="mwKw">(</span><span class="n" id="mwLA">H</span><span class="p" id="mwLQ">,</span><span class="w" id="mwLg"> </span><span class="n" id="mwLw">P</span><span class="p" id="mwMA">,</span><span class="w" id="mwMQ"> </span><span class="n" id="mwMg">c</span><span class="p" id="mwMw">);</span> <span class="n" id="mwNA">multTransB</span><span class="p" id="mwNQ">(</span><span class="n" id="mwNg">c</span><span class="p" id="mwNw">,</span><span class="w" id="mwOA"> </span><span class="n" id="mwOQ">H</span><span class="p" id="mwOg">,</span><span class="w" id="mwOw"> </span><span class="n" id="mwPA">S</span><span class="p" id="mwPQ">);</span> <span class="n" id="mwPg">addEquals</span><span class="p" id="mwPw">(</span><span class="n" id="mwQA">S</span><span class="p" id="mwQQ">,</span><span class="w" id="mwQg"> </span><span class="n" id="mwQw">R</span><span class="p" id="mwRA">);</span> <span class="k" id="mwRQ">if</span><span class="w" id="mwRg"> </span><span class="p" id="mwRw">(</span><span class="o" id="mwSA">!</span><span class="n" id="mwSQ">invert</span><span class="p" id="mwSg">(</span><span class="n" id="mwSw">S</span><span class="p" id="mwTA">,</span><span class="w" id="mwTQ"> </span><span class="n" id="mwTg">S_inv</span><span class="p" id="mwTw">))</span> <span class="w" id="mwUA"> </span><span class="k" id="mwUQ">throw</span><span class="w" id="mwUg"> </span><span class="k" id="mwUw">new</span><span class="w" id="mwVA"> </span><span class="n" id="mwVQ">RuntimeException</span><span class="p" id="mwVg">(</span><span class="s" id="mwVw">"Invert failed"</span><span class="p" id="mwWA">);</span> <span class="n" id="mwWQ">multTransA</span><span class="p" id="mwWg">(</span><span class="n" id="mwWw">H</span><span class="p" id="mwXA">,</span><span class="w" id="mwXQ"> </span><span class="n" id="mwXg">S_inv</span><span class="p" id="mwXw">,</span><span class="w" id="mwYA"> </span><span class="n" id="mwYQ">d</span><span class="p" id="mwYg">);</span> <span class="n" id="mwYw">mult</span><span class="p" id="mwZA">(</span><span class="n" id="mwZQ">P</span><span class="p" id="mwZg">,</span><span class="w" id="mwZw"> </span><span class="n" id="mwaA">d</span><span class="p" id="mwaQ">,</span><span class="w" id="mwag"> </span><span class="n" id="mwaw">K</span><span class="p" id="mwbA">);</span>
SimpleMatrix style
Example of singular value decomposition (SVD):
<span id="mwcg"></span><span class="n" id="mwcw">SimpleSVD</span><span class="w" id="mwdA"> </span><span class="n" id="mwdQ">s</span><span class="w" id="mwdg"> </span><span class="o" id="mwdw">=</span><span class="w" id="mweA"> </span><span class="n" id="mweQ">matA</span><span class="p" id="mweg">.</span><span class="na" id="mwew">svd</span><span class="p" id="mwfA">();</span> <span class="n" id="mwfQ">SimpleMatrix</span><span class="w" id="mwfg"> </span><span class="n" id="mwfw">U</span><span class="w" id="mwgA"> </span><span class="o" id="mwgQ">=</span><span class="w" id="mwgg"> </span><span class="n" id="mwgw">s</span><span class="p" id="mwhA">.</span><span class="na" id="mwhQ">getU</span><span class="p" id="mwhg">();</span> <span class="n" id="mwhw">SimpleMatrix</span><span class="w" id="mwiA"> </span><span class="n" id="mwiQ">W</span><span class="w" id="mwig"> </span><span class="o" id="mwiw">=</span><span class="w" id="mwjA"> </span><span class="n" id="mwjQ">s</span><span class="p" id="mwjg">.</span><span class="na" id="mwjw">getW</span><span class="p" id="mwkA">();</span> <span class="n" id="mwkQ">SimpleMatrix</span><span class="w" id="mwkg"> </span><span class="n" id="mwkw">V</span><span class="w" id="mwlA"> </span><span class="o" id="mwlQ">=</span><span class="w" id="mwlg"> </span><span class="n" id="mwlw">s</span><span class="p" id="mwmA">.</span><span class="na" id="mwmQ">getV</span><span class="p" id="mwmg">();</span>
Example of matrix multiplication:
<span id="mwng"></span><span class="n" id="mwnw">SimpleMatrix</span><span class="w" id="mwoA"> </span><span class="n" id="mwoQ">result</span><span class="w" id="mwog"> </span><span class="o" id="mwow">=</span><span class="w" id="mwpA"> </span><span class="n" id="mwpQ">matA</span><span class="p" id="mwpg">.</span><span class="na" id="mwpw">mult</span><span class="p" id="mwqA">(</span><span class="n" id="mwqQ">matB</span><span class="p" id="mwqg">);</span>
DecompositionFactory
Use of a DecompositionFactory to compute a Singular Value Decomposition with a Dense Double Row Major matrix (DDRM):
<span id="mwsQ"></span><span class="n" id="mwsg">SingularValueDecomposition_F64</span><span class="o" id="mwsw"><</span><span class="n" id="mwtA">DenseMatrix64F</span><span class="o" id="mwtQ">></span><span class="w" id="mwtg"> </span><span class="n" id="mwtw">svd</span><span class="w" id="mwuA"> </span><span class="o" id="mwuQ">=</span><span class="w" id="mwug"> </span> <span class="w" id="mwuw"> </span><span class="n" id="mwvA">DecompositionFactory_DDRM</span><span class="p" id="mwvQ">.</span><span class="na" id="mwvg">svd</span><span class="p" id="mwvw">(</span><span class="kc" id="mwwA">true</span><span class="p" id="mwwQ">,</span><span class="w" id="mwwg"> </span><span class="kc" id="mwww">true</span><span class="p" id="mwxA">,</span><span class="w" id="mwxQ"> </span><span class="kc" id="mwxg">true</span><span class="p" id="mwxw">);</span> <span class="k" id="mwyA">if</span><span class="w" id="mwyQ"> </span><span class="p" id="mwyg">(</span><span class="o" id="mwyw">!</span><span class="n" id="mwzA">DecompositionFactory</span><span class="p" id="mwzQ">.</span><span class="na" id="mwzg">decomposeSafe</span><span class="p" id="mwzw">(</span><span class="n" id="mw0A">svd</span><span class="p" id="mw0Q">,</span><span class="w" id="mw0g"> </span><span class="n" id="mw0w">matA</span><span class="p" id="mw1A">))</span> <span class="w" id="mw1Q"> </span><span class="k" id="mw1g">throw</span><span class="w" id="mw1w"> </span><span class="k" id="mw2A">new</span><span class="w" id="mw2Q"> </span><span class="n" id="mw2g">DetectedException</span><span class="p" id="mw2w">(</span><span class="s" id="mw3A">"Decomposition failed."</span><span class="p" id="mw3Q">);</span> <span class="n" id="mw3g">DenseMatrix64F</span><span class="w" id="mw3w"> </span><span class="n" id="mw4A">U</span><span class="w" id="mw4Q"> </span><span class="o" id="mw4g">=</span><span class="w" id="mw4w"> </span><span class="n" id="mw5A">svd</span><span class="p" id="mw5Q">.</span><span class="na" id="mw5g">getU</span><span class="p" id="mw5w">(</span><span class="kc" id="mw6A">null</span><span class="p" id="mw6Q">,</span><span class="w" id="mw6g"> </span><span class="kc" id="mw6w">false</span><span class="p" id="mw7A">);</span> <span class="n" id="mw7Q">DenseMatrix64F</span><span class="w" id="mw7g"> </span><span class="n" id="mw7w">S</span><span class="w" id="mw8A"> </span><span class="o" id="mw8Q">=</span><span class="w" id="mw8g"> </span><span class="n" id="mw8w">svd</span><span class="p" id="mw9A">.</span><span class="na" id="mw9Q">getW</span><span class="p" id="mw9g">(</span><span class="kc" id="mw9w">null</span><span class="p" id="mw-A">);</span> <span class="n" id="mw-Q">DenseMatrix64F</span><span class="w" id="mw-g"> </span><span class="n" id="mw-w">V</span><span class="w" id="mw_A"> </span><span class="o" id="mw_Q">=</span><span class="w" id="mw_g"> </span><span class="n" id="mw_w">svd</span><span class="p" id="mwAQA">.</span><span class="na" id="mwAQE">getV</span><span class="p" id="mwAQI">(</span><span class="kc" id="mwAQM">null</span><span class="p" id="mwAQQ">,</span><span class="w" id="mwAQU"> </span><span class="kc" id="mwAQY">false</span><span class="p" id="mwAQc">);</span>
Example of matrix multiplication:
<span id="mwAQs"></span><span class="n" id="mwAQw">CommonOps_DDRM</span><span class="p" id="mwAQ0">.</span><span class="na" id="mwAQ4">mult</span><span class="p" id="mwAQ8">(</span><span class="n" id="mwARA">matA</span><span class="p" id="mwARE">,</span><span class="w" id="mwARI"> </span><span class="n" id="mwARM">matB</span><span class="p" id="mwARQ">,</span><span class="w" id="mwARU"> </span><span class="n" id="mwARY">result</span><span class="p" id="mwARc">);</span>

