<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ejml.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Peter</id>
	<title>Efficient Java Matrix Library - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ejml.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Peter"/>
	<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Special:Contributions/Peter"/>
	<updated>2026-04-21T21:04:51Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.35.11</generator>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=343</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=343"/>
		<updated>2025-03-22T01:25:38Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml/badge.svg]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.44.0/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.44.0&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.44.0&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=342</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=342"/>
		<updated>2025-03-22T01:25:14Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml/badge.svg]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.43/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.44.0&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.44.0&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=341</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=341"/>
		<updated>2025-03-22T01:25:03Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml/badge.svg]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.43/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.43&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.44.0&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=340</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=340"/>
		<updated>2025-03-22T01:17:09Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.44.0&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;March 21, 2025&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.44.0/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2023 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* SimpleMatrix is going through bit of a rejuvenation&lt;br /&gt;
* SimpleMatrix has much improved support for complex matrices&lt;br /&gt;
* Introduced ConstMatrix for when you want to restrict access to read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=339</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=339"/>
		<updated>2023-09-24T04:33:04Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.43.1&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;September 23, 2023&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.43.1/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2023 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* SimpleMatrix is going through bit of a rejuvenation&lt;br /&gt;
* SimpleMatrix has much improved support for complex matrices&lt;br /&gt;
* Introduced ConstMatrix for when you want to restrict access to read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=336</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=336"/>
		<updated>2023-04-15T15:51:57Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml https://github.com/lessthanoptimal/ejml/actions/workflows/gradle.yml/badge.svg]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.43/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.43&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.43&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=335</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=335"/>
		<updated>2023-04-15T15:46:52Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://travis-ci.org/lessthanoptimal/ejml https://api.travis-ci.org/lessthanoptimal/ejml.png]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.43/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.43&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.43&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=334</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=334"/>
		<updated>2023-04-15T15:46:10Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.43&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;April 15, 2023&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.43/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2023 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* SimpleMatrix is going through bit of a rejuvenation&lt;br /&gt;
* SimpleMatrix has much improved support for complex matrices&lt;br /&gt;
* Introduced ConstMatrix for when you want to restrict access to read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=333</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=333"/>
		<updated>2023-02-10T17:26:41Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://travis-ci.org/lessthanoptimal/ejml https://api.travis-ci.org/lessthanoptimal/ejml.png]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.42/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.42&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.42&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=332</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=332"/>
		<updated>2023-02-10T16:39:42Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.42&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;February 10, 2023&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.42/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2023 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* SimpleMatrix is going through bit of a rejuvenation&lt;br /&gt;
* SimpleMatrix has much improved support for complex matrices&lt;br /&gt;
* Introduced ConstMatrix for when you want to restrict access to read only&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=331</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=331"/>
		<updated>2023-02-10T16:36:21Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.42&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;February 10, 2023&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.42/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2021 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* Read and write EJML in Matlab format with [https://github.com/HebiRobotics/MFL MFL] from HEBI Robotics&lt;br /&gt;
* Graph BLAS continues to be flushed out with masks being added to latest SNAPSHOT&lt;br /&gt;
* Concurrency/threading has been added to some operations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Sparse_Matrices&amp;diff=330</id>
		<title>Example Sparse Matrices</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Sparse_Matrices&amp;diff=330"/>
		<updated>2023-02-10T15:56:54Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Support for sparse matrices has recently been added to EJML. It supports many but not all of the standard operations that are supported for dense matrics. The code below shows the basics of working with a sparse matrix. In some situations the speed improvement of using a sparse matrix can be substantial. Do note that if your system isn&amp;#039;t sparse enough or if its structure isn&amp;#039;t advantageous it could run even slower using sparse operations!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Execution Time (ms) &lt;br /&gt;
|-&lt;br /&gt;
| Dense || 12660&lt;br /&gt;
|-&lt;br /&gt;
| Sparse || 1642&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleSparseMatrix.java ExampleSparseMatrix.java]&lt;br /&gt;
&lt;br /&gt;
== Sparse Matrix Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example showing how to construct and solve a linear system using sparse matrices&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleSparseMatrix {&lt;br /&gt;
    public static int ROWS = 100000;&lt;br /&gt;
    public static int COLS = 1000;&lt;br /&gt;
    public static int XCOLS = 1;&lt;br /&gt;
&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        Random rand = new Random(234);&lt;br /&gt;
&lt;br /&gt;
        // easy to work with sparse format, but hard to do computations with&lt;br /&gt;
        // NOTE: It is very important to you set &amp;#039;initLength&amp;#039; to the actual number of elements in the final array&lt;br /&gt;
        //       If you don&amp;#039;t it will be forced to thrash memory as it grows its internal data structures.&lt;br /&gt;
        //       Failure to heed this advice will make construction of large matrices 4x slower and use 2x more memory&lt;br /&gt;
        var work = new DMatrixSparseTriplet(5, 4, 5);&lt;br /&gt;
        work.addItem(0, 1, 1.2);&lt;br /&gt;
        work.addItem(3, 0, 3);&lt;br /&gt;
        work.addItem(1, 1, 22.21234);&lt;br /&gt;
        work.addItem(2, 3, 6);&lt;br /&gt;
&lt;br /&gt;
        // convert into a format that&amp;#039;s easier to perform math with&lt;br /&gt;
        DMatrixSparseCSC Z = DConvertMatrixStruct.convert(work, (DMatrixSparseCSC)null);&lt;br /&gt;
&lt;br /&gt;
        // print the matrix to standard out in two different formats&lt;br /&gt;
        Z.print();&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        Z.printNonZero();&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // Create a large matrix that is 5% filled&lt;br /&gt;
        DMatrixSparseCSC A = RandomMatrices_DSCC.rectangle(ROWS, COLS, (int)(ROWS*COLS*0.05), rand);&lt;br /&gt;
        //          large vector that is 70% filled&lt;br /&gt;
        DMatrixSparseCSC x = RandomMatrices_DSCC.rectangle(COLS, XCOLS, (int)(XCOLS*COLS*0.7), rand);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Done generating random matrices&amp;quot;);&lt;br /&gt;
        // storage for the initial solution&lt;br /&gt;
        var y = new DMatrixSparseCSC(ROWS, XCOLS, 0);&lt;br /&gt;
        var z = new DMatrixSparseCSC(ROWS, XCOLS, 0);&lt;br /&gt;
&lt;br /&gt;
        // To demonstration how to perform sparse math let&amp;#039;s multiply:&lt;br /&gt;
        //                  y=A*x&lt;br /&gt;
        // Optional storage is set to null so that it will declare it internally&lt;br /&gt;
        long before = System.currentTimeMillis();&lt;br /&gt;
        var workA = new IGrowArray(A.numRows);&lt;br /&gt;
        var workB = new DGrowArray(A.numRows);&lt;br /&gt;
        for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
            CommonOps_DSCC.mult(A, x, y, workA, workB);&lt;br /&gt;
            CommonOps_DSCC.add(1.5, y, 0.75, y, z, workA, workB);&lt;br /&gt;
        }&lt;br /&gt;
        long after = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;norm = &amp;quot; + NormOps_DSCC.fastNormF(y) + &amp;quot;  sparse time = &amp;quot; + (after - before) + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj Ad = DConvertMatrixStruct.convert(A, (DMatrixRMaj)null);&lt;br /&gt;
        DMatrixRMaj xd = DConvertMatrixStruct.convert(x, (DMatrixRMaj)null);&lt;br /&gt;
        var yd = new DMatrixRMaj(y.numRows, y.numCols);&lt;br /&gt;
        var zd = new DMatrixRMaj(y.numRows, y.numCols);&lt;br /&gt;
&lt;br /&gt;
        before = System.currentTimeMillis();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
            CommonOps_DDRM.mult(Ad, xd, yd);&lt;br /&gt;
            CommonOps_DDRM.add(1.5, yd, 0.75, yd, zd);&lt;br /&gt;
        }&lt;br /&gt;
        after = System.currentTimeMillis();&lt;br /&gt;
        System.out.println(&amp;quot;norm = &amp;quot; + NormOps_DDRM.fastNormF(yd) + &amp;quot;  dense time  = &amp;quot; + (after - before) + &amp;quot; ms&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Kalman_Filter&amp;diff=329</id>
		<title>Example Kalman Filter</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Kalman_Filter&amp;diff=329"/>
		<updated>2023-02-10T15:52:56Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Here are three examples that demonstrate how a [http://en.wikipedia.org/wiki/Kalman_filter Kalman filter] can be created using different API&amp;#039;s in EJML.  Each API has different advantages and disadvantages.  High level interfaces tend to be easier to use, but sacrifice efficiency.  The intent of this article is to illustrate this trend empirically.  Runtime performance of each approach is shown below.  To see how complex and readable each approach is check out the source code below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! API !! Execution Time (ms) &lt;br /&gt;
|-&lt;br /&gt;
| SimpleMatrix || 1875&lt;br /&gt;
|-&lt;br /&gt;
| Operations || 1280&lt;br /&gt;
|-&lt;br /&gt;
| Equations || 1698 &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.42/examples/src/org/ejml/example/KalmanFilterSimple.java KalmanFilterSimple]&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.42/examples/src/org/ejml/example/KalmanFilterOperations.java KalmanFilterOperations]&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.42/examples/src/org/ejml/example/KalmanFilterEquation.java KalmanFilterEquation]&lt;br /&gt;
* &amp;lt;disqus&amp;gt;Discuss this example&amp;lt;/disqus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; While the Kalman filter code below is fully functional and will work well in most applications, it might not be the best.  Other variants seek to improve stability and/or avoid the matrix inversion.  It&amp;#039;s worth point out that some people say you should never invert the matrix in a Kalman filter.  There are applications, such as target tracking, where matrix inversion of the innovation covariance is helpful as a preprocessing step.&lt;br /&gt;
&lt;br /&gt;
== SimpleMatrix Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * A Kalman filter implemented using SimpleMatrix. The code tends to be easier to&lt;br /&gt;
 * read and write, but the performance is degraded due to excessive creation/destruction of&lt;br /&gt;
 * memory and the use of more generic algorithms. This also demonstrates how code can be&lt;br /&gt;
 * seamlessly implemented using both SimpleMatrix and DMatrixRMaj. This allows code&lt;br /&gt;
 * to be quickly prototyped or to be written either by novices or experts.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterSimple implements KalmanFilter {&lt;br /&gt;
    // kinematics description&lt;br /&gt;
    private ConstMatrix&amp;lt;SimpleMatrix&amp;gt; F, Q, H;&lt;br /&gt;
&lt;br /&gt;
    // sytem state estimate&lt;br /&gt;
    private SimpleMatrix x, P;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        this.F = new SimpleMatrix(F);&lt;br /&gt;
        this.Q = new SimpleMatrix(Q);&lt;br /&gt;
        this.H = new SimpleMatrix(H);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x = new SimpleMatrix(x);&lt;br /&gt;
        this.P = new SimpleMatrix(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        // x = F x&lt;br /&gt;
        x = F.mult(x);&lt;br /&gt;
&lt;br /&gt;
        // P = F P F&amp;#039; + Q&lt;br /&gt;
        P = F.mult(P).mult(F.transpose()).plus(Q);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj _z, DMatrixRMaj _R ) {&lt;br /&gt;
        // a fast way to make the matrices usable by SimpleMatrix&lt;br /&gt;
        SimpleMatrix z = SimpleMatrix.wrap(_z);&lt;br /&gt;
        SimpleMatrix R = SimpleMatrix.wrap(_R);&lt;br /&gt;
&lt;br /&gt;
        // y = z - H x&lt;br /&gt;
        ConstMatrix&amp;lt;?&amp;gt; y = z.minus(H.mult(x));&lt;br /&gt;
&lt;br /&gt;
        // S = H P H&amp;#039; + R&lt;br /&gt;
        ConstMatrix&amp;lt;?&amp;gt; S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
&lt;br /&gt;
        // K = PH&amp;#039;S^(-1)&lt;br /&gt;
        ConstMatrix&amp;lt;?&amp;gt; K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&lt;br /&gt;
        // x = x + Ky&lt;br /&gt;
        x = x.plus(K.mult(y));&lt;br /&gt;
&lt;br /&gt;
        // P = (I-kH)P = P - KHP&lt;br /&gt;
        P = P.minus(K.mult(H).mult(P));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x.getMatrix(); }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P.getMatrix(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operations Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * A Kalman filter that is implemented using the operations API, which is procedural.  Much of the excessive&lt;br /&gt;
 * memory creation/destruction has been reduced from the KalmanFilterSimple. A specialized solver is&lt;br /&gt;
 * under to invert the SPD matrix.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterOperations implements KalmanFilter {&lt;br /&gt;
    // kinematics description&lt;br /&gt;
    private DMatrixRMaj F, Q, H;&lt;br /&gt;
&lt;br /&gt;
    // system state estimate&lt;br /&gt;
    private DMatrixRMaj x, P;&lt;br /&gt;
&lt;br /&gt;
    // these are predeclared for efficiency reasons&lt;br /&gt;
    private DMatrixRMaj a, b;&lt;br /&gt;
    private DMatrixRMaj y, S, S_inv, c, d;&lt;br /&gt;
    private DMatrixRMaj K;&lt;br /&gt;
&lt;br /&gt;
    private LinearSolverDense&amp;lt;DMatrixRMaj&amp;gt; solver;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        this.F = F;&lt;br /&gt;
        this.Q = Q;&lt;br /&gt;
        this.H = H;&lt;br /&gt;
&lt;br /&gt;
        int dimenX = F.numCols;&lt;br /&gt;
        int dimenZ = H.numRows;&lt;br /&gt;
&lt;br /&gt;
        a = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        b = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
        y = new DMatrixRMaj(dimenZ, 1);&lt;br /&gt;
        S = new DMatrixRMaj(dimenZ, dimenZ);&lt;br /&gt;
        S_inv = new DMatrixRMaj(dimenZ, dimenZ);&lt;br /&gt;
        c = new DMatrixRMaj(dimenZ, dimenX);&lt;br /&gt;
        d = new DMatrixRMaj(dimenX, dimenZ);&lt;br /&gt;
        K = new DMatrixRMaj(dimenX, dimenZ);&lt;br /&gt;
&lt;br /&gt;
        x = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        P = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
&lt;br /&gt;
        // covariance matrices are symmetric positive semi-definite&lt;br /&gt;
        solver = LinearSolverFactory_DDRM.symmPosDef(dimenX);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x.setTo(x);&lt;br /&gt;
        this.P.setTo(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        // x = F x&lt;br /&gt;
        mult(F, x, a);&lt;br /&gt;
        x.setTo(a);&lt;br /&gt;
&lt;br /&gt;
        // P = F P F&amp;#039; + Q&lt;br /&gt;
        mult(F, P, b);&lt;br /&gt;
        multTransB(b, F, P);&lt;br /&gt;
        addEquals(P, Q);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj z, DMatrixRMaj R ) {&lt;br /&gt;
        // y = z - H x&lt;br /&gt;
        mult(H, x, y);&lt;br /&gt;
        subtract(z, y, y);&lt;br /&gt;
&lt;br /&gt;
        // S = H P H&amp;#039; + R&lt;br /&gt;
        mult(H, P, c);&lt;br /&gt;
        multTransB(c, H, S);&lt;br /&gt;
        addEquals(S, R);&lt;br /&gt;
&lt;br /&gt;
        // K = PH&amp;#039;S^(-1)&lt;br /&gt;
        if (!solver.setA(S)) throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
        solver.invert(S_inv);&lt;br /&gt;
        multTransA(H, S_inv, d);&lt;br /&gt;
        mult(P, d, K);&lt;br /&gt;
&lt;br /&gt;
        // x = x + Ky&lt;br /&gt;
        mult(K, y, a);&lt;br /&gt;
        addEquals(x, a);&lt;br /&gt;
&lt;br /&gt;
        // P = (I-kH)P = P - (KH)P = P-K(HP)&lt;br /&gt;
        mult(H, P, c);&lt;br /&gt;
        mult(K, c, b);&lt;br /&gt;
        subtractEquals(P, b);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x; }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Equations Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example of how the equation interface can greatly simplify code&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterEquation implements KalmanFilter {&lt;br /&gt;
    // system state estimate&lt;br /&gt;
    private DMatrixRMaj x, P;&lt;br /&gt;
&lt;br /&gt;
    private Equation eq;&lt;br /&gt;
&lt;br /&gt;
    // Storage for precompiled code for predict and update&lt;br /&gt;
    Sequence predictX, predictP;&lt;br /&gt;
    Sequence updateY, updateK, updateX, updateP;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        int dimenX = F.numCols;&lt;br /&gt;
&lt;br /&gt;
        x = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        P = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
&lt;br /&gt;
        eq = new Equation();&lt;br /&gt;
&lt;br /&gt;
        // Provide aliases between the symbolic variables and matrices we normally interact with&lt;br /&gt;
        // The names do not have to be the same.&lt;br /&gt;
        eq.alias(x, &amp;quot;x&amp;quot;, P, &amp;quot;P&amp;quot;, Q, &amp;quot;Q&amp;quot;, F, &amp;quot;F&amp;quot;, H, &amp;quot;H&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Dummy matrix place holder to avoid compiler errors. Will be replaced later on&lt;br /&gt;
        eq.alias(new DMatrixRMaj(1, 1), &amp;quot;z&amp;quot;);&lt;br /&gt;
        eq.alias(new DMatrixRMaj(1, 1), &amp;quot;R&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Pre-compile so that it doesn&amp;#039;t have to compile it each time it&amp;#039;s invoked. More cumbersome&lt;br /&gt;
        // but for small matrices the overhead is significant&lt;br /&gt;
        predictX = eq.compile(&amp;quot;x = F*x&amp;quot;);&lt;br /&gt;
        predictP = eq.compile(&amp;quot;P = F*P*F&amp;#039; + Q&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        updateY = eq.compile(&amp;quot;y = z - H*x&amp;quot;);&lt;br /&gt;
        updateK = eq.compile(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
        updateX = eq.compile(&amp;quot;x = x + K*y&amp;quot;);&lt;br /&gt;
        updateP = eq.compile(&amp;quot;P = P-K*(H*P)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x.setTo(x);&lt;br /&gt;
        this.P.setTo(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        predictX.perform();&lt;br /&gt;
        predictP.perform();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj z, DMatrixRMaj R ) {&lt;br /&gt;
&lt;br /&gt;
        // Alias will overwrite the reference to the previous matrices with the same name&lt;br /&gt;
        eq.alias(z, &amp;quot;z&amp;quot;, R, &amp;quot;R&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        updateY.perform();&lt;br /&gt;
        updateK.perform();&lt;br /&gt;
        updateX.perform();&lt;br /&gt;
        updateP.perform();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x; }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=328</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=328"/>
		<updated>2022-12-05T03:27:02Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.41.1&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;December 4, 2022&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.41.1/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2021 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* Read and write EJML in Matlab format with [https://github.com/HebiRobotics/MFL MFL] from HEBI Robotics&lt;br /&gt;
* Graph BLAS continues to be flushed out with masks being added to latest SNAPSHOT&lt;br /&gt;
* Concurrency/threading has been added to some operations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=327</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=327"/>
		<updated>2021-07-07T16:23:08Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://travis-ci.org/lessthanoptimal/ejml https://api.travis-ci.org/lessthanoptimal/ejml.png]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.41/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.41&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.41&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=326</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=326"/>
		<updated>2021-07-07T15:58:48Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://travis-ci.org/lessthanoptimal/ejml https://api.travis-ci.org/lessthanoptimal/ejml.png]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.40/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.41&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.41&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=325</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=325"/>
		<updated>2021-07-07T15:58:20Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.41&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;July 7, 2021&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.41/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2021 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* Read and write EJML in Matlab format with [https://github.com/HebiRobotics/MFL MFL] from HEBI Robotics&lt;br /&gt;
* Graph BLAS continues to be flushed out with masks being added to latest SNAPSHOT&lt;br /&gt;
* Concurrency/threading has been added to some operations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Fixed_Sized_Matrices&amp;diff=324</id>
		<title>Example Fixed Sized Matrices</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Fixed_Sized_Matrices&amp;diff=324"/>
		<updated>2021-07-07T15:37:29Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Array access adds a significant amount of overhead to matrix operations.  A fixed sized matrix gets around that issue by having each element in the matrix be a variable in the class.  EJML provides support for fixed sized matrices and vectors up to 6x6, at which point it loses its advantage.  The example below demonstrates how to use a fixed sized matrix and convert to other matrix types in EJML.&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleFixedSizedMatrix.java ExampleFixedSizedMatrix]&lt;br /&gt;
* &amp;lt;disqus&amp;gt;Discuss this example&amp;lt;/disqus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * In some applications a small fixed sized matrix can speed things up a lot, e.g. 8 times faster.  One application&lt;br /&gt;
 * which uses small matrices is graphics and rigid body motion, which extensively uses 3x3 and 4x4 matrices.  This&lt;br /&gt;
 * example is to show some examples of how you can use a fixed sized matrix.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleFixedSizedMatrix {&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        // declare the matrix&lt;br /&gt;
        DMatrix3x3 a = new DMatrix3x3();&lt;br /&gt;
        DMatrix3x3 b = new DMatrix3x3();&lt;br /&gt;
&lt;br /&gt;
        // Can assign values the usual way&lt;br /&gt;
        for (int i = 0; i &amp;lt; 3; i++) {&lt;br /&gt;
            for (int j = 0; j &amp;lt; 3; j++) {&lt;br /&gt;
                a.set(i, j, i + j + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Direct manipulation of each value is the fastest way to assign/read values&lt;br /&gt;
        a.a11 = 12;&lt;br /&gt;
        a.a23 = 64;&lt;br /&gt;
&lt;br /&gt;
        // can print the usual way too&lt;br /&gt;
        a.print();&lt;br /&gt;
&lt;br /&gt;
        // most of the standard operations are support&lt;br /&gt;
        CommonOps_DDF3.transpose(a, b);&lt;br /&gt;
        b.print();&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Determinant = &amp;quot; + CommonOps_DDF3.det(a));&lt;br /&gt;
&lt;br /&gt;
        // matrix-vector operations are also supported&lt;br /&gt;
        // Constructors for vectors and matrices can be used to initialize its value&lt;br /&gt;
        DMatrix3 v = new DMatrix3(1, 2, 3);&lt;br /&gt;
        DMatrix3 result = new DMatrix3();&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDF3.mult(a, v, result);&lt;br /&gt;
&lt;br /&gt;
        // Conversion into DMatrixRMaj can also be done&lt;br /&gt;
        DMatrixRMaj dm = DConvertMatrixStruct.convert(a, null);&lt;br /&gt;
&lt;br /&gt;
        dm.print();&lt;br /&gt;
&lt;br /&gt;
        // This can be useful if you need do more advanced operations&lt;br /&gt;
        SimpleMatrix sv = SimpleMatrix.wrap(dm).svd().getV();&lt;br /&gt;
&lt;br /&gt;
        // can then convert it back into a fixed matrix&lt;br /&gt;
        DMatrix3x3 fv = DConvertMatrixStruct.convert(sv.getDDRM(), (DMatrix3x3)null);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Original simple matrix and converted fixed matrix&amp;quot;);&lt;br /&gt;
        sv.print();&lt;br /&gt;
        fv.print();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Principal_Component_Analysis&amp;diff=323</id>
		<title>Example Principal Component Analysis</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Principal_Component_Analysis&amp;diff=323"/>
		<updated>2021-07-07T15:32:45Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Principal Component Analysis (PCA) is a popular and simple to implement classification technique, often used in face recognition.  The following is an example of how to implement it in EJML using the procedural interface.  It is assumed that the reader is already familiar with PCA.&lt;br /&gt;
&lt;br /&gt;
External Resources&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/PrincipalComponentAnalysis.java PrincipalComponentAnalysis.java source code]&lt;br /&gt;
* [http://en.wikipedia.org/wiki/Principal_component_analysis General PCA information on Wikipedia]&lt;br /&gt;
&lt;br /&gt;
= Sample Code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * The following is a simple example of how to perform basic principal component analysis in EJML.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Principal Component Analysis (PCA) is typically used to develop a linear model for a set of data&lt;br /&gt;
 * (e.g. face images) which can then be used to test for membership.  PCA works by converting the&lt;br /&gt;
 * set of data to a new basis that is a subspace of the original set.  The subspace is selected&lt;br /&gt;
 * to maximize information.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * PCA is typically derived as an eigenvalue problem.  However in this implementation {@link org.ejml.interfaces.decomposition.SingularValueDecomposition SVD}&lt;br /&gt;
 * is used instead because it will produce a more numerically stable solution.  Computation using EVD requires explicitly&lt;br /&gt;
 * computing the variance of each sample set. The variance is computed by squaring the residual, which can&lt;br /&gt;
 * cause loss of precision.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Usage:&amp;lt;br&amp;gt;&lt;br /&gt;
 * 1) call setup()&amp;lt;br&amp;gt;&lt;br /&gt;
 * 2) For each sample (e.g. an image ) call addSample()&amp;lt;br&amp;gt;&lt;br /&gt;
 * 3) After all the samples have been added call computeBasis()&amp;lt;br&amp;gt;&lt;br /&gt;
 * 4) Call  sampleToEigenSpace() , eigenToSampleSpace() , errorMembership() , response()&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class PrincipalComponentAnalysis {&lt;br /&gt;
&lt;br /&gt;
    // principal component subspace is stored in the rows&lt;br /&gt;
    private DMatrixRMaj V_t;&lt;br /&gt;
&lt;br /&gt;
    // how many principal components are used&lt;br /&gt;
    private int numComponents;&lt;br /&gt;
&lt;br /&gt;
    // where the data is stored&lt;br /&gt;
    private DMatrixRMaj A = new DMatrixRMaj(1, 1);&lt;br /&gt;
    private int sampleIndex;&lt;br /&gt;
&lt;br /&gt;
    // mean values of each element across all the samples&lt;br /&gt;
    double[] mean;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Must be called before any other functions. Declares and sets up internal data structures.&lt;br /&gt;
     *&lt;br /&gt;
     * @param numSamples Number of samples that will be processed.&lt;br /&gt;
     * @param sampleSize Number of elements in each sample.&lt;br /&gt;
     */&lt;br /&gt;
    public void setup( int numSamples, int sampleSize ) {&lt;br /&gt;
        mean = new double[sampleSize];&lt;br /&gt;
        A.reshape(numSamples, sampleSize, false);&lt;br /&gt;
        sampleIndex = 0;&lt;br /&gt;
        numComponents = -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Adds a new sample of the raw data to internal data structure for later processing.  All the samples&lt;br /&gt;
     * must be added before computeBasis is called.&lt;br /&gt;
     *&lt;br /&gt;
     * @param sampleData Sample from original raw data.&lt;br /&gt;
     */&lt;br /&gt;
    public void addSample( double[] sampleData ) {&lt;br /&gt;
        if (A.getNumCols() != sampleData.length)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Unexpected sample size&amp;quot;);&lt;br /&gt;
        if (sampleIndex &amp;gt;= A.getNumRows())&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Too many samples&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; sampleData.length; i++) {&lt;br /&gt;
            A.set(sampleIndex, i, sampleData[i]);&lt;br /&gt;
        }&lt;br /&gt;
        sampleIndex++;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes a basis (the principal components) from the most dominant eigenvectors.&lt;br /&gt;
     *&lt;br /&gt;
     * @param numComponents Number of vectors it will use to describe the data.  Typically much&lt;br /&gt;
     * smaller than the number of elements in the input vector.&lt;br /&gt;
     */&lt;br /&gt;
    public void computeBasis( int numComponents ) {&lt;br /&gt;
        if (numComponents &amp;gt; A.getNumCols())&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;More components requested that the data&amp;#039;s length.&amp;quot;);&lt;br /&gt;
        if (sampleIndex != A.getNumRows())&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Not all the data has been added&amp;quot;);&lt;br /&gt;
        if (numComponents &amp;gt; sampleIndex)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;More data needed to compute the desired number of components&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        this.numComponents = numComponents;&lt;br /&gt;
&lt;br /&gt;
        // compute the mean of all the samples&lt;br /&gt;
        for (int i = 0; i &amp;lt; A.getNumRows(); i++) {&lt;br /&gt;
            for (int j = 0; j &amp;lt; mean.length; j++) {&lt;br /&gt;
                mean[j] += A.get(i, j);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        for (int j = 0; j &amp;lt; mean.length; j++) {&lt;br /&gt;
            mean[j] /= A.getNumRows();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // subtract the mean from the original data&lt;br /&gt;
        for (int i = 0; i &amp;lt; A.getNumRows(); i++) {&lt;br /&gt;
            for (int j = 0; j &amp;lt; mean.length; j++) {&lt;br /&gt;
                A.set(i, j, A.get(i, j) - mean[j]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // Compute SVD and save time by not computing U&lt;br /&gt;
        SingularValueDecomposition&amp;lt;DMatrixRMaj&amp;gt; svd =&lt;br /&gt;
                DecompositionFactory_DDRM.svd(A.numRows, A.numCols, false, true, false);&lt;br /&gt;
        if (!svd.decompose(A))&lt;br /&gt;
            throw new RuntimeException(&amp;quot;SVD failed&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        V_t = svd.getV(null, true);&lt;br /&gt;
        DMatrixRMaj W = svd.getW(null);&lt;br /&gt;
&lt;br /&gt;
        // Singular values are in an arbitrary order initially&lt;br /&gt;
        SingularOps_DDRM.descendingOrder(null, false, W, V_t, true);&lt;br /&gt;
&lt;br /&gt;
        // strip off unneeded components and find the basis&lt;br /&gt;
        V_t.reshape(numComponents, mean.length, true);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns a vector from the PCA&amp;#039;s basis.&lt;br /&gt;
     *&lt;br /&gt;
     * @param which Which component&amp;#039;s vector is to be returned.&lt;br /&gt;
     * @return Vector from the PCA basis.&lt;br /&gt;
     */&lt;br /&gt;
    public double[] getBasisVector( int which ) {&lt;br /&gt;
        if (which &amp;lt; 0 || which &amp;gt;= numComponents)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Invalid component&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj v = new DMatrixRMaj(1, A.numCols);&lt;br /&gt;
        CommonOps_DDRM.extract(V_t, which, which + 1, 0, A.numCols, v, 0, 0);&lt;br /&gt;
&lt;br /&gt;
        return v.data;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Converts a vector from sample space into eigen space.&lt;br /&gt;
     *&lt;br /&gt;
     * @param sampleData Sample space data.&lt;br /&gt;
     * @return Eigen space projection.&lt;br /&gt;
     */&lt;br /&gt;
    public double[] sampleToEigenSpace( double[] sampleData ) {&lt;br /&gt;
        if (sampleData.length != A.getNumCols())&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Unexpected sample length&amp;quot;);&lt;br /&gt;
        DMatrixRMaj mean = DMatrixRMaj.wrap(A.getNumCols(), 1, this.mean);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj s = new DMatrixRMaj(A.getNumCols(), 1, true, sampleData);&lt;br /&gt;
        DMatrixRMaj r = new DMatrixRMaj(numComponents, 1);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.subtract(s, mean, s);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.mult(V_t, s, r);&lt;br /&gt;
&lt;br /&gt;
        return r.data;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Converts a vector from eigen space into sample space.&lt;br /&gt;
     *&lt;br /&gt;
     * @param eigenData Eigen space data.&lt;br /&gt;
     * @return Sample space projection.&lt;br /&gt;
     */&lt;br /&gt;
    public double[] eigenToSampleSpace( double[] eigenData ) {&lt;br /&gt;
        if (eigenData.length != numComponents)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Unexpected sample length&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj s = new DMatrixRMaj(A.getNumCols(), 1);&lt;br /&gt;
        DMatrixRMaj r = DMatrixRMaj.wrap(numComponents, 1, eigenData);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.multTransA(V_t, r, s);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj mean = DMatrixRMaj.wrap(A.getNumCols(), 1, this.mean);&lt;br /&gt;
        CommonOps_DDRM.add(s, mean, s);&lt;br /&gt;
&lt;br /&gt;
        return s.data;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     * The membership error for a sample.  If the error is less than a threshold then&lt;br /&gt;
     * it can be considered a member.  The threshold&amp;#039;s value depends on the data set.&lt;br /&gt;
     * &amp;lt;/p&amp;gt;&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     * The error is computed by projecting the sample into eigenspace then projecting&lt;br /&gt;
     * it back into sample space and&lt;br /&gt;
     * &amp;lt;/p&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * @param sampleA The sample whose membership status is being considered.&lt;br /&gt;
     * @return Its membership error.&lt;br /&gt;
     */&lt;br /&gt;
    public double errorMembership( double[] sampleA ) {&lt;br /&gt;
        double[] eig = sampleToEigenSpace(sampleA);&lt;br /&gt;
        double[] reproj = eigenToSampleSpace(eig);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        double total = 0;&lt;br /&gt;
        for (int i = 0; i &amp;lt; reproj.length; i++) {&lt;br /&gt;
            double d = sampleA[i] - reproj[i];&lt;br /&gt;
            total += d*d;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return Math.sqrt(total);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes the dot product of each basis vector against the sample.  Can be used as a measure&lt;br /&gt;
     * for membership in the training sample set.  High values correspond to a better fit.&lt;br /&gt;
     *&lt;br /&gt;
     * @param sample Sample of original data.&lt;br /&gt;
     * @return Higher value indicates it is more likely to be a member of input dataset.&lt;br /&gt;
     */&lt;br /&gt;
    public double response( double[] sample ) {&lt;br /&gt;
        if (sample.length != A.numCols)&lt;br /&gt;
            throw new IllegalArgumentException(&amp;quot;Expected input vector to be in sample space&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj dots = new DMatrixRMaj(numComponents, 1);&lt;br /&gt;
        DMatrixRMaj s = DMatrixRMaj.wrap(A.numCols, 1, sample);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.mult(V_t, s, dots);&lt;br /&gt;
&lt;br /&gt;
        return NormOps_DDRM.normF(dots);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Polynomial_Roots&amp;diff=322</id>
		<title>Example Polynomial Roots</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Polynomial_Roots&amp;diff=322"/>
		<updated>2021-07-07T15:31:20Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Eigenvalue decomposition can be used to find the roots in a polynomial by constructing the so called [http://en.wikipedia.org/wiki/Companion_matrix companion matrix].  While faster techniques do exist for root finding, this is one of the most stable and probably the easiest to implement.&lt;br /&gt;
&lt;br /&gt;
Because the companion matrix is not symmetric a generalized eigenvalue [MatrixDecomposition decomposition] is needed.  The roots of the polynomial may also be [http://en.wikipedia.org/wiki/Complex_number complex].&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.31/examples/src/org/ejml/example/PolynomialRootFinder.java PolynomialRootFinder.java source code]&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public class PolynomialRootFinder {&lt;br /&gt;
    /**&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     * Given a set of polynomial coefficients, compute the roots of the polynomial.  Depending on&lt;br /&gt;
     * the polynomial being considered the roots may contain complex number.  When complex numbers are&lt;br /&gt;
     * present they will come in pairs of complex conjugates.&lt;br /&gt;
     * &amp;lt;/p&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * &amp;lt;p&amp;gt;&lt;br /&gt;
     * Coefficients are ordered from least to most significant, e.g: y = c[0] + x*c[1] + x*x*c[2].&lt;br /&gt;
     * &amp;lt;/p&amp;gt;&lt;br /&gt;
     *&lt;br /&gt;
     * @param coefficients Coefficients of the polynomial.&lt;br /&gt;
     * @return The roots of the polynomial&lt;br /&gt;
     */&lt;br /&gt;
    public static Complex_F64[] findRoots( double... coefficients ) {&lt;br /&gt;
        int N = coefficients.length - 1;&lt;br /&gt;
&lt;br /&gt;
        // Construct the companion matrix&lt;br /&gt;
        DMatrixRMaj c = new DMatrixRMaj(N, N);&lt;br /&gt;
&lt;br /&gt;
        double a = coefficients[N];&lt;br /&gt;
        for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
            c.set(i, N - 1, -coefficients[i]/a);&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 1; i &amp;lt; N; i++) {&lt;br /&gt;
            c.set(i, i - 1, 1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // use generalized eigenvalue decomposition to find the roots&lt;br /&gt;
        EigenDecomposition_F64&amp;lt;DMatrixRMaj&amp;gt; evd = DecompositionFactory_DDRM.eig(N, false);&lt;br /&gt;
&lt;br /&gt;
        evd.decompose(c);&lt;br /&gt;
&lt;br /&gt;
        Complex_F64[] roots = new Complex_F64[N];&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; N; i++) {&lt;br /&gt;
            roots[i] = evd.getEigenvalue(i);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        return roots;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Polynomial_Fitting&amp;diff=321</id>
		<title>Example Polynomial Fitting</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Polynomial_Fitting&amp;diff=321"/>
		<updated>2021-07-07T15:30:10Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this example it is shown how EJML can be used to fit a polynomial of arbitrary degree to a set of data.  The key concepts shown here are; 1) how to create a linear using LinearSolverFactory, 2) use an adjustable linear solver, 3) and effective matrix reshaping.  This is all done using the procedural interface.&lt;br /&gt;
&lt;br /&gt;
First a best fit polynomial is fit to a set of data and then a outliers are removed from the observation set and the coefficients recomputed.  Outliers are removed efficiently using an adjustable solver that does not resolve the whole system again.&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/PolynomialFit.java PolynomialFit.java source code]&lt;br /&gt;
&lt;br /&gt;
= PolynomialFit Example Code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * This example demonstrates how a polynomial can be fit to a set of data.  This is done by&lt;br /&gt;
 * using a least squares solver that is adjustable.  By using an adjustable solver elements&lt;br /&gt;
 * can be inexpensively removed and the coefficients recomputed.  This is much less expensive&lt;br /&gt;
 * than resolving the whole system from scratch.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * The following is demonstrated:&amp;lt;br&amp;gt;&lt;br /&gt;
 * &amp;lt;ol&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;Creating a solver using LinearSolverFactory&amp;lt;/li&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;Using an adjustable solver&amp;lt;/li&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;reshaping&amp;lt;/li&amp;gt;&lt;br /&gt;
 * &amp;lt;/ol&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class PolynomialFit {&lt;br /&gt;
    // Vandermonde matrix&lt;br /&gt;
    DMatrixRMaj A;&lt;br /&gt;
    // matrix containing computed polynomial coefficients&lt;br /&gt;
    DMatrixRMaj coef;&lt;br /&gt;
    // observation matrix&lt;br /&gt;
    DMatrixRMaj y;&lt;br /&gt;
&lt;br /&gt;
    // solver used to compute&lt;br /&gt;
    AdjustableLinearSolver_DDRM solver;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     *&lt;br /&gt;
     * @param degree The polynomial&amp;#039;s degree which is to be fit to the observations.&lt;br /&gt;
     */&lt;br /&gt;
    public PolynomialFit( int degree ) {&lt;br /&gt;
        coef = new DMatrixRMaj(degree + 1, 1);&lt;br /&gt;
        A = new DMatrixRMaj(1, degree + 1);&lt;br /&gt;
        y = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
        // create a solver that allows elements to be added or removed efficiently&lt;br /&gt;
        solver = LinearSolverFactory_DDRM.adjustable();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns the computed coefficients&lt;br /&gt;
     *&lt;br /&gt;
     * @return polynomial coefficients that best fit the data.&lt;br /&gt;
     */&lt;br /&gt;
    public double[] getCoef() {&lt;br /&gt;
        return coef.data;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes the best fit set of polynomial coefficients to the provided observations.&lt;br /&gt;
     *&lt;br /&gt;
     * @param samplePoints where the observations were sampled.&lt;br /&gt;
     * @param observations A set of observations.&lt;br /&gt;
     */&lt;br /&gt;
    public void fit( double[] samplePoints, double[] observations ) {&lt;br /&gt;
        // Create a copy of the observations and put it into a matrix&lt;br /&gt;
        y.reshape(observations.length, 1, false);&lt;br /&gt;
        System.arraycopy(observations, 0, y.data, 0, observations.length);&lt;br /&gt;
&lt;br /&gt;
        // reshape the matrix to avoid unnecessarily declaring new memory&lt;br /&gt;
        // save values is set to false since its old values don&amp;#039;t matter&lt;br /&gt;
        A.reshape(y.numRows, coef.numRows, false);&lt;br /&gt;
&lt;br /&gt;
        // set up the A matrix&lt;br /&gt;
        for (int i = 0; i &amp;lt; observations.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            double obs = 1;&lt;br /&gt;
&lt;br /&gt;
            for (int j = 0; j &amp;lt; coef.numRows; j++) {&lt;br /&gt;
                A.set(i, j, obs);&lt;br /&gt;
                obs *= samplePoints[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // process the A matrix and see if it failed&lt;br /&gt;
        if (!solver.setA(A))&lt;br /&gt;
            throw new RuntimeException(&amp;quot;Solver failed&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // solver the the coefficients&lt;br /&gt;
        solver.solve(y, coef);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Removes the observation that fits the model the worst and recomputes the coefficients.&lt;br /&gt;
     * This is done efficiently by using an adjustable solver.  Often times the elements with&lt;br /&gt;
     * the largest errors are outliers and not part of the system being modeled.  By removing them&lt;br /&gt;
     * a more accurate set of coefficients can be computed.&lt;br /&gt;
     */&lt;br /&gt;
    public void removeWorstFit() {&lt;br /&gt;
        // find the observation with the most error&lt;br /&gt;
        int worstIndex = -1;&lt;br /&gt;
        double worstError = -1;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; y.numRows; i++) {&lt;br /&gt;
            double predictedObs = 0;&lt;br /&gt;
&lt;br /&gt;
            for (int j = 0; j &amp;lt; coef.numRows; j++) {&lt;br /&gt;
                predictedObs += A.get(i, j)*coef.get(j, 0);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            double error = Math.abs(predictedObs - y.get(i, 0));&lt;br /&gt;
&lt;br /&gt;
            if (error &amp;gt; worstError) {&lt;br /&gt;
                worstError = error;&lt;br /&gt;
                worstIndex = i;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // nothing left to remove, so just return&lt;br /&gt;
        if (worstIndex == -1)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        // remove that observation&lt;br /&gt;
        removeObservation(worstIndex);&lt;br /&gt;
&lt;br /&gt;
        // update A&lt;br /&gt;
        solver.removeRowFromA(worstIndex);&lt;br /&gt;
&lt;br /&gt;
        // solve for the parameters again&lt;br /&gt;
        solver.solve(y, coef);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Removes an element from the observation matrix.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index which element is to be removed&lt;br /&gt;
     */&lt;br /&gt;
    private void removeObservation( int index ) {&lt;br /&gt;
        final int N = y.numRows - 1;&lt;br /&gt;
        final double[] d = y.data;&lt;br /&gt;
&lt;br /&gt;
        // shift&lt;br /&gt;
        for (int i = index; i &amp;lt; N; i++) {&lt;br /&gt;
            d[i] = d[i + 1];&lt;br /&gt;
        }&lt;br /&gt;
        y.numRows--;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Polynomial_Fitting&amp;diff=320</id>
		<title>Example Polynomial Fitting</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Polynomial_Fitting&amp;diff=320"/>
		<updated>2021-07-07T15:29:51Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In this example it is shown how EJML can be used to fit a polynomial of arbitrary degree to a set of data.  The key concepts shown here are; 1) how to create a linear using LinearSolverFactory, 2) use an adjustable linear solver, 3) and effective matrix reshaping.  This is all done using the procedural interface.&lt;br /&gt;
&lt;br /&gt;
First a best fit polynomial is fit to a set of data and then a outliers are removed from the observation set and the coefficients recomputed.  Outliers are removed efficiently using an adjustable solver that does not resolve the whole system again.&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/PolynomialFit.java PolynomialFit.java source code]&lt;br /&gt;
* &amp;lt;disqus&amp;gt;Discuss this example&amp;lt;/disqus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= PolynomialFit Example Code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * This example demonstrates how a polynomial can be fit to a set of data.  This is done by&lt;br /&gt;
 * using a least squares solver that is adjustable.  By using an adjustable solver elements&lt;br /&gt;
 * can be inexpensively removed and the coefficients recomputed.  This is much less expensive&lt;br /&gt;
 * than resolving the whole system from scratch.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * The following is demonstrated:&amp;lt;br&amp;gt;&lt;br /&gt;
 * &amp;lt;ol&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;Creating a solver using LinearSolverFactory&amp;lt;/li&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;Using an adjustable solver&amp;lt;/li&amp;gt;&lt;br /&gt;
 *  &amp;lt;li&amp;gt;reshaping&amp;lt;/li&amp;gt;&lt;br /&gt;
 * &amp;lt;/ol&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class PolynomialFit {&lt;br /&gt;
    // Vandermonde matrix&lt;br /&gt;
    DMatrixRMaj A;&lt;br /&gt;
    // matrix containing computed polynomial coefficients&lt;br /&gt;
    DMatrixRMaj coef;&lt;br /&gt;
    // observation matrix&lt;br /&gt;
    DMatrixRMaj y;&lt;br /&gt;
&lt;br /&gt;
    // solver used to compute&lt;br /&gt;
    AdjustableLinearSolver_DDRM solver;&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Constructor.&lt;br /&gt;
     *&lt;br /&gt;
     * @param degree The polynomial&amp;#039;s degree which is to be fit to the observations.&lt;br /&gt;
     */&lt;br /&gt;
    public PolynomialFit( int degree ) {&lt;br /&gt;
        coef = new DMatrixRMaj(degree + 1, 1);&lt;br /&gt;
        A = new DMatrixRMaj(1, degree + 1);&lt;br /&gt;
        y = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
        // create a solver that allows elements to be added or removed efficiently&lt;br /&gt;
        solver = LinearSolverFactory_DDRM.adjustable();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Returns the computed coefficients&lt;br /&gt;
     *&lt;br /&gt;
     * @return polynomial coefficients that best fit the data.&lt;br /&gt;
     */&lt;br /&gt;
    public double[] getCoef() {&lt;br /&gt;
        return coef.data;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes the best fit set of polynomial coefficients to the provided observations.&lt;br /&gt;
     *&lt;br /&gt;
     * @param samplePoints where the observations were sampled.&lt;br /&gt;
     * @param observations A set of observations.&lt;br /&gt;
     */&lt;br /&gt;
    public void fit( double[] samplePoints, double[] observations ) {&lt;br /&gt;
        // Create a copy of the observations and put it into a matrix&lt;br /&gt;
        y.reshape(observations.length, 1, false);&lt;br /&gt;
        System.arraycopy(observations, 0, y.data, 0, observations.length);&lt;br /&gt;
&lt;br /&gt;
        // reshape the matrix to avoid unnecessarily declaring new memory&lt;br /&gt;
        // save values is set to false since its old values don&amp;#039;t matter&lt;br /&gt;
        A.reshape(y.numRows, coef.numRows, false);&lt;br /&gt;
&lt;br /&gt;
        // set up the A matrix&lt;br /&gt;
        for (int i = 0; i &amp;lt; observations.length; i++) {&lt;br /&gt;
&lt;br /&gt;
            double obs = 1;&lt;br /&gt;
&lt;br /&gt;
            for (int j = 0; j &amp;lt; coef.numRows; j++) {&lt;br /&gt;
                A.set(i, j, obs);&lt;br /&gt;
                obs *= samplePoints[i];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // process the A matrix and see if it failed&lt;br /&gt;
        if (!solver.setA(A))&lt;br /&gt;
            throw new RuntimeException(&amp;quot;Solver failed&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // solver the the coefficients&lt;br /&gt;
        solver.solve(y, coef);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Removes the observation that fits the model the worst and recomputes the coefficients.&lt;br /&gt;
     * This is done efficiently by using an adjustable solver.  Often times the elements with&lt;br /&gt;
     * the largest errors are outliers and not part of the system being modeled.  By removing them&lt;br /&gt;
     * a more accurate set of coefficients can be computed.&lt;br /&gt;
     */&lt;br /&gt;
    public void removeWorstFit() {&lt;br /&gt;
        // find the observation with the most error&lt;br /&gt;
        int worstIndex = -1;&lt;br /&gt;
        double worstError = -1;&lt;br /&gt;
&lt;br /&gt;
        for (int i = 0; i &amp;lt; y.numRows; i++) {&lt;br /&gt;
            double predictedObs = 0;&lt;br /&gt;
&lt;br /&gt;
            for (int j = 0; j &amp;lt; coef.numRows; j++) {&lt;br /&gt;
                predictedObs += A.get(i, j)*coef.get(j, 0);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            double error = Math.abs(predictedObs - y.get(i, 0));&lt;br /&gt;
&lt;br /&gt;
            if (error &amp;gt; worstError) {&lt;br /&gt;
                worstError = error;&lt;br /&gt;
                worstIndex = i;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // nothing left to remove, so just return&lt;br /&gt;
        if (worstIndex == -1)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        // remove that observation&lt;br /&gt;
        removeObservation(worstIndex);&lt;br /&gt;
&lt;br /&gt;
        // update A&lt;br /&gt;
        solver.removeRowFromA(worstIndex);&lt;br /&gt;
&lt;br /&gt;
        // solve for the parameters again&lt;br /&gt;
        solver.solve(y, coef);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Removes an element from the observation matrix.&lt;br /&gt;
     *&lt;br /&gt;
     * @param index which element is to be removed&lt;br /&gt;
     */&lt;br /&gt;
    private void removeObservation( int index ) {&lt;br /&gt;
        final int N = y.numRows - 1;&lt;br /&gt;
        final double[] d = y.data;&lt;br /&gt;
&lt;br /&gt;
        // shift&lt;br /&gt;
        for (int i = index; i &amp;lt; N; i++) {&lt;br /&gt;
            d[i] = d[i + 1];&lt;br /&gt;
        }&lt;br /&gt;
        y.numRows--;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Large_Dense_Matrices&amp;diff=319</id>
		<title>Example Large Dense Matrices</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Large_Dense_Matrices&amp;diff=319"/>
		<updated>2021-07-07T15:27:29Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Different approaches are required when writing high performance dense matrix operations for large matrices. For the most part, EJML will automatically switch to using these different approaches. A key parameter that needs to be tuned for specific systems is block size. It can also make sense to work directly with block matrices instead of assuming EJML does the best for your system.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/OptimizingLargeMatrixPerformance.java OptimizingLargeMatrixPerformance.java]&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * For many operations EJML provides block matrix support. These block or tiled matrices are designed to reduce&lt;br /&gt;
 * the number of cache misses which can kill performance when working on large matrices. A critical tuning parameter&lt;br /&gt;
 * is the block size and this is system specific. The example below shows you how this parameter can be optimized.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class OptimizingLargeMatrixPerformance {&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        // Create larger matrices to experiment with&lt;br /&gt;
        var rand = new Random(0xBEEF);&lt;br /&gt;
        DMatrixRMaj A = RandomMatrices_DDRM.rectangle(3000, 3000, -1, 1, rand);&lt;br /&gt;
        DMatrixRMaj B = A.copy();&lt;br /&gt;
        DMatrixRMaj C = A.createLike();&lt;br /&gt;
&lt;br /&gt;
        // Since we are dealing with larger matrices let&amp;#039;s use the concurrent implementation. By default&lt;br /&gt;
        UtilEjml.printTime(&amp;quot;Row-Major Multiplication:&amp;quot;, () -&amp;gt; CommonOps_MT_DDRM.mult(A, B, C));&lt;br /&gt;
&lt;br /&gt;
        // Converts A into a block matrix and creates a new matrix while leaving A unmodified&lt;br /&gt;
        DMatrixRBlock Ab = MatrixOps_DDRB.convert(A);&lt;br /&gt;
        // Converts A into a block matrix, but modifies it&amp;#039;s internal array inplace. The returned block matrix&lt;br /&gt;
        // will share the same data array as the input. Much more memory efficient, but you need to be careful.&lt;br /&gt;
        DMatrixRBlock Bb = MatrixOps_DDRB.convertInplace(B, null, null);&lt;br /&gt;
        DMatrixRBlock Cb = Ab.createLike();&lt;br /&gt;
&lt;br /&gt;
        // Since we are dealing with larger matrices let&amp;#039;s use the concurrent implementation. By default&lt;br /&gt;
        UtilEjml.printTime(&amp;quot;Block Multiplication:    &amp;quot;, () -&amp;gt; MatrixOps_MT_DDRB.mult(Ab, Bb, Cb));&lt;br /&gt;
&lt;br /&gt;
        // Can we make this faster? Probably by adjusting the block size. This is system dependent so let&amp;#039;s&lt;br /&gt;
        // try a range of values&lt;br /&gt;
        int defaultBlockWidth = EjmlParameters.BLOCK_WIDTH;&lt;br /&gt;
        System.out.println(&amp;quot;Default Block Size: &amp;quot; + defaultBlockWidth);&lt;br /&gt;
        for (int block : new int[]{10, 20, 30, 50, 70, 100, 140, 200, 500}) {&lt;br /&gt;
            EjmlParameters.BLOCK_WIDTH = block;&lt;br /&gt;
&lt;br /&gt;
            // Need to create the block matrices again since we changed the block size&lt;br /&gt;
            DMatrixRBlock Ac = MatrixOps_DDRB.convert(A);&lt;br /&gt;
            DMatrixRBlock Bc = MatrixOps_DDRB.convert(B);&lt;br /&gt;
            DMatrixRBlock Cc = Ac.createLike();&lt;br /&gt;
            UtilEjml.printTime(&amp;quot;Block &amp;quot; + EjmlParameters.BLOCK_WIDTH + &amp;quot;: &amp;quot;, () -&amp;gt; MatrixOps_MT_DDRB.mult(Ac, Bc, Cc));&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // On my system the optimal block size is around 100 and has an improvement of about 5%&lt;br /&gt;
        // On some architectures the improvement can be substantial in others the default value is very reasonable&lt;br /&gt;
&lt;br /&gt;
        // Some decompositions will switch to a block format automatically. Matrix multiplication might in the&lt;br /&gt;
        // future and others too. The main reason this hasn&amp;#039;t happened for it to be memory efficient it would&lt;br /&gt;
        // need to modify then undo the modification for input matrices which would be very confusion if you&amp;#039;re&lt;br /&gt;
        // writing concurrent code.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Levenberg-Marquardt&amp;diff=318</id>
		<title>Example Levenberg-Marquardt</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Levenberg-Marquardt&amp;diff=318"/>
		<updated>2021-07-07T15:26:21Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Levenberg-Marquardt (LM) is a popular non-linear optimization algorithm. This example demonstrate how a basic implementation of Levenberg-Marquardt can be created using EJML&amp;#039;s [[Procedural|procedural]] interface.  Unnecessary allocation of new memory is avoided by reshaping matrices.  When a matrix is reshaped its width and height is changed but new memory is not declared unless the new shape requires more memory than is available.&lt;br /&gt;
&lt;br /&gt;
LM works by being provided a function which computes the residual error. Residual error is defined has the difference between the predicted output and the actual observed output, e.g. f(x)-y. Optimization works&lt;br /&gt;
by finding a set of parameters which minimize the magnitude of the residuals based on the F2-norm.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Note:&amp;#039;&amp;#039;&amp;#039; This is a simple straight forward implementation of Levenberg-Marquardt and is not as robust as Minpack&amp;#039;s implementation.  If you are looking for a robust non-linear least-squares minimization library in Java check out [http://ddogleg.org DDogleg].&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/LevenbergMarquardt.java LevenbergMarquardt.java code]&lt;br /&gt;
* &amp;lt;disqus&amp;gt;Discuss this example&amp;lt;/disqus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * This is a straight forward implementation of the Levenberg-Marquardt (LM) algorithm. LM is used to minimize&lt;br /&gt;
 * non-linear cost functions:&amp;lt;br&amp;gt;&lt;br /&gt;
 * &amp;lt;br&amp;gt;&lt;br /&gt;
 * S(P) = Sum{ i=1:m , [y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt; - f(x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;,P)]&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;}&amp;lt;br&amp;gt;&lt;br /&gt;
 * &amp;lt;br&amp;gt;&lt;br /&gt;
 * where P is the set of parameters being optimized.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * In each iteration the parameters are updated using the following equations:&amp;lt;br&amp;gt;&lt;br /&gt;
 * &amp;lt;br&amp;gt;&lt;br /&gt;
 * P&amp;lt;sub&amp;gt;i+1&amp;lt;/sub&amp;gt; = (H + &amp;amp;lambda; I)&amp;lt;sup&amp;gt;-1&amp;lt;/sup&amp;gt; d &amp;lt;br&amp;gt;&lt;br /&gt;
 * d =  (1/N) Sum{ i=1..N , (f(x&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;;P&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) - y&amp;lt;sub&amp;gt;i&amp;lt;/sub&amp;gt;) * jacobian(:,i) } &amp;lt;br&amp;gt;&lt;br /&gt;
 * H =  (1/N) Sum{ i=1..N , jacobian(:,i) * jacobian(:,i)&amp;lt;sup&amp;gt;T&amp;lt;/sup&amp;gt; }&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 * &amp;lt;p&amp;gt;&lt;br /&gt;
 * Whenever possible the allocation of new memory is avoided.  This is accomplished by reshaping matrices.&lt;br /&gt;
 * A matrix that is reshaped won&amp;#039;t grow unless the new shape requires more memory than it has available.&lt;br /&gt;
 * &amp;lt;/p&amp;gt;&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class LevenbergMarquardt {&lt;br /&gt;
    // Convergence criteria&lt;br /&gt;
    private int maxIterations = 100;&lt;br /&gt;
    private double ftol = 1e-12;&lt;br /&gt;
    private double gtol = 1e-12;&lt;br /&gt;
&lt;br /&gt;
    // how much the numerical jacobian calculation perturbs the parameters by.&lt;br /&gt;
    // In better implementation there are better ways to compute this delta.  See Numerical Recipes.&lt;br /&gt;
    private final static double DELTA = 1e-8;&lt;br /&gt;
&lt;br /&gt;
    // Dampening. Larger values means it&amp;#039;s more like gradient descent&lt;br /&gt;
    private double initialLambda;&lt;br /&gt;
&lt;br /&gt;
    // the function that is optimized&lt;br /&gt;
    private ResidualFunction function;&lt;br /&gt;
&lt;br /&gt;
    // the optimized parameters and associated costs&lt;br /&gt;
    private DMatrixRMaj candidateParameters = new DMatrixRMaj(1, 1);&lt;br /&gt;
    private double initialCost;&lt;br /&gt;
    private double finalCost;&lt;br /&gt;
&lt;br /&gt;
    // used by matrix operations&lt;br /&gt;
    private DMatrixRMaj g = new DMatrixRMaj(1, 1);            // gradient&lt;br /&gt;
    private DMatrixRMaj H = new DMatrixRMaj(1, 1);            // Hessian approximation&lt;br /&gt;
    private DMatrixRMaj Hdiag = new DMatrixRMaj(1, 1);&lt;br /&gt;
    private DMatrixRMaj negativeStep = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
    // variables used by the numerical jacobian algorithm&lt;br /&gt;
    private DMatrixRMaj temp0 = new DMatrixRMaj(1, 1);&lt;br /&gt;
    private DMatrixRMaj temp1 = new DMatrixRMaj(1, 1);&lt;br /&gt;
    // used when computing d and H variables&lt;br /&gt;
    private DMatrixRMaj residuals = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
    // Where the numerical Jacobian is stored.&lt;br /&gt;
    private DMatrixRMaj jacobian = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
    public double getInitialCost() {&lt;br /&gt;
        return initialCost;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public double getFinalCost() {&lt;br /&gt;
        return finalCost;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * @param initialLambda Initial value of dampening parameter. Try 1 to start&lt;br /&gt;
     */&lt;br /&gt;
    public LevenbergMarquardt( double initialLambda ) {&lt;br /&gt;
        this.initialLambda = initialLambda;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Specifies convergence criteria&lt;br /&gt;
     *&lt;br /&gt;
     * @param maxIterations Maximum number of iterations&lt;br /&gt;
     * @param ftol convergence based on change in function value. try 1e-12&lt;br /&gt;
     * @param gtol convergence based on residual magnitude. Try 1e-12&lt;br /&gt;
     */&lt;br /&gt;
    public void setConvergence( int maxIterations, double ftol, double gtol ) {&lt;br /&gt;
        this.maxIterations = maxIterations;&lt;br /&gt;
        this.ftol = ftol;&lt;br /&gt;
        this.gtol = gtol;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Finds the best fit parameters.&lt;br /&gt;
     *&lt;br /&gt;
     * @param function The function being optimized&lt;br /&gt;
     * @param parameters (Input/Output) initial parameter estimate and storage for optimized parameters&lt;br /&gt;
     * @return true if it succeeded and false if it did not.&lt;br /&gt;
     */&lt;br /&gt;
    public boolean optimize( ResidualFunction function, DMatrixRMaj parameters ) {&lt;br /&gt;
        configure(function, parameters.getNumElements());&lt;br /&gt;
&lt;br /&gt;
        // save the cost of the initial parameters so that it knows if it improves or not&lt;br /&gt;
        double previousCost = initialCost = cost(parameters);&lt;br /&gt;
&lt;br /&gt;
        // iterate until the difference between the costs is insignificant&lt;br /&gt;
        double lambda = initialLambda;&lt;br /&gt;
&lt;br /&gt;
        // if it should recompute the Jacobian in this iteration or not&lt;br /&gt;
        boolean computeHessian = true;&lt;br /&gt;
&lt;br /&gt;
        for (int iter = 0; iter &amp;lt; maxIterations; iter++) {&lt;br /&gt;
            if (computeHessian) {&lt;br /&gt;
                // compute some variables based on the gradient&lt;br /&gt;
                computeGradientAndHessian(parameters);&lt;br /&gt;
                computeHessian = false;&lt;br /&gt;
&lt;br /&gt;
                // check for convergence using gradient test&lt;br /&gt;
                boolean converged = true;&lt;br /&gt;
                for (int i = 0; i &amp;lt; g.getNumElements(); i++) {&lt;br /&gt;
                    if (Math.abs(g.data[i]) &amp;gt; gtol) {&lt;br /&gt;
                        converged = false;&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                if (converged)&lt;br /&gt;
                    return true;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // H = H + lambda*I&lt;br /&gt;
            for (int i = 0; i &amp;lt; H.numRows; i++) {&lt;br /&gt;
                H.set(i, i, Hdiag.get(i) + lambda);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // In robust implementations failure to solve is handled much better&lt;br /&gt;
            if (!CommonOps_DDRM.solve(H, g, negativeStep)) {&lt;br /&gt;
                return false;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            // compute the candidate parameters&lt;br /&gt;
            CommonOps_DDRM.subtract(parameters, negativeStep, candidateParameters);&lt;br /&gt;
&lt;br /&gt;
            double cost = cost(candidateParameters);&lt;br /&gt;
            if (cost &amp;lt;= previousCost) {&lt;br /&gt;
                // the candidate parameters produced better results so use it&lt;br /&gt;
                computeHessian = true;&lt;br /&gt;
                parameters.setTo(candidateParameters);&lt;br /&gt;
&lt;br /&gt;
                // check for convergence&lt;br /&gt;
                // ftol &amp;lt;= (cost(k) - cost(k+1))/cost(k)&lt;br /&gt;
                boolean converged = ftol*previousCost &amp;gt;= previousCost - cost;&lt;br /&gt;
&lt;br /&gt;
                previousCost = cost;&lt;br /&gt;
                lambda /= 10.0;&lt;br /&gt;
&lt;br /&gt;
                if (converged) {&lt;br /&gt;
                    return true;&lt;br /&gt;
                }&lt;br /&gt;
            } else {&lt;br /&gt;
                lambda *= 10.0;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        finalCost = previousCost;&lt;br /&gt;
        return true;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Performs sanity checks on the input data and reshapes internal matrices.  By reshaping&lt;br /&gt;
     * a matrix it will only declare new memory when needed.&lt;br /&gt;
     */&lt;br /&gt;
    protected void configure( ResidualFunction function, int numParam ) {&lt;br /&gt;
        this.function = function;&lt;br /&gt;
        int numFunctions = function.numFunctions();&lt;br /&gt;
&lt;br /&gt;
        // reshaping a matrix means that new memory is only declared when needed&lt;br /&gt;
        candidateParameters.reshape(numParam, 1);&lt;br /&gt;
        g.reshape(numParam, 1);&lt;br /&gt;
        H.reshape(numParam, numParam);&lt;br /&gt;
        negativeStep.reshape(numParam, 1);&lt;br /&gt;
&lt;br /&gt;
        // Normally these variables are thought of as row vectors, but it works out easier if they are column&lt;br /&gt;
        temp0.reshape(numFunctions, 1);&lt;br /&gt;
        temp1.reshape(numFunctions, 1);&lt;br /&gt;
        residuals.reshape(numFunctions, 1);&lt;br /&gt;
        jacobian.reshape(numFunctions, numParam);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes the d and H parameters.&lt;br /&gt;
     *&lt;br /&gt;
     * d = J&amp;#039;*(f(x)-y)    &amp;lt;--- that&amp;#039;s also the gradient&lt;br /&gt;
     * H = J&amp;#039;*J&lt;br /&gt;
     */&lt;br /&gt;
    private void computeGradientAndHessian( DMatrixRMaj param ) {&lt;br /&gt;
        // residuals = f(x) - y&lt;br /&gt;
        function.compute(param, residuals);&lt;br /&gt;
&lt;br /&gt;
        computeNumericalJacobian(param, jacobian);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.multTransA(jacobian, residuals, g);&lt;br /&gt;
        CommonOps_DDRM.multTransA(jacobian, jacobian, H);&lt;br /&gt;
&lt;br /&gt;
        CommonOps_DDRM.extractDiag(H, Hdiag);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes the &amp;quot;cost&amp;quot; for the parameters given.&lt;br /&gt;
     *&lt;br /&gt;
     * cost = (1/N) Sum (f(x) - y)^2&lt;br /&gt;
     */&lt;br /&gt;
    private double cost( DMatrixRMaj param ) {&lt;br /&gt;
        function.compute(param, residuals);&lt;br /&gt;
&lt;br /&gt;
        double error = NormOps_DDRM.normF(residuals);&lt;br /&gt;
&lt;br /&gt;
        return error*error/(double)residuals.numRows;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * Computes a simple numerical Jacobian.&lt;br /&gt;
     *&lt;br /&gt;
     * @param param (input) The set of parameters that the Jacobian is to be computed at.&lt;br /&gt;
     * @param jacobian (output) Where the jacobian will be stored&lt;br /&gt;
     */&lt;br /&gt;
    protected void computeNumericalJacobian( DMatrixRMaj param,&lt;br /&gt;
                                             DMatrixRMaj jacobian ) {&lt;br /&gt;
        double invDelta = 1.0/DELTA;&lt;br /&gt;
&lt;br /&gt;
        function.compute(param, temp0);&lt;br /&gt;
&lt;br /&gt;
        // compute the jacobian by perturbing the parameters slightly&lt;br /&gt;
        // then seeing how it effects the results.&lt;br /&gt;
        for (int i = 0; i &amp;lt; param.getNumElements(); i++) {&lt;br /&gt;
            param.data[i] += DELTA;&lt;br /&gt;
            function.compute(param, temp1);&lt;br /&gt;
            // compute the difference between the two parameters and divide by the delta&lt;br /&gt;
            // temp1 = (temp1 - temp0)/delta&lt;br /&gt;
            CommonOps_DDRM.add(invDelta, temp1, -invDelta, temp0, temp1);&lt;br /&gt;
&lt;br /&gt;
            // copy the results into the jacobian matrix&lt;br /&gt;
            // J(i,:) = temp1&lt;br /&gt;
            CommonOps_DDRM.insert(temp1, jacobian, 0, i);&lt;br /&gt;
&lt;br /&gt;
            param.data[i] -= DELTA;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    /**&lt;br /&gt;
     * The function that is being optimized. Returns the residual. f(x) - y&lt;br /&gt;
     */&lt;br /&gt;
    public interface ResidualFunction {&lt;br /&gt;
        /**&lt;br /&gt;
         * Computes the residual vector given the set of input parameters&lt;br /&gt;
         * Function which goes from N input to M outputs&lt;br /&gt;
         *&lt;br /&gt;
         * @param param (Input) N by 1 parameter vector&lt;br /&gt;
         * @param residual (Output) M by 1 output vector to store the residual = f(x)-y&lt;br /&gt;
         */&lt;br /&gt;
        void compute( DMatrixRMaj param, DMatrixRMaj residual );&lt;br /&gt;
&lt;br /&gt;
        /**&lt;br /&gt;
         * Number of functions in output&lt;br /&gt;
         *&lt;br /&gt;
         * @return function count&lt;br /&gt;
         */&lt;br /&gt;
        int numFunctions();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Sparse_Matrices&amp;diff=317</id>
		<title>Example Sparse Matrices</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Sparse_Matrices&amp;diff=317"/>
		<updated>2021-07-07T15:25:22Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Support for sparse matrices has recently been added to EJML. It supports many but not all of the standard operations that are supported for dense matrics. The code below shows the basics of working with a sparse matrix. In some situations the speed improvement of using a sparse matrix can be substantial. Do note that if your system isn&amp;#039;t sparse enough or if its structure isn&amp;#039;t advantageous it could run even slower using sparse operations!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Type !! Execution Time (ms) &lt;br /&gt;
|-&lt;br /&gt;
| Dense || 12660&lt;br /&gt;
|-&lt;br /&gt;
| Sparse || 1642&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleSparseMatrix.java ExampleSparseMatrix.java]&lt;br /&gt;
&lt;br /&gt;
== Sparse Matrix Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example showing how to construct and solve a linear system using sparse matrices&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleSparseMatrix {&lt;br /&gt;
    public static int ROWS = 100000;&lt;br /&gt;
    public static int COLS = 1000;&lt;br /&gt;
    public static int XCOLS = 1;&lt;br /&gt;
&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        Random rand = new Random(234);&lt;br /&gt;
&lt;br /&gt;
        // easy to work with sparse format, but hard to do computations with&lt;br /&gt;
        // NOTE: It is very important to you set &amp;#039;initLength&amp;#039; to the actual number of elements in the final array&lt;br /&gt;
        //       If you don&amp;#039;t it will be forced to thrash memory as it grows its internal data structures.&lt;br /&gt;
        //       Failure to heed this advice will make construction of large matrices 4x slower and use 2x more memory&lt;br /&gt;
        DMatrixSparseTriplet work = new DMatrixSparseTriplet(5, 4, 5);&lt;br /&gt;
        work.addItem(0, 1, 1.2);&lt;br /&gt;
        work.addItem(3, 0, 3);&lt;br /&gt;
        work.addItem(1, 1, 22.21234);&lt;br /&gt;
        work.addItem(2, 3, 6);&lt;br /&gt;
&lt;br /&gt;
        // convert into a format that&amp;#039;s easier to perform math with&lt;br /&gt;
        DMatrixSparseCSC Z = DConvertMatrixStruct.convert(work, (DMatrixSparseCSC)null);&lt;br /&gt;
&lt;br /&gt;
        // print the matrix to standard out in two different formats&lt;br /&gt;
        Z.print();&lt;br /&gt;
        System.out.println();&lt;br /&gt;
        Z.printNonZero();&lt;br /&gt;
        System.out.println();&lt;br /&gt;
&lt;br /&gt;
        // Create a large matrix that is 5% filled&lt;br /&gt;
        DMatrixSparseCSC A = RandomMatrices_DSCC.rectangle(ROWS, COLS, (int)(ROWS*COLS*0.05), rand);&lt;br /&gt;
        //          large vector that is 70% filled&lt;br /&gt;
        DMatrixSparseCSC x = RandomMatrices_DSCC.rectangle(COLS, XCOLS, (int)(XCOLS*COLS*0.7), rand);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Done generating random matrices&amp;quot;);&lt;br /&gt;
        // storage for the initial solution&lt;br /&gt;
        DMatrixSparseCSC y = new DMatrixSparseCSC(ROWS, XCOLS, 0);&lt;br /&gt;
        DMatrixSparseCSC z = new DMatrixSparseCSC(ROWS, XCOLS, 0);&lt;br /&gt;
&lt;br /&gt;
        // To demonstration how to perform sparse math let&amp;#039;s multiply:&lt;br /&gt;
        //                  y=A*x&lt;br /&gt;
        // Optional storage is set to null so that it will declare it internally&lt;br /&gt;
        long before = System.currentTimeMillis();&lt;br /&gt;
        IGrowArray workA = new IGrowArray(A.numRows);&lt;br /&gt;
        DGrowArray workB = new DGrowArray(A.numRows);&lt;br /&gt;
        for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
            CommonOps_DSCC.mult(A, x, y, workA, workB);&lt;br /&gt;
            CommonOps_DSCC.add(1.5, y, 0.75, y, z, workA, workB);&lt;br /&gt;
        }&lt;br /&gt;
        long after = System.currentTimeMillis();&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;norm = &amp;quot; + NormOps_DSCC.fastNormF(y) + &amp;quot;  sparse time = &amp;quot; + (after - before) + &amp;quot; ms&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        DMatrixRMaj Ad = DConvertMatrixStruct.convert(A, (DMatrixRMaj)null);&lt;br /&gt;
        DMatrixRMaj xd = DConvertMatrixStruct.convert(x, (DMatrixRMaj)null);&lt;br /&gt;
        DMatrixRMaj yd = new DMatrixRMaj(y.numRows, y.numCols);&lt;br /&gt;
        DMatrixRMaj zd = new DMatrixRMaj(y.numRows, y.numCols);&lt;br /&gt;
&lt;br /&gt;
        before = System.currentTimeMillis();&lt;br /&gt;
        for (int i = 0; i &amp;lt; 100; i++) {&lt;br /&gt;
            CommonOps_DDRM.mult(Ad, xd, yd);&lt;br /&gt;
            CommonOps_DDRM.add(1.5, yd, 0.75, yd, zd);&lt;br /&gt;
        }&lt;br /&gt;
        after = System.currentTimeMillis();&lt;br /&gt;
        System.out.println(&amp;quot;norm = &amp;quot; + NormOps_DDRM.fastNormF(yd) + &amp;quot;  dense time  = &amp;quot; + (after - before) + &amp;quot; ms&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Masked_Triangle_Count&amp;diff=316</id>
		<title>Example Masked Triangle Count</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Masked_Triangle_Count&amp;diff=316"/>
		<updated>2021-07-07T15:23:21Z</updated>

		<summary type="html">&lt;p&gt;Peter: Created page with &amp;quot;Many Graph operations can be performed using linear algebra and this connection is the subject of much recent research. EJML now has basic &amp;quot;Graph BLAS&amp;quot; capabilities as this ex...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many Graph operations can be performed using linear algebra and this connection is the subject of much recent research. EJML now has basic &amp;quot;Graph BLAS&amp;quot; capabilities as this example shows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleMaskedTriangleCount.java ExampleMaskedTriangleCount.java]&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example using masked matrix multiplication to count the triangles in a graph.&lt;br /&gt;
 * Triangle counting is used to detect communities in graphs and often used to analyse social graphs.&lt;br /&gt;
 *&lt;br /&gt;
 * More about the connection between graphs and linear algebra can be found at:&lt;br /&gt;
 * https://github.com/GraphBLAS/GraphBLAS-Pointers.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Florentin Doerre&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleMaskedTriangleCount {&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        // For the example we will be using the following graph:&lt;br /&gt;
        // (0)--(1)--(2)--(0), (2)--(3)--(4)--(2), (5)&lt;br /&gt;
        var adjacencyMatrix = new DMatrixSparseCSC(6, 6, 24);&lt;br /&gt;
        adjacencyMatrix.set(0, 1, 1);&lt;br /&gt;
        adjacencyMatrix.set(0, 2, 1);&lt;br /&gt;
        adjacencyMatrix.set(1, 2, 1);&lt;br /&gt;
        adjacencyMatrix.set(2, 3, 1);&lt;br /&gt;
        adjacencyMatrix.set(2, 4, 1);&lt;br /&gt;
        adjacencyMatrix.set(3, 4, 1);&lt;br /&gt;
&lt;br /&gt;
        // Triangle Count is defined over undirected graphs, therefore we make matrix symmetric (i.e. undirected)&lt;br /&gt;
        adjacencyMatrix.copy().createCoordinateIterator().forEachRemaining(v -&amp;gt; adjacencyMatrix.set(v.col, v.row, v.value));&lt;br /&gt;
&lt;br /&gt;
        // In a graph context mxm computes all path of length 2 (a-&amp;gt;b-&amp;gt;c).&lt;br /&gt;
        // But, for triangles we are only interested in the &amp;quot;closed&amp;quot; path which form a triangle (a-&amp;gt;b-&amp;gt;c-&amp;gt;a).&lt;br /&gt;
        // To avoid computing irrelevant paths, we can use the adjacency matrix as the mask, which assures (a-&amp;gt;c) exists.&lt;br /&gt;
        var mask = DMaskFactory.builder(adjacencyMatrix, true).build();&lt;br /&gt;
        var triangleMatrix = CommonOpsWithSemiRing_DSCC.mult(adjacencyMatrix, adjacencyMatrix, null, DSemiRings.PLUS_TIMES, mask, null, null);&lt;br /&gt;
&lt;br /&gt;
        // To compute the triangles per vertex we calculate the sum per each row.&lt;br /&gt;
        // For the correct count, we need to divide the count by 2 as each triangle was counted twice (a--b--c, and a--c--b)&lt;br /&gt;
        var trianglesPerVertex = CommonOps_DSCC.reduceRowWise(triangleMatrix, 0, Double::sum, null);&lt;br /&gt;
        CommonOps_DDRM.apply(trianglesPerVertex, v -&amp;gt; v/2);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Triangles including vertex 0 &amp;quot; + trianglesPerVertex.get(0));&lt;br /&gt;
        System.out.println(&amp;quot;Triangles including vertex 2 &amp;quot; + trianglesPerVertex.get(2));&lt;br /&gt;
        System.out.println(&amp;quot;Triangles including vertex 5 &amp;quot; + trianglesPerVertex.get(5));&lt;br /&gt;
&lt;br /&gt;
        // Note: To avoid counting each triangle twice, the lower triangle over the adjacency matrix can be used TRI&amp;lt;A&amp;gt; = A * L&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Manual&amp;diff=315</id>
		<title>Manual</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Manual&amp;diff=315"/>
		<updated>2021-07-07T15:22:31Z</updated>

		<summary type="html">&lt;p&gt;Peter: /* Example Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= The Basics =&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a Java library for performing standard linear algebra operations on dense matrices.  Typically the list of standard operations is divided up unto basic (addition, subtraction, multiplication, ...etc), decompositions (LU, QR, SVD, ... etc), and solving linear systems.  A complete list of its core functionality can be found on the [[Capabilities]] page.&lt;br /&gt;
&lt;br /&gt;
This manual describes how to use and develop an application using EJML.  Other questions, like how to build or include it in your project, is provided in the list below.  If you have a question which isn&amp;#039;t answered or is confusion feel free to post a question on the message board!  Instructions on how to use EJML is primarily done in this manual through example, see below.  The examples are selected from common real-world problems, such as Kalman filters.  Some times the same example is provided in three different formats using one of the three interfaces provided in EJML to help you understand the differences.&lt;br /&gt;
&lt;br /&gt;
* [[Download|Download and Building]]&lt;br /&gt;
* [[Frequently Asked Questions|Frequently Asked Questions]]&lt;br /&gt;
* [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
&lt;br /&gt;
EJML is compatible with Java 1.8 and beyond.&lt;br /&gt;
&lt;br /&gt;
== The Interfaces ==&lt;br /&gt;
&lt;br /&gt;
A primary design goal of EJML was to provide users the capability to write both highly optimized code and easy to read/write code.  Since it&amp;#039;s hard to do this with a single API BoofCV provides three different ways to interact with it.&lt;br /&gt;
&lt;br /&gt;
* [[Procedural]]:  You have full access to all of EJML&amp;#039;s capabilities, can select individual algorithms, and almost complete control over memory.  The downside is it feels a bit like you&amp;#039;re programming in assembly and it&amp;#039;s tedious to have that much control over memory.&lt;br /&gt;
* [[SimpleMatrix]]:  An object oriented API that allows you to connect multiple operations together using a flow strategy, which is much easier to read and write.  Limited subset of operations are supported and memory is constantly created and destroyed.&lt;br /&gt;
* [[Equations]]: Is a symbolic interface that allows you to manipulate matrices in a similar manor to Matlab/Octave.  Can be precompiled and won&amp;#039;t declare new memory if the input size doesn&amp;#039;t change.  It&amp;#039;s a bit of a black box and the compiler isn&amp;#039;t smart enough to pick the most efficient functions.&lt;br /&gt;
&lt;br /&gt;
Example of compute the Kalman gain &amp;quot;K&amp;quot;&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) ) &lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
It&amp;#039;s hard to say which interface is the best.  If you are dealing with small matrices and need to write highly optimized code then &amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039; is the way to go.  For large matrices it doesn&amp;#039;t really matter which one you use since the overhead is insignificant compared to the matrix operations.  If you want to write something quickly then [[SimpleMatrix]] or [[Equations]] is the way to go.  For those of you who are concerned about performance, I recommend coding it up first using SimpleMatrix or Equations then benchmarking to see if that code is a bottleneck.  Much easier to debug that way.&lt;br /&gt;
&lt;br /&gt;
[[Performance|Comparison of Interface Runtime Performance]]&lt;br /&gt;
&lt;br /&gt;
= Tutorials =&lt;br /&gt;
&lt;br /&gt;
* [[Matlab to EJML|Matlab to EJML]]&lt;br /&gt;
* [[Tutorial Complex|Complex]]&lt;br /&gt;
* [[Solving Linear Systems|Solving Linear Systems]]&lt;br /&gt;
* [[Matrix Decompositions|Matrix Decompositions]]&lt;br /&gt;
* [[Random matrices, Matrix Features, and Matrix Norms]]&lt;br /&gt;
* [[Extract and Insert|Extracting and Inserting submatrices and vectors]]&lt;br /&gt;
* [[Input and Output|Matrix Input/Output]]&lt;br /&gt;
* [[Unit Testing]]&lt;br /&gt;
&lt;br /&gt;
= Example Code =&lt;br /&gt;
&lt;br /&gt;
The follow are code examples of common linear algebra problems intended to demonstrate different parts of EJML.  In the table below it indicates which interface or interfaces the example uses.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! Name !! Procedural !! SimpleMatrix !! Equations &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Kalman Filter|Kalman Filter]] || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Sparse Matrices|Sparse Matrix Basics]] || X ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Levenberg-Marquardt|Levenberg-Marquardt]] || X ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Principal Component Analysis|Principal Component Analysis]] || X ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Polynomial Fitting|Polynomial Fitting]] || X ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Polynomial Roots|Polynomial Roots]] || X ||  || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Customizing Equations|Customizing Equations]] || || || X&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Customizing SimpleMatrix|Customizing SimpleMatrix]] || || X || &lt;br /&gt;
|-&lt;br /&gt;
| [[Example Fixed Sized Matrices|Fixed Sized Matrices]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Complex Math|Complex Math]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Complex Matrices|Complex Matrices]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Concurrent Operations|Concurrent Operations]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Graph Paths|(GraphBLAS) Graph Paths]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Masked Triangle Count|(GraphBLAS) Masked Triangle Count]] || X || ||&lt;br /&gt;
|-&lt;br /&gt;
| [[Example Large Dense Matrices|Optimizing Large Dense]] || X || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= External References =&lt;br /&gt;
&lt;br /&gt;
Want to learn more about how EJML works to write more effective code and employ more advanced techniques?  Understand where EJML&amp;#039;s logo comes from?  The following books are recommended reading and made EJML&amp;#039;s early development possible.&lt;br /&gt;
* Best introduction to the subject that balances clarity without sacrificing important implementation details:&lt;br /&gt;
** Fundamentals of Matrix Computations by David S. Watkins&lt;br /&gt;
* Classic reference book that tersely covers hundreds of algorithms&lt;br /&gt;
** Matrix Computations by G. Golub and C. Van Loan&lt;br /&gt;
* Direct Methods for Sparse Linear Systems by Timothy A. Davis&lt;br /&gt;
** Covers the sparse algorithms used in EJML&lt;br /&gt;
* Popular book on linear algebra&lt;br /&gt;
** Linear Algebra and Its Applications by Gilbert Strang&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Graph_Paths&amp;diff=314</id>
		<title>Example Graph Paths</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Graph_Paths&amp;diff=314"/>
		<updated>2021-07-07T15:08:10Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Many Graph operations can be performed using linear algebra and this connection is the subject of much recent research. EJML now has basic &amp;quot;Graph BLAS&amp;quot; capabilities as this example shows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleGraphPaths.java ExampleGraphPaths.java]&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example including one iteration of the graph traversal algorithm breath-first-search (BFS),&lt;br /&gt;
 * using different semirings. So following the outgoing relationships for a set of starting nodes.&lt;br /&gt;
 *&lt;br /&gt;
 * More about the connection between graphs and linear algebra can be found at:&lt;br /&gt;
 * https://github.com/GraphBLAS/GraphBLAS-Pointers.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Florentin Doerre&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleGraphPaths {&lt;br /&gt;
    private static final int NODE_COUNT = 4;&lt;br /&gt;
&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        DMatrixSparseCSC adjacencyMatrix = new DMatrixSparseCSC(NODE_COUNT, 4);&lt;br /&gt;
&lt;br /&gt;
        // For the example we will be using the following graph:&lt;br /&gt;
        // (3)&amp;lt;-[cost: 0.2]-(0)&amp;lt;-[cost: 0.1]-&amp;gt;(2)&amp;lt;-[cost: 0.3]-(1)&lt;br /&gt;
&lt;br /&gt;
        adjacencyMatrix.set(0, 2, 0.1);&lt;br /&gt;
        adjacencyMatrix.set(0, 3, 0.2);&lt;br /&gt;
        adjacencyMatrix.set(2, 0, 0.1);&lt;br /&gt;
        adjacencyMatrix.set(3, 2, 0.3);&lt;br /&gt;
&lt;br /&gt;
        // Semirings are used to redefine + and * f.i. with OR for + and AND for *&lt;br /&gt;
        DSemiRing lor_land = DSemiRings.OR_AND;&lt;br /&gt;
        DSemiRing min_times = DSemiRings.MIN_TIMES;&lt;br /&gt;
        DSemiRing plus_land = new DSemiRing(DMonoids.PLUS, DMonoids.AND);&lt;br /&gt;
&lt;br /&gt;
        // sparse Vector (Matrix with one column)&lt;br /&gt;
        DMatrixSparseCSC startNodes = new DMatrixSparseCSC(1, NODE_COUNT);&lt;br /&gt;
        // setting the node 0 as the start-node&lt;br /&gt;
        startNodes.set(0, 0, 1);&lt;br /&gt;
&lt;br /&gt;
        DMatrixSparseCSC outputVector = startNodes.createLike();&lt;br /&gt;
&lt;br /&gt;
        // Compute which nodes can be reached from the node 0 (disregarding the costs of the relationship)&lt;br /&gt;
        CommonOpsWithSemiRing_DSCC.mult(startNodes, adjacencyMatrix, outputVector, lor_land, null, null, null);&lt;br /&gt;
&lt;br /&gt;
        System.out.println(&amp;quot;Node 3 can be reached from node 0: &amp;quot; + (outputVector.get(0, 3) == 1));&lt;br /&gt;
        System.out.println(&amp;quot;Node 1 can be reached from node 0: &amp;quot; + (outputVector.get(0, 1) == 1));&lt;br /&gt;
&lt;br /&gt;
        // Add node 3 to the start nodes&lt;br /&gt;
        startNodes.set(0, 3, 1);&lt;br /&gt;
&lt;br /&gt;
        // Find the number of path the nodes can be reached with&lt;br /&gt;
        CommonOpsWithSemiRing_DSCC.mult(startNodes, adjacencyMatrix, outputVector, plus_land, null, null, null);&lt;br /&gt;
        System.out.println(&amp;quot;The number of start-nodes leading to node 2 is &amp;quot; + (int)outputVector.get(0, 2));&lt;br /&gt;
&lt;br /&gt;
        // Find the path with the minimal cost (direct connection from one of the specified starting nodes)&lt;br /&gt;
        // the calculated cost equals the cost specified in the relationship (as both startNodes have a weight of 1)&lt;br /&gt;
        // as an alternative you could use the MIN_PLUS semiring to consider the existing cost specified in the startNodes vector&lt;br /&gt;
        CommonOpsWithSemiRing_DSCC.mult(startNodes, adjacencyMatrix, outputVector, min_times, null, null, null);&lt;br /&gt;
        System.out.println(&amp;quot;The minimal cost to reach the node 2 is &amp;quot; + outputVector.get(0, 2));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Concurrent_Operations&amp;diff=313</id>
		<title>Example Concurrent Operations</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Concurrent_Operations&amp;diff=313"/>
		<updated>2021-07-07T15:05:16Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Concurrent or Mult Threaded operations are a relatively recent to EJML. EJML has traditionally been focused on single threaded performance but this recently changed when &amp;quot;low hanging fruit&amp;quot; has been converted into threaded code. Not all and in fact most operations don&amp;#039;t have threaded variants yet and it is always possible to call code which is purely single threaded. See below for more details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/ExampleConcurrent.java ExampleConcurrent.java code]&lt;br /&gt;
&lt;br /&gt;
== Example Code ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Concurrent or multi-threaded algorithms are a recent addition to EJML. Classes with concurrent implementations&lt;br /&gt;
 * can be identified with _MT_ in the class name. For example CommonOps_MT_DDRM will contain concurrent implementations&lt;br /&gt;
 * of operations such as matrix multiplication for dense row-major algorithms. Not everything has a concurrent&lt;br /&gt;
 * implementation yet and in some cases entirely new algorithms will need to be implemented.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class ExampleConcurrent {&lt;br /&gt;
    public static void main( String[] args ) {&lt;br /&gt;
        // Create a few random matrices that we will multiply and decompose&lt;br /&gt;
        var rand = new Random(0xBEEF);&lt;br /&gt;
        DMatrixRMaj A = RandomMatrices_DDRM.rectangle(4000, 4000, -1, 1, rand);&lt;br /&gt;
        DMatrixRMaj B = RandomMatrices_DDRM.rectangle(A.numCols, 1000, -1, 1, rand);&lt;br /&gt;
        DMatrixRMaj C = new DMatrixRMaj(1, 1);&lt;br /&gt;
&lt;br /&gt;
        // First do a concurrent matrix multiply using the default number of threads&lt;br /&gt;
        System.out.println(&amp;quot;Matrix Multiply, threads=&amp;quot; + EjmlConcurrency.getMaxThreads());&lt;br /&gt;
        UtilEjml.printTime(&amp;quot;  &amp;quot;, &amp;quot;Elapsed: &amp;quot;, () -&amp;gt; CommonOps_MT_DDRM.mult(A, B, C));&lt;br /&gt;
&lt;br /&gt;
        // Set it to two threads&lt;br /&gt;
        EjmlConcurrency.setMaxThreads(2);&lt;br /&gt;
        System.out.println(&amp;quot;Matrix Multiply, threads=&amp;quot; + EjmlConcurrency.getMaxThreads());&lt;br /&gt;
        UtilEjml.printTime(&amp;quot;  &amp;quot;, &amp;quot;Elapsed: &amp;quot;, () -&amp;gt; CommonOps_MT_DDRM.mult(A, B, C));&lt;br /&gt;
&lt;br /&gt;
        // Then let&amp;#039;s compare it against the single thread implementation&lt;br /&gt;
        System.out.println(&amp;quot;Matrix Multiply, Single Thread&amp;quot;);&lt;br /&gt;
        UtilEjml.printTime(&amp;quot;  &amp;quot;, &amp;quot;Elapsed: &amp;quot;, () -&amp;gt; CommonOps_DDRM.mult(A, B, C));&lt;br /&gt;
&lt;br /&gt;
        // Setting the number of threads to 1 then running am MT implementation actually calls completely different&lt;br /&gt;
        // code than the regular function calls and will be less efficient. This will probably only be evident on&lt;br /&gt;
        // small matrices though&lt;br /&gt;
&lt;br /&gt;
        // If the future we will provide a way to optionally automatically switch to concurrent implementations&lt;br /&gt;
        // for larger when calling standard functions.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Example_Kalman_Filter&amp;diff=312</id>
		<title>Example Kalman Filter</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Example_Kalman_Filter&amp;diff=312"/>
		<updated>2021-07-07T15:02:57Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
Here are three examples that demonstrate how a [http://en.wikipedia.org/wiki/Kalman_filter Kalman filter] can be created using different API&amp;#039;s in EJML.  Each API has different advantages and disadvantages.  High level interfaces tend to be easier to use, but sacrifice efficiency.  The intent of this article is to illustrate this trend empirically.  Runtime performance of each approach is shown below.  To see how complex and readable each approach is check out the source code below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! API !! Execution Time (ms) &lt;br /&gt;
|-&lt;br /&gt;
| SimpleMatrix || 1875&lt;br /&gt;
|-&lt;br /&gt;
| Operations || 1280&lt;br /&gt;
|-&lt;br /&gt;
| Equations || 1698 &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
External Resources:&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/KalmanFilterSimple.java KalmanFilterSimple]&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/KalmanFilterOperations.java KalmanFilterOperations]&lt;br /&gt;
* [https://github.com/lessthanoptimal/ejml/blob/v0.41/examples/src/org/ejml/example/KalmanFilterEquation.java KalmanFilterEquation]&lt;br /&gt;
* &amp;lt;disqus&amp;gt;Discuss this example&amp;lt;/disqus&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;NOTE:&amp;#039;&amp;#039;&amp;#039; While the Kalman filter code below is fully functional and will work well in most applications, it might not be the best.  Other variants seek to improve stability and/or avoid the matrix inversion.  It&amp;#039;s worth point out that some people say you should never invert the matrix in a Kalman filter.  There are applications, such as target tracking, where matrix inversion of the innovation covariance is helpful as a preprocessing step.&lt;br /&gt;
&lt;br /&gt;
== SimpleMatrix Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * A Kalman filter implemented using SimpleMatrix.  The code tends to be easier to&lt;br /&gt;
 * read and write, but the performance is degraded due to excessive creation/destruction of&lt;br /&gt;
 * memory and the use of more generic algorithms.  This also demonstrates how code can be&lt;br /&gt;
 * seamlessly implemented using both SimpleMatrix and DMatrixRMaj.  This allows code&lt;br /&gt;
 * to be quickly prototyped or to be written either by novices or experts.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterSimple implements KalmanFilter {&lt;br /&gt;
    // kinematics description&lt;br /&gt;
    private SimpleMatrix F, Q, H;&lt;br /&gt;
&lt;br /&gt;
    // sytem state estimate&lt;br /&gt;
    private SimpleMatrix x, P;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        this.F = new SimpleMatrix(F);&lt;br /&gt;
        this.Q = new SimpleMatrix(Q);&lt;br /&gt;
        this.H = new SimpleMatrix(H);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x = new SimpleMatrix(x);&lt;br /&gt;
        this.P = new SimpleMatrix(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        // x = F x&lt;br /&gt;
        x = F.mult(x);&lt;br /&gt;
&lt;br /&gt;
        // P = F P F&amp;#039; + Q&lt;br /&gt;
        P = F.mult(P).mult(F.transpose()).plus(Q);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj _z, DMatrixRMaj _R ) {&lt;br /&gt;
        // a fast way to make the matrices usable by SimpleMatrix&lt;br /&gt;
        SimpleMatrix z = SimpleMatrix.wrap(_z);&lt;br /&gt;
        SimpleMatrix R = SimpleMatrix.wrap(_R);&lt;br /&gt;
&lt;br /&gt;
        // y = z - H x&lt;br /&gt;
        SimpleMatrix y = z.minus(H.mult(x));&lt;br /&gt;
&lt;br /&gt;
        // S = H P H&amp;#039; + R&lt;br /&gt;
        SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
&lt;br /&gt;
        // K = PH&amp;#039;S^(-1)&lt;br /&gt;
        SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&lt;br /&gt;
        // x = x + Ky&lt;br /&gt;
        x = x.plus(K.mult(y));&lt;br /&gt;
&lt;br /&gt;
        // P = (I-kH)P = P - KHP&lt;br /&gt;
        P = P.minus(K.mult(H).mult(P));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x.getMatrix(); }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P.getMatrix(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Operations Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * A Kalman filter that is implemented using the operations API, which is procedural.  Much of the excessive&lt;br /&gt;
 * memory creation/destruction has been reduced from the KalmanFilterSimple. A specialized solver is&lt;br /&gt;
 * under to invert the SPD matrix.&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterOperations implements KalmanFilter {&lt;br /&gt;
    // kinematics description&lt;br /&gt;
    private DMatrixRMaj F, Q, H;&lt;br /&gt;
&lt;br /&gt;
    // system state estimate&lt;br /&gt;
    private DMatrixRMaj x, P;&lt;br /&gt;
&lt;br /&gt;
    // these are predeclared for efficiency reasons&lt;br /&gt;
    private DMatrixRMaj a, b;&lt;br /&gt;
    private DMatrixRMaj y, S, S_inv, c, d;&lt;br /&gt;
    private DMatrixRMaj K;&lt;br /&gt;
&lt;br /&gt;
    private LinearSolverDense&amp;lt;DMatrixRMaj&amp;gt; solver;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        this.F = F;&lt;br /&gt;
        this.Q = Q;&lt;br /&gt;
        this.H = H;&lt;br /&gt;
&lt;br /&gt;
        int dimenX = F.numCols;&lt;br /&gt;
        int dimenZ = H.numRows;&lt;br /&gt;
&lt;br /&gt;
        a = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        b = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
        y = new DMatrixRMaj(dimenZ, 1);&lt;br /&gt;
        S = new DMatrixRMaj(dimenZ, dimenZ);&lt;br /&gt;
        S_inv = new DMatrixRMaj(dimenZ, dimenZ);&lt;br /&gt;
        c = new DMatrixRMaj(dimenZ, dimenX);&lt;br /&gt;
        d = new DMatrixRMaj(dimenX, dimenZ);&lt;br /&gt;
        K = new DMatrixRMaj(dimenX, dimenZ);&lt;br /&gt;
&lt;br /&gt;
        x = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        P = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
&lt;br /&gt;
        // covariance matrices are symmetric positive semi-definite&lt;br /&gt;
        solver = LinearSolverFactory_DDRM.symmPosDef(dimenX);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x.setTo(x);&lt;br /&gt;
        this.P.setTo(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        // x = F x&lt;br /&gt;
        mult(F, x, a);&lt;br /&gt;
        x.setTo(a);&lt;br /&gt;
&lt;br /&gt;
        // P = F P F&amp;#039; + Q&lt;br /&gt;
        mult(F, P, b);&lt;br /&gt;
        multTransB(b, F, P);&lt;br /&gt;
        addEquals(P, Q);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj z, DMatrixRMaj R ) {&lt;br /&gt;
        // y = z - H x&lt;br /&gt;
        mult(H, x, y);&lt;br /&gt;
        subtract(z, y, y);&lt;br /&gt;
&lt;br /&gt;
        // S = H P H&amp;#039; + R&lt;br /&gt;
        mult(H, P, c);&lt;br /&gt;
        multTransB(c, H, S);&lt;br /&gt;
        addEquals(S, R);&lt;br /&gt;
&lt;br /&gt;
        // K = PH&amp;#039;S^(-1)&lt;br /&gt;
        if (!solver.setA(S)) throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
        solver.invert(S_inv);&lt;br /&gt;
        multTransA(H, S_inv, d);&lt;br /&gt;
        mult(P, d, K);&lt;br /&gt;
&lt;br /&gt;
        // x = x + Ky&lt;br /&gt;
        mult(K, y, a);&lt;br /&gt;
        addEquals(x, a);&lt;br /&gt;
&lt;br /&gt;
        // P = (I-kH)P = P - (KH)P = P-K(HP)&lt;br /&gt;
        mult(H, P, c);&lt;br /&gt;
        mult(K, c, b);&lt;br /&gt;
        subtractEquals(P, b);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x; }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Equations Example ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
/**&lt;br /&gt;
 * Example of how the equation interface can greatly simplify code&lt;br /&gt;
 *&lt;br /&gt;
 * @author Peter Abeles&lt;br /&gt;
 */&lt;br /&gt;
public class KalmanFilterEquation implements KalmanFilter {&lt;br /&gt;
    // system state estimate&lt;br /&gt;
    private DMatrixRMaj x, P;&lt;br /&gt;
&lt;br /&gt;
    private Equation eq;&lt;br /&gt;
&lt;br /&gt;
    // Storage for precompiled code for predict and update&lt;br /&gt;
    Sequence predictX, predictP;&lt;br /&gt;
    Sequence updateY, updateK, updateX, updateP;&lt;br /&gt;
&lt;br /&gt;
    @Override public void configure( DMatrixRMaj F, DMatrixRMaj Q, DMatrixRMaj H ) {&lt;br /&gt;
        int dimenX = F.numCols;&lt;br /&gt;
&lt;br /&gt;
        x = new DMatrixRMaj(dimenX, 1);&lt;br /&gt;
        P = new DMatrixRMaj(dimenX, dimenX);&lt;br /&gt;
&lt;br /&gt;
        eq = new Equation();&lt;br /&gt;
&lt;br /&gt;
        // Provide aliases between the symbolic variables and matrices we normally interact with&lt;br /&gt;
        // The names do not have to be the same.&lt;br /&gt;
        eq.alias(x, &amp;quot;x&amp;quot;, P, &amp;quot;P&amp;quot;, Q, &amp;quot;Q&amp;quot;, F, &amp;quot;F&amp;quot;, H, &amp;quot;H&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Dummy matrix place holder to avoid compiler errors.  Will be replaced later on&lt;br /&gt;
        eq.alias(new DMatrixRMaj(1, 1), &amp;quot;z&amp;quot;);&lt;br /&gt;
        eq.alias(new DMatrixRMaj(1, 1), &amp;quot;R&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Pre-compile so that it doesn&amp;#039;t have to compile it each time it&amp;#039;s invoked.  More cumbersome&lt;br /&gt;
        // but for small matrices the overhead is significant&lt;br /&gt;
        predictX = eq.compile(&amp;quot;x = F*x&amp;quot;);&lt;br /&gt;
        predictP = eq.compile(&amp;quot;P = F*P*F&amp;#039; + Q&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        updateY = eq.compile(&amp;quot;y = z - H*x&amp;quot;);&lt;br /&gt;
        updateK = eq.compile(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
        updateX = eq.compile(&amp;quot;x = x + K*y&amp;quot;);&lt;br /&gt;
        updateP = eq.compile(&amp;quot;P = P-K*(H*P)&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void setState( DMatrixRMaj x, DMatrixRMaj P ) {&lt;br /&gt;
        this.x.setTo(x);&lt;br /&gt;
        this.P.setTo(P);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void predict() {&lt;br /&gt;
        predictX.perform();&lt;br /&gt;
        predictP.perform();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public void update( DMatrixRMaj z, DMatrixRMaj R ) {&lt;br /&gt;
&lt;br /&gt;
        // Alias will overwrite the reference to the previous matrices with the same name&lt;br /&gt;
        eq.alias(z, &amp;quot;z&amp;quot;, R, &amp;quot;R&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        updateY.perform();&lt;br /&gt;
        updateK.perform();&lt;br /&gt;
        updateX.perform();&lt;br /&gt;
        updateP.perform();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getState() { return x; }&lt;br /&gt;
&lt;br /&gt;
    @Override public DMatrixRMaj getCovariance() { return P; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Users&amp;diff=311</id>
		<title>Users</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Users&amp;diff=311"/>
		<updated>2021-07-06T17:35:06Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projects which use EJML =&lt;br /&gt;
&lt;br /&gt;
Feel free to add your own project!&lt;br /&gt;
* [https://github.com/FlorentinD/GraphBlasInJavaBenchmarks Graph Blas in Java Benchmarks] &lt;br /&gt;
* [https://neo4j.com/ Neo4J]&amp;#039;s graph-data-science library.&lt;br /&gt;
* [https://www.db.bme.hu/preprints/thesis2018-multidimensional-graph-analysis.pdf Petra Várhegyi&amp;#039;s masters thesis on graph analysis]&lt;br /&gt;
* [http://wiki.industrial-craft.net Industrial Craft 2] modification for minecraft&lt;br /&gt;
* [http://www-lium.univ-lemans.fr/diarization/doku.php/ LIUM_SpkDiarization] is a software dedicated to speaker diarization (ie speaker segmentation and clustering).&lt;br /&gt;
* [http://researchers.lille.inria.fr/~freno/JProGraM.html JProGraM]: Library for learning a number of statistical models from data.&lt;br /&gt;
* [http://code.google.com/p/gogps/ goGPS]: Improve the positioning accuracy of low-cost GPS devices by RTK technique.&lt;br /&gt;
* [http://www-edc.eng.cam.ac.uk/tools/set_visualiser/ Set Visualiser]: Visualises the way that a number of items is classified into one or more categories or sets using Euler diagrams.&lt;br /&gt;
* Universal Java Matrix Library (UJML): http://www.ujmp.org/&lt;br /&gt;
* Scalalab: http://code.google.com/p/scalalab/&lt;br /&gt;
* Java Content Based Image Retrieval (JCBIR): http://code.google.com/p/jcbir/&lt;br /&gt;
* JLabGroovy: http://code.google.com/p/jlabgroovy/&lt;br /&gt;
* JquantLib (Will be added): http://www.jquantlib.org/&lt;br /&gt;
* Matlube: https://github.com/hohonuuli/matlube&lt;br /&gt;
* Geometric Regression Library: http://georegression.org/&lt;br /&gt;
* BoofCV: Computer Vision Library: http://boofcv.org/&lt;br /&gt;
* ICY: bio-imaging: http://www.bioimageanalysis.com/icy/&lt;br /&gt;
* JSkills: Java implementation of TrueSkill algorithm https://github.com/nsp/JSkills&lt;br /&gt;
* Portfolio applets at http://www.christoph-junge.de/optimizer.php&lt;br /&gt;
* Distributed Control Framework (DCF) http://www.i-a-i.com/dcfpro/&lt;br /&gt;
* JptView point cloud viewer: http://www.seas.upenn.edu/~aiv/jptview/&lt;br /&gt;
* JPrIME Bayesian phylogenetics library: http://code.google.com/p/jprime/&lt;br /&gt;
* J-Matrix quantum mechanics scattering https://code.google.com/p/jmatrix/&lt;br /&gt;
* DDogleg Numerics: http://ddogleg.org&lt;br /&gt;
* Saddle: http://saddle.github.io/doc/index.html&lt;br /&gt;
* GDSC ImageJ Plugins: http://www.sussex.ac.uk/gdsc/intranet/microscopy/imagej/gdsc_plugins&lt;br /&gt;
* Robot Controller for Humanoid Robots: http://www.ihmc.us/Research/projects/HumanoidRobots/index.html&lt;br /&gt;
* Credit Analytics: http://code.google.com/p/creditanalytics&lt;br /&gt;
* Spline Library: http://code.google.com/p/splinelibrary - http://www.credit-trader.org/CreditSuite/docs/SplineLibrary_2.2.pdf&lt;br /&gt;
* Fixed Point Finder: http://code.google.com/p/rootfinder - http://www.credit-trader.org/CreditSuite/docs/FixedPointFinder_2.2.pdf&lt;br /&gt;
* Sensitivity generation scheme in Credit Analytics: http://www.credit-trader.org/CreditSuite/docs/SensitivityGenerator_2.2.pdf&lt;br /&gt;
* Stanford CoreNLP: A set of natural language analysis tools:  http://nlp.stanford.edu/software/corenlp.shtml &lt;br /&gt;
* OpenChrom: Open source software for the mass spectrometric analysis of chromatographic data.  https://www.openchrom.net&lt;br /&gt;
&lt;br /&gt;
= Papers That Cite EJML =&lt;br /&gt;
* A ton of [https://scholar.google.com/scholar?q=%22efficient+java+matrix+library%22&amp;amp;hl=en&amp;amp;as_sdt=0,5 academic papers]&lt;br /&gt;
* [https://dl.acm.org/doi/abs/10.1145/3461837.3464627 Florentin Dörre, Alexander Krause, Dirk Habich, and Martin Junghanns. 2021. A GraphBLAS implementation in pure Java. In Proceedings of the 4th ACM SIGMOD Joint International Workshop on Graph Data Management Experiences &amp;amp; Systems (GRADES) and Network Data Analytics (NDA)]&lt;br /&gt;
* Zewdie, Dawit Dawit Habtamu. &amp;quot;Representation discovery in non-parametric reinforcement learning.&amp;quot; Diss. Massachusetts Institute of Technology, 2014.&lt;br /&gt;
* Sanfilippo, Filippo, et al. &amp;quot;A mapping approach for controlling different maritime cranes and robots using ANN.&amp;quot; Mechatronics and Automation (ICMA), 2014 IEEE International Conference on. IEEE, 2014.&lt;br /&gt;
* Kushman, Nate, et al. &amp;quot;Learning to automatically solve algebra word problems.&amp;quot; ACL (1) (2014): 271-281.&lt;br /&gt;
* Stergios Papadimitriou, Seferina Mavroudi, Kostas Theofilatos, and Spiridon Likothanasis, “MATLAB-Like Scripting of Java Scientific Libraries in ScalaLab,” Scientific Programming, vol. 22, no. 3, pp. 187-199, 2014.&lt;br /&gt;
* Alberto Castellini, Daniele Paltrinieri, and Vincenzo Manca &amp;quot;MP-GeneticSynth: Inferring Biological Network Regulations from Time Series&amp;quot; Bioinformatics 2014&lt;br /&gt;
* Blasinski, H., Bulan, O., &amp;amp; Sharma, G. (2013). Per-Colorant-Channel Color Barcodes for Mobile Applications: An Interference Cancellation Framework.&lt;br /&gt;
* Marin, R. C., &amp;amp; Dobre, C. (2013, November). Reaching for the clouds: contextually enhancing smartphones for energy efficiency. In Proceedings of the 2nd ACM workshop on High performance mobile opportunistic systems (pp. 31-38). ACM.&lt;br /&gt;
* Oletic, D., Skrapec, M., &amp;amp; Bilas, V. (2013). Monitoring Respiratory Sounds: Compressed Sensing Reconstruction via OMP on Android Smartphone. In Wireless Mobile Communication and Healthcare (pp. 114-121). Springer Berlin Heidelberg.&lt;br /&gt;
* Santhiar, Anirudh and Pandita, Omesh and Kanade, Aditya &amp;quot;Discovering Math APIs by Mining Unit Tests&amp;quot; Fundamental Approaches to Software Engineering 2013&lt;br /&gt;
* Sanjay K. Boddhu, Robert L. Williams, Edward Wasser, Niranjan Kode, &amp;quot;Increasing Situational Awareness using Smartphones&amp;quot; Proc. SPIE 8389, Ground/Air Multisensor Interoperability, Integration, and Networking for Persistent ISR III, 83891J (May 1, 2012)&lt;br /&gt;
* J. A. Álvarez-Bermejo, N. Antequera, R. García-Rubio and J. A. López-Ramos, _&amp;quot;A scalable server for key distribution and its application to accounting,&amp;quot;_ The Journal of Supercomputing, 2012&lt;br /&gt;
* Realini E., Yoshida D., Reguzzoni M., Raghavan V., _&amp;quot;Enhanced satellite positioning as a web service with goGPS open source software&amp;quot;_. Applied Geomatics 4(2), 135-142. 2012&lt;br /&gt;
* Stergios Papadimitriou, Constantinos Terzidis, Seferina Mavroudi, Spiridon D. Likothanassis: _Exploiting java scientific libraries with the scala language within the scalalab environment._ IET Software 5(6): 543-551 (2011)&lt;br /&gt;
* L. T. Lim, B. Ranaivo-Malançon and E. K. Tang. _“Symbiosis Between a Multilingual Lexicon and Translation Example Banks”._ In: Procedia: Social and Behavioral Sciences 27 (2011), pp. 61–69.&lt;br /&gt;
* G. Taboada, S. Ramos, R. Expósito, J. Touriño, R. Doallo, _Java in the High Performance Computing arena: Research, practice and experience,_ Science of Computer Programming, 2011.&lt;br /&gt;
* http://geomatica.como.polimi.it/presentazioni/Osaka_Summer_goGPS.pdf&lt;br /&gt;
* http://www.holger-arndt.de/library/MLOSS2010.pdf&lt;br /&gt;
* http://www.ateji.com/px/whitepapers/Ateji%20PX%20MatMult%20Whitepaper%20v1.2.pdf&lt;br /&gt;
&lt;br /&gt;
Note:  Slowly working on an EJML paper for publication.  About 1/2 way through a first draft.&lt;br /&gt;
&lt;br /&gt;
= On The Web =&lt;br /&gt;
* https://softwarerecs.stackexchange.com/questions/51330/sparse-matrix-library-for-java&lt;br /&gt;
* https://lessthanoptimal.github.io/Java-Matrix-Benchmark/&lt;br /&gt;
* http://java.dzone.com/announcements/introduction-efficient-java&lt;br /&gt;
* https://shakthydoss.wordpress.com/2011/01/13/jama-shortcoming/&lt;br /&gt;
* Various questions on stackoverflow.com&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Acknowledgments&amp;diff=310</id>
		<title>Acknowledgments</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Acknowledgments&amp;diff=310"/>
		<updated>2021-07-06T17:31:36Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Development ==&lt;br /&gt;
&lt;br /&gt;
EJML has been developed most by [https://www.linkedin.com/profile/view?id=9580871 Peter Abeles] in his spare time. Much of the development of EJML was inspired by his frustration with existing libraries at that time. They had very poor performance with small matrices, excessive memory creation/destruction, (arguably) not the best API, and tended to be quickly abandoned by their developers after decided he liked one. The status of Java numerical libraries has improved since then in general. More recently, Graph BLAS operations have been added by Florentin Dorre ([https://dl.acm.org/doi/abs/10.1145/3461837.3464627 paper]), filling in an often requested feature.&lt;br /&gt;
&lt;br /&gt;
Additional thanks should go towards the [http://ihmc.us Institute for Human Machine Cognition] (IHMC) which encouraged the continued development of EJML and even commissioned the inclusion of the first few complex matrix operations after he had left. [https://www.hebirobotics.com/ HEBI Robotics] sponsored the continued developement of support for sparse matrix operations, a much needed feature.&lt;br /&gt;
&lt;br /&gt;
All the feedback and bug reports from its users have also had a significant influence on this library. Without their encouragement and help it would be less stable and much less flushed out than it is today. The book [http://www.amazon.com/gp/product/0470528338/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=ejml-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0470528338 Fundamentals of Matrix Computations by David S. Watkins] also significantly influence the development of the library in its early days. It is probably the best introduction to to the computational side of linear algebra written so far and includes many important implementation details left out in other books.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
EJML is entirely self contained and is only dependent on JUnit for tests.&lt;br /&gt;
&lt;br /&gt;
* http://www.junit.org/&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Acknowledgments&amp;diff=309</id>
		<title>Acknowledgments</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Acknowledgments&amp;diff=309"/>
		<updated>2021-07-06T17:30:22Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Development ==&lt;br /&gt;
&lt;br /&gt;
EJML has been developed most by [https://www.linkedin.com/profile/view?id=9580871 Peter Abeles] in his spare time. Much of the development of EJML was inspired by his frustration with existing libraries at that time. They had very poor performance with small matrices, excessive memory creation/destruction, (arguably) not the best API, and tended to be quickly abandoned by their developers after decided he liked one. The status of Java numerical libraries has improved since then in general. More recently, Graph BLAS features have been added by Florentin Dorre ([https://dl.acm.org/doi/abs/10.1145/3461837.3464627 paper]).&lt;br /&gt;
&lt;br /&gt;
Additional thanks should go towards the [http://ihmc.us Institute for Human Machine Cognition] (IHMC) which encouraged the continued development of EJML and even commissioned the inclusion of the first few complex matrix operations after he had left. [https://www.hebirobotics.com/ HEBI Robotics] sponsored the continued developement of support for sparse matrix operations, a much needed feature.&lt;br /&gt;
&lt;br /&gt;
All the feedback and bug reports from its users have also had a significant influence on this library. Without their encouragement and help it would be less stable and much less flushed out than it is today. The book [http://www.amazon.com/gp/product/0470528338/ref=as_li_ss_tl?ie=UTF8&amp;amp;tag=ejml-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=390957&amp;amp;creativeASIN=0470528338 Fundamentals of Matrix Computations by David S. Watkins] also significantly influence the development of the library in its early days. It is probably the best introduction to to the computational side of linear algebra written so far and includes many important implementation details left out in other books.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
EJML is entirely self contained and is only dependent on JUnit for tests.&lt;br /&gt;
&lt;br /&gt;
* http://www.junit.org/&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Procedural&amp;diff=308</id>
		<title>Procedural</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Procedural&amp;diff=308"/>
		<updated>2021-03-24T15:58:15Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The procedural interface in EJML provides access to all of its capabilities and provides much more control over which algorithms are used and when memory is created.  The downside to this increased control is the added difficulty in programming, kinda resembles writing in assembly.  Code can be made very efficient, but managing all the temporary data structures can be tedious.  &lt;br /&gt;
&lt;br /&gt;
The procedural supports all matrix types in EJML and follows a consistent naming pattern across all matrix types. Ops classes end in a suffix that indicate which type of matrix they can process.  From the matrix name you can determine the type of element (float,double,real,complex) and it&amp;#039;s internal data structure, e.g. row-major or block.  In general, almost everyone will want to interact with row major matrices.  Conversion to block format is done automatically internally when it becomes advantageous.  &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Matrix Name !! Description !! Suffix&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|DMatrixRMaj}} || Dense Double Real - Row Major || DDRM&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|FMatrixRMaj}} || Dense Float Real - Row Major || FDRM&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|ZDMatrixRMaj}} || Dense Double Complex - Row Major || ZDRM&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|CDMatrixRMaj}} || Dense Float Complex - Row Major || CDRM&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|DMatrixSparseCSC}} || Sparse Double Real - Compressed Column || DSCC&lt;br /&gt;
|-&lt;br /&gt;
| {{DataDocLink|DMatrixSparseTriplet}} || Sparse Double Real - Triplet || DSTL&lt;br /&gt;
|-&lt;br /&gt;
| {{DocLink|org/ejml/data/DMatrix3x3.html|DMatrix3x3}} || Dense Double Real 3x3 || DDF3&lt;br /&gt;
|-&lt;br /&gt;
| {{DocLink|org/ejml/data/DMatrix3.html|DMatrix3}} || Dense Double Real 3 || DDF3&lt;br /&gt;
|-&lt;br /&gt;
| {{DocLink|org/ejml/data/FMatrix3x3.html|FMatrix3x3}} || Dense Float Real 3x3 || FDF3&lt;br /&gt;
|-&lt;br /&gt;
| {{DocLink|org/ejml/data/FMatrix3.html|FMatrix3}} || Dense Float Real 3 || FDF3&lt;br /&gt;
|}&lt;br /&gt;
Fixed sized matrix from 2 to 6 are supported.  Just replaced the 3 with the desired size.  &amp;#039;&amp;#039;NOTE: In previous versions of EJML the matrix DMatrixRMaj was known as DenseMatrix64F.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Matrix Element Accessors =&lt;br /&gt;
&lt;br /&gt;
* get( row , col )&lt;br /&gt;
* set( row , col , value )&lt;br /&gt;
** Returns or sets the value of an element at the specified row and column.&lt;br /&gt;
* unsafe_get( row , col )&lt;br /&gt;
* unsafe_set( row , col , value )&lt;br /&gt;
** Faster version of get() or set() that does not perform bounds checking.&lt;br /&gt;
* get( index )&lt;br /&gt;
* set( index )&lt;br /&gt;
** Returns or sets the value of an element at the specified index.  Useful for vectors and element-wise operations.&lt;br /&gt;
* iterator( boolean rowMajor, int minRow, int minCol, int maxRow, int maxCol )&lt;br /&gt;
** An iterator that iterates through the sub-matrix by row or by column.&lt;br /&gt;
&lt;br /&gt;
= Operations Classes =&lt;br /&gt;
&lt;br /&gt;
Several &amp;quot;Ops&amp;quot; classes provide functions for manipulating different types of matrices and most are contained inside of the org.ejml.dense.* package, where * is replaced with the matrix structure package type, e.g. row for row-major.  The list below is provided for DMatrixRMaj, other matrix can be found by changing the suffix as discussed above.&lt;br /&gt;
&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/CommonOps_DDRM.html|CommonOps_DDRM}} : Provides the most common matrix operations. &lt;br /&gt;
; {{DocLink|org/ejml/dense/row/EigenOps_DDRM.html|EigenOps_DDRM}} : Provides operations related to eigenvalues and eigenvectors.&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/MatrixFeatures_DDRM.html|MatrixFeatures_DDRM}} : Used to compute various features related to a matrix.&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/NormOps_DDRM.html|NormOps_DDRM}} : Operations for computing different matrix norms.&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/SingularOps_DDRM.html|SingularOps_DDRM}} : Operations related to singular value decompositions.&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/SpecializedOps_DDRM.html|SpecializedOps_DDRM}} : Grab bag for operations which do not fit in anywhere else.&lt;br /&gt;
; {{DocLink|org/ejml/dense/row/RandomMatrices_DDRM.html|RandomMatrices_DDRM}} : Used to create different types of random matrices.&lt;br /&gt;
&lt;br /&gt;
For fixed sized matrices FixedOpsN is provided, where N = 2 to 6.  FixedOpsN is similar in functionality to CommonOps.&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=307</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=307"/>
		<updated>2021-02-18T02:45:41Z</updated>

		<summary type="html">&lt;p&gt;Peter: /* News */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.40&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;November 4, 2020&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.40/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News 2021 ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* Read and write EJML in Matlab format with [https://github.com/HebiRobotics/MFL MFL] from HEBI Robotics&lt;br /&gt;
* Graph BLAS continues to be flushed out with masks being added to latest SNAPSHOT&lt;br /&gt;
* Concurrency/threading has been added to some operations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=306</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=306"/>
		<updated>2021-02-18T02:44:08Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.40&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;November 4, 2020&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.40/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== News ==&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
| -&lt;br /&gt;
|&lt;br /&gt;
* Read and write EJML in Matlab format with [https://github.com/HebiRobotics/MFL MFL] from HEBI Robotics&lt;br /&gt;
* Graph BLAS continues to be flushed out with masks being added to latest SNAPSHOT&lt;br /&gt;
* Concurrency/threading has been added to some operations&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Input_and_Output&amp;diff=305</id>
		<title>Input and Output</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Input_and_Output&amp;diff=305"/>
		<updated>2021-02-18T02:36:55Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;EJML provides several different methods for loading, saving, and displaying a matrix. A matrix can be saved and loaded from a file, displayed visually in a window, printed to the console, created from raw arrays or strings.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Text Output =&lt;br /&gt;
&lt;br /&gt;
A matrix can be printed to standard out using its built in &amp;#039;&amp;#039;print()&amp;#039;&amp;#039; command, this works for both DMatrixRMaj and SimpleMatrix.  To create a custom output the user can provide a formatting string that is compatible with printf().&lt;br /&gt;
&lt;br /&gt;
Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public static void main( String []args ) {&lt;br /&gt;
    DMatrixRMaj A = new DMatrixRMaj(2,3,true,1.1,2.34,3.35436,4345,59505,0.00001234);&lt;br /&gt;
&lt;br /&gt;
    A.print();&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    A.print(&amp;quot;%e&amp;quot;);&lt;br /&gt;
    System.out.println();&lt;br /&gt;
    A.print(&amp;quot;%10.2f&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Type = dense real , numRows = 2 , numCols = 3&lt;br /&gt;
 1.100   2.340   3.354  &lt;br /&gt;
4345.000  59505.000   0.000  &lt;br /&gt;
&lt;br /&gt;
Type = dense real , numRows = 2 , numCols = 3&lt;br /&gt;
1.100000e+00 2.340000e+00 3.354360e+00 &lt;br /&gt;
4.345000e+03 5.950500e+04 1.234000e-05 &lt;br /&gt;
&lt;br /&gt;
Type = dense real , numRows = 2 , numCols = 3&lt;br /&gt;
      1.10       2.34       3.35 &lt;br /&gt;
   4345.00   59505.00       0.00 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CSV Input/Outut = &lt;br /&gt;
&lt;br /&gt;
A Column Space Value (CSV) reader and writer is provided by EJML.  The advantage of this file format is that it&amp;#039;s human readable, the disadvantage is that its large and slow.  Two CSV formats are supported, one where the first line specifies the matrix dimension and the other the user specifies it pro grammatically.  &lt;br /&gt;
&lt;br /&gt;
In the example below, the matrix size and type is specified in the first line; row, column, and real/complex.  The remainder of the file contains the value of each element in the matrix in a row-major format.  A file containing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2 3 real&lt;br /&gt;
2.4 6.7 9&lt;br /&gt;
-2 3 5&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
would describe a real matrix with 2 rows and 3 columns.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
DMatrixRMaj Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public static void main( String args[] ) {&lt;br /&gt;
    DMatrixRMaj A = new DMatrixRMaj(2,3,true,new double[]{1,2,3,4,5,6});&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
        MatrixIO.saveCSV(A, &amp;quot;matrix_file.csv&amp;quot;);&lt;br /&gt;
        DMatrixRMaj B = MatrixIO.loadCSV(&amp;quot;matrix_file.csv&amp;quot;);&lt;br /&gt;
        B.print();&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
        throw new RuntimeException(e);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SimpleMatrix Example:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public static void main( String args[] ) {&lt;br /&gt;
    SimpleMatrix A = new SimpleMatrix(2,3,true,new double[]{1,2,3,4,5,6});&lt;br /&gt;
&lt;br /&gt;
    try {&lt;br /&gt;
        A.saveToFileCSV(&amp;quot;matrix_file.csv&amp;quot;);&lt;br /&gt;
        SimpleMatrix B = SimpleMatrix.loadCSV(&amp;quot;matrix_file.csv&amp;quot;);&lt;br /&gt;
        B.print();&lt;br /&gt;
    } catch (IOException e) {&lt;br /&gt;
        throw new RuntimeException(e);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Matlab =&lt;br /&gt;
&lt;br /&gt;
Want to read and write EJML matrices in matlab format? HEBI Robotic&amp;#039;s got you covered with their library https://github.com/HebiRobotics/MFL&lt;br /&gt;
&lt;br /&gt;
= Visual Display =&lt;br /&gt;
&lt;br /&gt;
Understanding the state of a matrix from text output can be difficult, especially for large matrices.  To help in these situations a visual way of viewing a matrix is provided in DMatrixVisualization.  By calling MatrixIO.show() a window will be created that shows the matrix.  Positive elements will appear as a shade of red, negative ones as a shade of blue, and zeros as black.  How red or blue an element is depends on its magnitude.&lt;br /&gt;
&lt;br /&gt;
Example Code:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
public static void main( String args[] ) {&lt;br /&gt;
    DMatrixRMaj A = new DMatrixRMaj(4,4,true,&lt;br /&gt;
            0,2,3,4,-2,0,2,3,-3,-2,0,2,-4,-3,-2,0);&lt;br /&gt;
&lt;br /&gt;
    MatrixIO.show(A,&amp;quot;Small Matrix&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    DMatrixRMaj B = new DMatrixRMaj(25,50);&lt;br /&gt;
    for( int i = 0; i &amp;lt; 25; i++ )&lt;br /&gt;
        B.set(i,i,i+1);&lt;br /&gt;
&lt;br /&gt;
    MatrixIO.show(B,&amp;quot;Larger Diagonal Matrix&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
{|&lt;br /&gt;
| http://ejml.org/wiki/MY_IMAGES/small_matrix.gif || http://ejml.org/wiki/MY_IMAGES/larger_matrix.gif&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Deprecated = &lt;br /&gt;
&lt;br /&gt;
The binary format which used Java serialization has been deprecated and will be removed in the not to distant future. Basically it&amp;#039;s now considered a significant security risk.&lt;br /&gt;
&lt;br /&gt;
https://medium.com/swlh/hacking-java-deserialization-7625c8450334&lt;br /&gt;
&lt;br /&gt;
In the future a new binary format might be provided (you can request this on Github) but for now you can use the Matlab format discussed above.&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Capabilities&amp;diff=304</id>
		<title>Capabilities</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Capabilities&amp;diff=304"/>
		<updated>2021-01-23T16:33:26Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Linear Algebra Capabilities =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!   !! Dense Real !! Fixed real !! Dense Complex || Sparse Real&lt;br /&gt;
|-&lt;br /&gt;
| Basic Arithmetic || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Element-Wise Ops || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Transpose || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Determinant || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Norm || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Inverse || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Solve m=n || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Solve m&amp;gt;n || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| LU || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Cholesky || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| QR || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| QRP || X ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| SVD || X ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| Eigen Symm || X ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen General || X ||  || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above table summarizes at a high level the capabilities available by matrix type.  To see a complete list of features check out the following classes and factories.  Note that the capabilities also vary by which interface you use.  See interface specific documentation for that information.  Procedural interface supports everything.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Ops !! Dense Real !! Fixed real !! Dense Complex || Sparse Real&lt;br /&gt;
|-&lt;br /&gt;
| CommonOps&lt;br /&gt;
| {{OpsDocLink|row/CommonOps_DDRM|X}} || {{OpsDocLink|fixed/CommonOps_DDF3|X}} || {{OpsDocLink|row/CommonOps_ZDRM|X}} || {{SparseLink|csc/CommonOps_DSCC|X}}&lt;br /&gt;
|-&lt;br /&gt;
| EigenOps&lt;br /&gt;
| {{OpsDocLink|row/EigenOps_DDRM|X}} ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| MatrixFeatures&lt;br /&gt;
| {{OpsDocLink|row/MatrixFeatures_DDRM|X}} ||  || {{OpsDocLink|row/MatrixFeatures_ZDRM|X}} || {{SparseLink|csc/MatrixFeatures_DSCC|X}}&lt;br /&gt;
|-&lt;br /&gt;
| MatrixVisualization&lt;br /&gt;
| {{OpsDocLink|row/MatrixVisualization_DDRM|X}} ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| NormOps&lt;br /&gt;
| {{OpsDocLink|row/NormOps_DDRM|X}} ||  || {{OpsDocLink|row/NormOps_ZDRM|X}} || {{SparseLink|csc/NormOps_DSCC|X}}&lt;br /&gt;
|-&lt;br /&gt;
| RandomMatrices&lt;br /&gt;
| {{OpsDocLink|row/RandomMatrices_DDRM|X}} ||  || {{OpsDocLink|row/RandomMatrices_ZDRM|X}} || {{SparseLink|csc/RandomMatrices_DSCC|X}} &lt;br /&gt;
|-&lt;br /&gt;
| SingularOps&lt;br /&gt;
| {{OpsDocLink|row/SingularOps_DDRM|X}} ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| SpecializedOps&lt;br /&gt;
| {{OpsDocLink|row/SpecializedOps_DDRM|X}} ||  || {{OpsDocLink|row/SpecializedOps_ZDRM|X}} ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Other Features =&lt;br /&gt;
&lt;br /&gt;
File IO&lt;br /&gt;
Visualization&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Template:SparseLink&amp;diff=303</id>
		<title>Template:SparseLink</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Template:SparseLink&amp;diff=303"/>
		<updated>2021-01-23T16:22:40Z</updated>

		<summary type="html">&lt;p&gt;Peter: Created page with &amp;quot;{{DocLink|org/ejml/sparse/{{{1}}}.html|{{{2}}} }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DocLink|org/ejml/sparse/{{{1}}}.html|{{{2}}} }}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=302</id>
		<title>Template:OpsDocLink</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=302"/>
		<updated>2021-01-23T16:20:05Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DocLink|org/ejml/dense/{{{1}}}.html|{{{2}}} }}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=301</id>
		<title>Template:OpsDocLink</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=301"/>
		<updated>2021-01-23T16:18:00Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DocLink|org/ejml/dense/row/{{{1}}}.html|{{{2}}} }}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=300</id>
		<title>Template:OpsDocLink</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=300"/>
		<updated>2021-01-23T16:14:07Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DocLink|org/ejml/{{{1}}}.html|{{{2}}} }}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=299</id>
		<title>Template:OpsDocLink</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Template:OpsDocLink&amp;diff=299"/>
		<updated>2021-01-23T16:11:04Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DocLink|org/ejml/{{{2}}}.html|{{{1}}} }}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Capabilities&amp;diff=298</id>
		<title>Capabilities</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Capabilities&amp;diff=298"/>
		<updated>2021-01-23T16:04:40Z</updated>

		<summary type="html">&lt;p&gt;Peter: /* Linear Algebra Capabilities */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Linear Algebra Capabilities =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!   !! Dense Real !! Fixed real !! Dense Complex || Sparse Real&lt;br /&gt;
|-&lt;br /&gt;
| Basic Arithmetic || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Element-Wise Ops || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Transpose || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Determinant || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Norm || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Inverse || X || X || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Solve m=n || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Solve m&amp;gt;n || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| LU || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| Cholesky || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| QR || X ||  || X || X&lt;br /&gt;
|-&lt;br /&gt;
| QRP || X ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| SVD || X ||  || ||&lt;br /&gt;
|-&lt;br /&gt;
| Eigen Symm || X ||  || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen General || X ||  || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The above table summarizes at a high level the capabilities available by matrix type.  To see a complete list of features check out the following classes and factories.  Note that the capabilities also vary by which interface you use.  See interface specific documentation for that information.  Procedural interface supports everything.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Dense Real !! Fixed real !! Dense Complex || Sparse Real&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|CommonOps}} || {{DocLink|org/ejml/alg/fixed/FixedOps3.html|FixedOps}} || {{OpsDocLink|CCommonOps}} ||&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|EigenOps}} ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|MatrixFeatures}} ||  || {{OpsDocLink|CMatrixFeatures}}&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|MatrixVisualization}} ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|NormOps}} ||  || {{OpsDocLink|CNormOps}}&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|RandomMatrices}} ||  || {{OpsDocLink|CRandomMatrices}}&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|SingularOps}} ||  ||&lt;br /&gt;
|-&lt;br /&gt;
| {{OpsDocLink|SpecializedOps}} ||  || {{OpsDocLink|CSpecializedOps}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Other Features =&lt;br /&gt;
&lt;br /&gt;
File IO&lt;br /&gt;
Visualization&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Users&amp;diff=297</id>
		<title>Users</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Users&amp;diff=297"/>
		<updated>2021-01-05T03:55:24Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projects which use EJML =&lt;br /&gt;
&lt;br /&gt;
Feel free to add your own project!&lt;br /&gt;
&lt;br /&gt;
* [https://neo4j.com/ Neo4J]&amp;#039;s graph-data-science library.&lt;br /&gt;
* [https://www.db.bme.hu/preprints/thesis2018-multidimensional-graph-analysis.pdf Petra Várhegyi&amp;#039;s masters thesis on graph analysis]&lt;br /&gt;
* [http://wiki.industrial-craft.net Industrial Craft 2] modification for minecraft&lt;br /&gt;
* [http://www-lium.univ-lemans.fr/diarization/doku.php/ LIUM_SpkDiarization] is a software dedicated to speaker diarization (ie speaker segmentation and clustering).&lt;br /&gt;
* [http://researchers.lille.inria.fr/~freno/JProGraM.html JProGraM]: Library for learning a number of statistical models from data.&lt;br /&gt;
* [http://code.google.com/p/gogps/ goGPS]: Improve the positioning accuracy of low-cost GPS devices by RTK technique.&lt;br /&gt;
* [http://www-edc.eng.cam.ac.uk/tools/set_visualiser/ Set Visualiser]: Visualises the way that a number of items is classified into one or more categories or sets using Euler diagrams.&lt;br /&gt;
* Universal Java Matrix Library (UJML): http://www.ujmp.org/&lt;br /&gt;
* Scalalab: http://code.google.com/p/scalalab/&lt;br /&gt;
* Java Content Based Image Retrieval (JCBIR): http://code.google.com/p/jcbir/&lt;br /&gt;
* JLabGroovy: http://code.google.com/p/jlabgroovy/&lt;br /&gt;
* JquantLib (Will be added): http://www.jquantlib.org/&lt;br /&gt;
* Matlube: https://github.com/hohonuuli/matlube&lt;br /&gt;
* Geometric Regression Library: http://georegression.org/&lt;br /&gt;
* BoofCV: Computer Vision Library: http://boofcv.org/&lt;br /&gt;
* ICY: bio-imaging: http://www.bioimageanalysis.com/icy/&lt;br /&gt;
* JSkills: Java implementation of TrueSkill algorithm https://github.com/nsp/JSkills&lt;br /&gt;
* Portfolio applets at http://www.christoph-junge.de/optimizer.php&lt;br /&gt;
* Distributed Control Framework (DCF) http://www.i-a-i.com/dcfpro/&lt;br /&gt;
* JptView point cloud viewer: http://www.seas.upenn.edu/~aiv/jptview/&lt;br /&gt;
* JPrIME Bayesian phylogenetics library: http://code.google.com/p/jprime/&lt;br /&gt;
* J-Matrix quantum mechanics scattering https://code.google.com/p/jmatrix/&lt;br /&gt;
* DDogleg Numerics: http://ddogleg.org&lt;br /&gt;
* Saddle: http://saddle.github.io/doc/index.html&lt;br /&gt;
* GDSC ImageJ Plugins: http://www.sussex.ac.uk/gdsc/intranet/microscopy/imagej/gdsc_plugins&lt;br /&gt;
* Robot Controller for Humanoid Robots: http://www.ihmc.us/Research/projects/HumanoidRobots/index.html&lt;br /&gt;
* Credit Analytics: http://code.google.com/p/creditanalytics&lt;br /&gt;
* Spline Library: http://code.google.com/p/splinelibrary - http://www.credit-trader.org/CreditSuite/docs/SplineLibrary_2.2.pdf&lt;br /&gt;
* Fixed Point Finder: http://code.google.com/p/rootfinder - http://www.credit-trader.org/CreditSuite/docs/FixedPointFinder_2.2.pdf&lt;br /&gt;
* Sensitivity generation scheme in Credit Analytics: http://www.credit-trader.org/CreditSuite/docs/SensitivityGenerator_2.2.pdf&lt;br /&gt;
* Stanford CoreNLP: A set of natural language analysis tools:  http://nlp.stanford.edu/software/corenlp.shtml &lt;br /&gt;
* OpenChrom: Open source software for the mass spectrometric analysis of chromatographic data.  https://www.openchrom.net&lt;br /&gt;
&lt;br /&gt;
= Papers That Cite EJML =&lt;br /&gt;
* A ton of [https://scholar.google.com/scholar?q=%22efficient+java+matrix+library%22&amp;amp;hl=en&amp;amp;as_sdt=0,5 academic papers]&lt;br /&gt;
* Zewdie, Dawit Dawit Habtamu. &amp;quot;Representation discovery in non-parametric reinforcement learning.&amp;quot; Diss. Massachusetts Institute of Technology, 2014.&lt;br /&gt;
* Sanfilippo, Filippo, et al. &amp;quot;A mapping approach for controlling different maritime cranes and robots using ANN.&amp;quot; Mechatronics and Automation (ICMA), 2014 IEEE International Conference on. IEEE, 2014.&lt;br /&gt;
* Kushman, Nate, et al. &amp;quot;Learning to automatically solve algebra word problems.&amp;quot; ACL (1) (2014): 271-281.&lt;br /&gt;
* Stergios Papadimitriou, Seferina Mavroudi, Kostas Theofilatos, and Spiridon Likothanasis, “MATLAB-Like Scripting of Java Scientific Libraries in ScalaLab,” Scientific Programming, vol. 22, no. 3, pp. 187-199, 2014.&lt;br /&gt;
* Alberto Castellini, Daniele Paltrinieri, and Vincenzo Manca &amp;quot;MP-GeneticSynth: Inferring Biological Network Regulations from Time Series&amp;quot; Bioinformatics 2014&lt;br /&gt;
* Blasinski, H., Bulan, O., &amp;amp; Sharma, G. (2013). Per-Colorant-Channel Color Barcodes for Mobile Applications: An Interference Cancellation Framework.&lt;br /&gt;
* Marin, R. C., &amp;amp; Dobre, C. (2013, November). Reaching for the clouds: contextually enhancing smartphones for energy efficiency. In Proceedings of the 2nd ACM workshop on High performance mobile opportunistic systems (pp. 31-38). ACM.&lt;br /&gt;
* Oletic, D., Skrapec, M., &amp;amp; Bilas, V. (2013). Monitoring Respiratory Sounds: Compressed Sensing Reconstruction via OMP on Android Smartphone. In Wireless Mobile Communication and Healthcare (pp. 114-121). Springer Berlin Heidelberg.&lt;br /&gt;
* Santhiar, Anirudh and Pandita, Omesh and Kanade, Aditya &amp;quot;Discovering Math APIs by Mining Unit Tests&amp;quot; Fundamental Approaches to Software Engineering 2013&lt;br /&gt;
* Sanjay K. Boddhu, Robert L. Williams, Edward Wasser, Niranjan Kode, &amp;quot;Increasing Situational Awareness using Smartphones&amp;quot; Proc. SPIE 8389, Ground/Air Multisensor Interoperability, Integration, and Networking for Persistent ISR III, 83891J (May 1, 2012)&lt;br /&gt;
* J. A. Álvarez-Bermejo, N. Antequera, R. García-Rubio and J. A. López-Ramos, _&amp;quot;A scalable server for key distribution and its application to accounting,&amp;quot;_ The Journal of Supercomputing, 2012&lt;br /&gt;
* Realini E., Yoshida D., Reguzzoni M., Raghavan V., _&amp;quot;Enhanced satellite positioning as a web service with goGPS open source software&amp;quot;_. Applied Geomatics 4(2), 135-142. 2012&lt;br /&gt;
* Stergios Papadimitriou, Constantinos Terzidis, Seferina Mavroudi, Spiridon D. Likothanassis: _Exploiting java scientific libraries with the scala language within the scalalab environment._ IET Software 5(6): 543-551 (2011)&lt;br /&gt;
* L. T. Lim, B. Ranaivo-Malançon and E. K. Tang. _“Symbiosis Between a Multilingual Lexicon and Translation Example Banks”._ In: Procedia: Social and Behavioral Sciences 27 (2011), pp. 61–69.&lt;br /&gt;
* G. Taboada, S. Ramos, R. Expósito, J. Touriño, R. Doallo, _Java in the High Performance Computing arena: Research, practice and experience,_ Science of Computer Programming, 2011.&lt;br /&gt;
* http://geomatica.como.polimi.it/presentazioni/Osaka_Summer_goGPS.pdf&lt;br /&gt;
* http://www.holger-arndt.de/library/MLOSS2010.pdf&lt;br /&gt;
* http://www.ateji.com/px/whitepapers/Ateji%20PX%20MatMult%20Whitepaper%20v1.2.pdf&lt;br /&gt;
&lt;br /&gt;
Note:  Slowly working on an EJML paper for publication.  About 1/2 way through a first draft.&lt;br /&gt;
&lt;br /&gt;
= On The Web =&lt;br /&gt;
* https://softwarerecs.stackexchange.com/questions/51330/sparse-matrix-library-for-java&lt;br /&gt;
* https://lessthanoptimal.github.io/Java-Matrix-Benchmark/&lt;br /&gt;
* http://java.dzone.com/announcements/introduction-efficient-java&lt;br /&gt;
* https://shakthydoss.wordpress.com/2011/01/13/jama-shortcoming/&lt;br /&gt;
* Various questions on stackoverflow.com&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Users&amp;diff=296</id>
		<title>Users</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Users&amp;diff=296"/>
		<updated>2020-12-23T11:54:25Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projects which use EJML =&lt;br /&gt;
&lt;br /&gt;
Feel free to add your own project!&lt;br /&gt;
&lt;br /&gt;
* A ton of [https://scholar.google.com/scholar?q=%22efficient+java+matrix+library%22&amp;amp;hl=en&amp;amp;as_sdt=0,5 academic papers]&lt;br /&gt;
* [https://www.db.bme.hu/preprints/thesis2018-multidimensional-graph-analysis.pdf Petra Várhegyi&amp;#039;s masters thesis on graph analysis]&lt;br /&gt;
* [http://wiki.industrial-craft.net Industrial Craft 2] modification for minecraft&lt;br /&gt;
* [http://www-lium.univ-lemans.fr/diarization/doku.php/ LIUM_SpkDiarization] is a software dedicated to speaker diarization (ie speaker segmentation and clustering).&lt;br /&gt;
* [http://researchers.lille.inria.fr/~freno/JProGraM.html JProGraM]: Library for learning a number of statistical models from data.&lt;br /&gt;
* [http://code.google.com/p/gogps/ goGPS]: Improve the positioning accuracy of low-cost GPS devices by RTK technique.&lt;br /&gt;
* [http://www-edc.eng.cam.ac.uk/tools/set_visualiser/ Set Visualiser]: Visualises the way that a number of items is classified into one or more categories or sets using Euler diagrams.&lt;br /&gt;
* Universal Java Matrix Library (UJML): http://www.ujmp.org/&lt;br /&gt;
* Scalalab: http://code.google.com/p/scalalab/&lt;br /&gt;
* Java Content Based Image Retrieval (JCBIR): http://code.google.com/p/jcbir/&lt;br /&gt;
* JLabGroovy: http://code.google.com/p/jlabgroovy/&lt;br /&gt;
* JquantLib (Will be added): http://www.jquantlib.org/&lt;br /&gt;
* Matlube: https://github.com/hohonuuli/matlube&lt;br /&gt;
* Geometric Regression Library: http://georegression.org/&lt;br /&gt;
* BoofCV: Computer Vision Library: http://boofcv.org/&lt;br /&gt;
* ICY: bio-imaging: http://www.bioimageanalysis.com/icy/&lt;br /&gt;
* JSkills: Java implementation of TrueSkill algorithm https://github.com/nsp/JSkills&lt;br /&gt;
* Portfolio applets at http://www.christoph-junge.de/optimizer.php&lt;br /&gt;
* Distributed Control Framework (DCF) http://www.i-a-i.com/dcfpro/&lt;br /&gt;
* JptView point cloud viewer: http://www.seas.upenn.edu/~aiv/jptview/&lt;br /&gt;
* JPrIME Bayesian phylogenetics library: http://code.google.com/p/jprime/&lt;br /&gt;
* J-Matrix quantum mechanics scattering https://code.google.com/p/jmatrix/&lt;br /&gt;
* DDogleg Numerics: http://ddogleg.org&lt;br /&gt;
* Saddle: http://saddle.github.io/doc/index.html&lt;br /&gt;
* GDSC ImageJ Plugins: http://www.sussex.ac.uk/gdsc/intranet/microscopy/imagej/gdsc_plugins&lt;br /&gt;
* Robot Controller for Humanoid Robots: http://www.ihmc.us/Research/projects/HumanoidRobots/index.html&lt;br /&gt;
* Credit Analytics: http://code.google.com/p/creditanalytics&lt;br /&gt;
* Spline Library: http://code.google.com/p/splinelibrary - http://www.credit-trader.org/CreditSuite/docs/SplineLibrary_2.2.pdf&lt;br /&gt;
* Fixed Point Finder: http://code.google.com/p/rootfinder - http://www.credit-trader.org/CreditSuite/docs/FixedPointFinder_2.2.pdf&lt;br /&gt;
* Sensitivity generation scheme in Credit Analytics: http://www.credit-trader.org/CreditSuite/docs/SensitivityGenerator_2.2.pdf&lt;br /&gt;
* Stanford CoreNLP: A set of natural language analysis tools:  http://nlp.stanford.edu/software/corenlp.shtml &lt;br /&gt;
* OpenChrom: Open source software for the mass spectrometric analysis of chromatographic data.  https://www.openchrom.net&lt;br /&gt;
&lt;br /&gt;
= Papers That Cite EJML =&lt;br /&gt;
* Zewdie, Dawit Dawit Habtamu. &amp;quot;Representation discovery in non-parametric reinforcement learning.&amp;quot; Diss. Massachusetts Institute of Technology, 2014.&lt;br /&gt;
* Sanfilippo, Filippo, et al. &amp;quot;A mapping approach for controlling different maritime cranes and robots using ANN.&amp;quot; Mechatronics and Automation (ICMA), 2014 IEEE International Conference on. IEEE, 2014.&lt;br /&gt;
* Kushman, Nate, et al. &amp;quot;Learning to automatically solve algebra word problems.&amp;quot; ACL (1) (2014): 271-281.&lt;br /&gt;
* Stergios Papadimitriou, Seferina Mavroudi, Kostas Theofilatos, and Spiridon Likothanasis, “MATLAB-Like Scripting of Java Scientific Libraries in ScalaLab,” Scientific Programming, vol. 22, no. 3, pp. 187-199, 2014.&lt;br /&gt;
* Alberto Castellini, Daniele Paltrinieri, and Vincenzo Manca &amp;quot;MP-GeneticSynth: Inferring Biological Network Regulations from Time Series&amp;quot; Bioinformatics 2014&lt;br /&gt;
* Blasinski, H., Bulan, O., &amp;amp; Sharma, G. (2013). Per-Colorant-Channel Color Barcodes for Mobile Applications: An Interference Cancellation Framework.&lt;br /&gt;
* Marin, R. C., &amp;amp; Dobre, C. (2013, November). Reaching for the clouds: contextually enhancing smartphones for energy efficiency. In Proceedings of the 2nd ACM workshop on High performance mobile opportunistic systems (pp. 31-38). ACM.&lt;br /&gt;
* Oletic, D., Skrapec, M., &amp;amp; Bilas, V. (2013). Monitoring Respiratory Sounds: Compressed Sensing Reconstruction via OMP on Android Smartphone. In Wireless Mobile Communication and Healthcare (pp. 114-121). Springer Berlin Heidelberg.&lt;br /&gt;
* Santhiar, Anirudh and Pandita, Omesh and Kanade, Aditya &amp;quot;Discovering Math APIs by Mining Unit Tests&amp;quot; Fundamental Approaches to Software Engineering 2013&lt;br /&gt;
* Sanjay K. Boddhu, Robert L. Williams, Edward Wasser, Niranjan Kode, &amp;quot;Increasing Situational Awareness using Smartphones&amp;quot; Proc. SPIE 8389, Ground/Air Multisensor Interoperability, Integration, and Networking for Persistent ISR III, 83891J (May 1, 2012)&lt;br /&gt;
* J. A. Álvarez-Bermejo, N. Antequera, R. García-Rubio and J. A. López-Ramos, _&amp;quot;A scalable server for key distribution and its application to accounting,&amp;quot;_ The Journal of Supercomputing, 2012&lt;br /&gt;
* Realini E., Yoshida D., Reguzzoni M., Raghavan V., _&amp;quot;Enhanced satellite positioning as a web service with goGPS open source software&amp;quot;_. Applied Geomatics 4(2), 135-142. 2012&lt;br /&gt;
* Stergios Papadimitriou, Constantinos Terzidis, Seferina Mavroudi, Spiridon D. Likothanassis: _Exploiting java scientific libraries with the scala language within the scalalab environment._ IET Software 5(6): 543-551 (2011)&lt;br /&gt;
* L. T. Lim, B. Ranaivo-Malançon and E. K. Tang. _“Symbiosis Between a Multilingual Lexicon and Translation Example Banks”._ In: Procedia: Social and Behavioral Sciences 27 (2011), pp. 61–69.&lt;br /&gt;
* G. Taboada, S. Ramos, R. Expósito, J. Touriño, R. Doallo, _Java in the High Performance Computing arena: Research, practice and experience,_ Science of Computer Programming, 2011.&lt;br /&gt;
* http://geomatica.como.polimi.it/presentazioni/Osaka_Summer_goGPS.pdf&lt;br /&gt;
* http://www.holger-arndt.de/library/MLOSS2010.pdf&lt;br /&gt;
* http://www.ateji.com/px/whitepapers/Ateji%20PX%20MatMult%20Whitepaper%20v1.2.pdf&lt;br /&gt;
&lt;br /&gt;
Note:  Slowly working on an EJML paper for publication.  About 1/2 way through a first draft.&lt;br /&gt;
&lt;br /&gt;
= On The Web =&lt;br /&gt;
* https://softwarerecs.stackexchange.com/questions/51330/sparse-matrix-library-for-java&lt;br /&gt;
* https://lessthanoptimal.github.io/Java-Matrix-Benchmark/&lt;br /&gt;
* http://java.dzone.com/announcements/introduction-efficient-java&lt;br /&gt;
* https://shakthydoss.wordpress.com/2011/01/13/jama-shortcoming/&lt;br /&gt;
* Various questions on stackoverflow.com&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Users&amp;diff=295</id>
		<title>Users</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Users&amp;diff=295"/>
		<updated>2020-12-23T11:50:28Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Projects which use EJML =&lt;br /&gt;
&lt;br /&gt;
Feel free to add your own project!&lt;br /&gt;
&lt;br /&gt;
* [https://www.db.bme.hu/preprints/thesis2018-multidimensional-graph-analysis.pdf Petra Várhegyi&amp;#039;s masters thesis on graph analysis]&lt;br /&gt;
* [http://wiki.industrial-craft.net Industrial Craft 2] modification for minecraft&lt;br /&gt;
* [http://www-lium.univ-lemans.fr/diarization/doku.php/ LIUM_SpkDiarization] is a software dedicated to speaker diarization (ie speaker segmentation and clustering).&lt;br /&gt;
* [http://researchers.lille.inria.fr/~freno/JProGraM.html JProGraM]: Library for learning a number of statistical models from data.&lt;br /&gt;
* [http://code.google.com/p/gogps/ goGPS]: Improve the positioning accuracy of low-cost GPS devices by RTK technique.&lt;br /&gt;
* [http://www-edc.eng.cam.ac.uk/tools/set_visualiser/ Set Visualiser]: Visualises the way that a number of items is classified into one or more categories or sets using Euler diagrams.&lt;br /&gt;
* Universal Java Matrix Library (UJML): http://www.ujmp.org/&lt;br /&gt;
* Scalalab: http://code.google.com/p/scalalab/&lt;br /&gt;
* Java Content Based Image Retrieval (JCBIR): http://code.google.com/p/jcbir/&lt;br /&gt;
* JLabGroovy: http://code.google.com/p/jlabgroovy/&lt;br /&gt;
* JquantLib (Will be added): http://www.jquantlib.org/&lt;br /&gt;
* Matlube: https://github.com/hohonuuli/matlube&lt;br /&gt;
* Geometric Regression Library: http://georegression.org/&lt;br /&gt;
* BoofCV: Computer Vision Library: http://boofcv.org/&lt;br /&gt;
* ICY: bio-imaging: http://www.bioimageanalysis.com/icy/&lt;br /&gt;
* JSkills: Java implementation of TrueSkill algorithm https://github.com/nsp/JSkills&lt;br /&gt;
* Portfolio applets at http://www.christoph-junge.de/optimizer.php&lt;br /&gt;
* Distributed Control Framework (DCF) http://www.i-a-i.com/dcfpro/&lt;br /&gt;
* JptView point cloud viewer: http://www.seas.upenn.edu/~aiv/jptview/&lt;br /&gt;
* JPrIME Bayesian phylogenetics library: http://code.google.com/p/jprime/&lt;br /&gt;
* J-Matrix quantum mechanics scattering https://code.google.com/p/jmatrix/&lt;br /&gt;
* DDogleg Numerics: http://ddogleg.org&lt;br /&gt;
* Saddle: http://saddle.github.io/doc/index.html&lt;br /&gt;
* GDSC ImageJ Plugins: http://www.sussex.ac.uk/gdsc/intranet/microscopy/imagej/gdsc_plugins&lt;br /&gt;
* Robot Controller for Humanoid Robots: http://www.ihmc.us/Research/projects/HumanoidRobots/index.html&lt;br /&gt;
* Credit Analytics: http://code.google.com/p/creditanalytics&lt;br /&gt;
* Spline Library: http://code.google.com/p/splinelibrary - http://www.credit-trader.org/CreditSuite/docs/SplineLibrary_2.2.pdf&lt;br /&gt;
* Fixed Point Finder: http://code.google.com/p/rootfinder - http://www.credit-trader.org/CreditSuite/docs/FixedPointFinder_2.2.pdf&lt;br /&gt;
* Sensitivity generation scheme in Credit Analytics: http://www.credit-trader.org/CreditSuite/docs/SensitivityGenerator_2.2.pdf&lt;br /&gt;
* Stanford CoreNLP: A set of natural language analysis tools:  http://nlp.stanford.edu/software/corenlp.shtml &lt;br /&gt;
* OpenChrom: Open source software for the mass spectrometric analysis of chromatographic data.  https://www.openchrom.net&lt;br /&gt;
&lt;br /&gt;
= Papers That Cite EJML =&lt;br /&gt;
* Zewdie, Dawit Dawit Habtamu. &amp;quot;Representation discovery in non-parametric reinforcement learning.&amp;quot; Diss. Massachusetts Institute of Technology, 2014.&lt;br /&gt;
* Sanfilippo, Filippo, et al. &amp;quot;A mapping approach for controlling different maritime cranes and robots using ANN.&amp;quot; Mechatronics and Automation (ICMA), 2014 IEEE International Conference on. IEEE, 2014.&lt;br /&gt;
* Kushman, Nate, et al. &amp;quot;Learning to automatically solve algebra word problems.&amp;quot; ACL (1) (2014): 271-281.&lt;br /&gt;
* Stergios Papadimitriou, Seferina Mavroudi, Kostas Theofilatos, and Spiridon Likothanasis, “MATLAB-Like Scripting of Java Scientific Libraries in ScalaLab,” Scientific Programming, vol. 22, no. 3, pp. 187-199, 2014.&lt;br /&gt;
* Alberto Castellini, Daniele Paltrinieri, and Vincenzo Manca &amp;quot;MP-GeneticSynth: Inferring Biological Network Regulations from Time Series&amp;quot; Bioinformatics 2014&lt;br /&gt;
* Blasinski, H., Bulan, O., &amp;amp; Sharma, G. (2013). Per-Colorant-Channel Color Barcodes for Mobile Applications: An Interference Cancellation Framework.&lt;br /&gt;
* Marin, R. C., &amp;amp; Dobre, C. (2013, November). Reaching for the clouds: contextually enhancing smartphones for energy efficiency. In Proceedings of the 2nd ACM workshop on High performance mobile opportunistic systems (pp. 31-38). ACM.&lt;br /&gt;
* Oletic, D., Skrapec, M., &amp;amp; Bilas, V. (2013). Monitoring Respiratory Sounds: Compressed Sensing Reconstruction via OMP on Android Smartphone. In Wireless Mobile Communication and Healthcare (pp. 114-121). Springer Berlin Heidelberg.&lt;br /&gt;
* Santhiar, Anirudh and Pandita, Omesh and Kanade, Aditya &amp;quot;Discovering Math APIs by Mining Unit Tests&amp;quot; Fundamental Approaches to Software Engineering 2013&lt;br /&gt;
* Sanjay K. Boddhu, Robert L. Williams, Edward Wasser, Niranjan Kode, &amp;quot;Increasing Situational Awareness using Smartphones&amp;quot; Proc. SPIE 8389, Ground/Air Multisensor Interoperability, Integration, and Networking for Persistent ISR III, 83891J (May 1, 2012)&lt;br /&gt;
* J. A. Álvarez-Bermejo, N. Antequera, R. García-Rubio and J. A. López-Ramos, _&amp;quot;A scalable server for key distribution and its application to accounting,&amp;quot;_ The Journal of Supercomputing, 2012&lt;br /&gt;
* Realini E., Yoshida D., Reguzzoni M., Raghavan V., _&amp;quot;Enhanced satellite positioning as a web service with goGPS open source software&amp;quot;_. Applied Geomatics 4(2), 135-142. 2012&lt;br /&gt;
* Stergios Papadimitriou, Constantinos Terzidis, Seferina Mavroudi, Spiridon D. Likothanassis: _Exploiting java scientific libraries with the scala language within the scalalab environment._ IET Software 5(6): 543-551 (2011)&lt;br /&gt;
* L. T. Lim, B. Ranaivo-Malançon and E. K. Tang. _“Symbiosis Between a Multilingual Lexicon and Translation Example Banks”._ In: Procedia: Social and Behavioral Sciences 27 (2011), pp. 61–69.&lt;br /&gt;
* G. Taboada, S. Ramos, R. Expósito, J. Touriño, R. Doallo, _Java in the High Performance Computing arena: Research, practice and experience,_ Science of Computer Programming, 2011.&lt;br /&gt;
* http://geomatica.como.polimi.it/presentazioni/Osaka_Summer_goGPS.pdf&lt;br /&gt;
* http://www.holger-arndt.de/library/MLOSS2010.pdf&lt;br /&gt;
* http://www.ateji.com/px/whitepapers/Ateji%20PX%20MatMult%20Whitepaper%20v1.2.pdf&lt;br /&gt;
&lt;br /&gt;
Note:  Slowly working on an EJML paper for publication.  About 1/2 way through a first draft.&lt;br /&gt;
&lt;br /&gt;
= On The Web =&lt;br /&gt;
* https://softwarerecs.stackexchange.com/questions/51330/sparse-matrix-library-for-java&lt;br /&gt;
* https://lessthanoptimal.github.io/Java-Matrix-Benchmark/&lt;br /&gt;
* http://java.dzone.com/announcements/introduction-efficient-java&lt;br /&gt;
* https://shakthydoss.wordpress.com/2011/01/13/jama-shortcoming/&lt;br /&gt;
* Various questions on stackoverflow.com&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=294</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=294"/>
		<updated>2020-11-05T05:37:12Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for small and large, dense and sparse, real and complex matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.40&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;November 4, 2020&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.40/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&lt;br /&gt;
EJML is currently a single threaded library only.  Multi threaded work will start once block implementations of SVD and Eigenvalue are finished.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Download&amp;diff=293</id>
		<title>Download</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Download&amp;diff=293"/>
		<updated>2020-11-05T05:33:43Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Source Code ==&lt;br /&gt;
&lt;br /&gt;
Source code is hosted on Github.  There you can access the absolute bleeding edge code.  Most of the time it is in an usable state, but not always!&lt;br /&gt;
&lt;br /&gt;
[https://github.com/lessthanoptimal/ejml https://github.com/lessthanoptimal/ejml]&lt;br /&gt;
&lt;br /&gt;
The command to clone it is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
git clone https://github.com/lessthanoptimal/ejml.git&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Current status of developmental code:&lt;br /&gt;
&lt;br /&gt;
[https://travis-ci.org/lessthanoptimal/ejml https://api.travis-ci.org/lessthanoptimal/ejml.png]&lt;br /&gt;
&lt;br /&gt;
== Download ==&lt;br /&gt;
&lt;br /&gt;
Jars of the latest stable release can be found on Source Forge using the following link: [https://sourceforge.net/projects/ejml/files/v0.40/ EJML Downloads]&lt;br /&gt;
&lt;br /&gt;
== Gradle and Maven ==&lt;br /&gt;
&lt;br /&gt;
EJML is broken up into several packages (see list below) and including each individually can be tedious.  To include all the packages simply reference &amp;quot;all&amp;quot;, as is shown below:&lt;br /&gt;
&lt;br /&gt;
Gradle:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;groovy&amp;quot;&amp;gt;&lt;br /&gt;
  compile group: &amp;#039;org.ejml&amp;#039;, name: &amp;#039;ejml-all&amp;#039;, version: &amp;#039;0.40&amp;#039;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maven:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;dependency&amp;gt;&lt;br /&gt;
  &amp;lt;groupId&amp;gt;org.ejml&amp;lt;/groupId&amp;gt;&lt;br /&gt;
  &amp;lt;artifactId&amp;gt;ejml-all&amp;lt;/artifactId&amp;gt;&lt;br /&gt;
  &amp;lt;version&amp;gt;0.40&amp;lt;/version&amp;gt;&lt;br /&gt;
&amp;lt;/dependency&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Individual modules:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Module Name      !! Description&lt;br /&gt;
|-&lt;br /&gt;
| ejml-all         || All the modules&lt;br /&gt;
|-&lt;br /&gt;
| ejml-ddense      || Dense Real Double Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-fdense      || Dense Real Float Matrices &lt;br /&gt;
|-&lt;br /&gt;
| ejml-zdense      || Dense Complex Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-cdense      || Dense Complex Float Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-simple      || SimpleMatrix and Equations&lt;br /&gt;
|-&lt;br /&gt;
| ejml-dsparse     || Sparse Real Double Matrices&lt;br /&gt;
|-&lt;br /&gt;
| ejml-fsparse     || Sparse Real Float Matrices&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
	<entry>
		<id>https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=292</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://ejml.org/wiki/index.php?title=Main_Page&amp;diff=292"/>
		<updated>2020-11-05T05:31:26Z</updated>

		<summary type="html">&lt;p&gt;Peter: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ &lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| style=&amp;quot;width:640pt;&amp;quot;&lt;br /&gt;
| align=&amp;quot;center&amp;quot; |&lt;br /&gt;
[[File:Ejml_logo.gif]]&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&lt;br /&gt;
Efficient Java Matrix Library (EJML) is a [http://en.wikipedia.org/wiki/Linear_algebra linear algebra]  library for manipulating real/complex/dense/sparse matrices. Its design goals are; 1) to be as computationally and memory efficient as possible for both small and large matrices, and 2) to be accessible to both novices and experts. These goals are accomplished by dynamically selecting the best algorithms to use at runtime, clean API, and multiple interfaces. EJML is free, written in 100% Java and has been released under an Apache v2.0 license.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
EJML has three distinct ways to interact with it:  1) &amp;#039;&amp;#039;procedural&amp;#039;&amp;#039;, 2) &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;, and 3) &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;.  &amp;#039;&amp;#039;Procedure&amp;#039;&amp;#039; provides all capabilities of EJML and almost complete control over memory creation, speed, and specific algorithms.  &amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039; provides a simplified subset of the core capabilities in an easy to use flow styled object-oriented API, inspired by [http://math.nist.gov/javanumerics/jama/ Jama].  &amp;#039;&amp;#039;Equations&amp;#039;&amp;#039; is a symbolic interface, similar in spirit to [http://www.mathworks.com/products/matlab/ Matlab] and other [http://en.wikipedia.org/wiki/Computer_algebra_system CAS], that provides a compact way of writing equations.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; align=&amp;quot;center&amp;quot; |&lt;br /&gt;
{|style=&amp;quot;font-size:120%; text-align:left;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Version:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;v0.40&amp;#039;&amp;#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Date:&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;November 4, 2020&amp;#039;&amp;#039; &lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/master/convert_to_ejml31.py v0.31 Upgrade Script]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/blob/v0.40/change.txt Change Log]&lt;br /&gt;
|}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; &lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse; background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Download|Download]]&lt;br /&gt;
|-&lt;br /&gt;
| [[manual|Manual]]&lt;br /&gt;
|-&lt;br /&gt;
| [http://ejml.org/javadoc/ JavaDoc]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [http://groups.google.com/group/efficient-java-matrix-library-discuss Message Board]&lt;br /&gt;
|-&lt;br /&gt;
| [https://github.com/lessthanoptimal/ejml/issues Bug Reports]&lt;br /&gt;
|-&lt;br /&gt;
| [[Frequently Asked Questions|FAQ]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Kotlin|Kotlin]]&lt;br /&gt;
|}&lt;br /&gt;
| width=&amp;quot;220pt&amp;quot; |&lt;br /&gt;
{| width=&amp;quot;200pt&amp;quot; border=&amp;quot;1&amp;quot;  align=&amp;quot;center&amp;quot; style=&amp;quot;font-size:120%; text-align:center; border-collapse:collapse;  background-color:#ffffee;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| [[Acknowledgments|Acknowledgments]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Performance|Performance]]&lt;br /&gt;
|-&lt;br /&gt;
| [[Users|Users]]&lt;br /&gt;
|}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Code Examples ==&lt;br /&gt;
&lt;br /&gt;
Demonstrations on how to compute the Kalman gain &amp;quot;K&amp;quot; using each interface in EJML.&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;500pt&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Procedural&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
mult(H,P,c);&lt;br /&gt;
multTransB(c,H,S);&lt;br /&gt;
addEquals(S,R);&lt;br /&gt;
if( !invert(S,S_inv) )&lt;br /&gt;
    throw new RuntimeException(&amp;quot;Invert failed&amp;quot;);&lt;br /&gt;
multTransA(H,S_inv,d);&lt;br /&gt;
mult(P,d,K);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SimpleMatrix&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
SimpleMatrix S = H.mult(P).mult(H.transpose()).plus(R);&lt;br /&gt;
SimpleMatrix K = P.mult(H.transpose().mult(S.invert()));&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Equations&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;java&amp;quot;&amp;gt;&lt;br /&gt;
eq.process(&amp;quot;K = P*H&amp;#039;*inv( H*P*H&amp;#039; + R )&amp;quot;);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Functionality == &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
!  Data Structures || Operations&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Fixed Sized&lt;br /&gt;
** Matrix 2x2 to 6x6&lt;br /&gt;
** Vector 2 to 6&lt;br /&gt;
* Dense Real&lt;br /&gt;
** Row-major&lt;br /&gt;
** Block&lt;br /&gt;
* Dense Complex&lt;br /&gt;
** Row-major&lt;br /&gt;
* Sparse Real&lt;br /&gt;
** Compressed Column&lt;br /&gt;
&lt;br /&gt;
| style=&amp;quot;vertical-align:top;&amp;quot; |&lt;br /&gt;
* Full support for floats and doubles&lt;br /&gt;
* Basic Operators (addition, multiplication, ... )&lt;br /&gt;
* Matrix Manipulation (extract, insert, combine, ... )&lt;br /&gt;
* Linear Solvers (linear, least squares, incremental, ... )&lt;br /&gt;
* Decompositions (LU, QR, Cholesky, SVD, Eigenvalue, ...)&lt;br /&gt;
* Matrix Features (rank, symmetric, definitiveness, ... )&lt;br /&gt;
* Random Matrices (covariance, orthogonal, symmetric, ... )&lt;br /&gt;
* Unit Testing&lt;br /&gt;
|}.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; width=&amp;quot;650pt&amp;quot; border=&amp;quot;1&amp;quot; |&lt;br /&gt;
! style=&amp;quot;width: 40%;&amp;quot; | Decomposition || style=&amp;quot;width: 15%;&amp;quot; |Dense Real || style=&amp;quot;width: 15%;&amp;quot; |Dense Complex || style=&amp;quot;width: 15%;&amp;quot; |Sparse Real  || style=&amp;quot;width: 15%;&amp;quot; |Sparse Complex&lt;br /&gt;
|-&lt;br /&gt;
| LU || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| Cholesky LDL || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| QR || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | X || &lt;br /&gt;
|-&lt;br /&gt;
| QRP || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| SVD || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-Symmetric || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|-&lt;br /&gt;
| Eigen-General || style=&amp;quot;text-align:center;&amp;quot; | X || style=&amp;quot;text-align:center;&amp;quot; | || || &lt;br /&gt;
|}&lt;br /&gt;
Support for floats (32-bit) and doubles (64-bit) is available.  Sparse matrix support is only available for basic operations at this time.&lt;br /&gt;
&lt;br /&gt;
EJML is currently a single threaded library only.  Multi threaded work will start once block implementations of SVD and Eigenvalue are finished.&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;/div&gt;</summary>
		<author><name>Peter</name></author>
	</entry>
</feed>