blob: 2006f91b56956333356ef2ed8265abc3368dad3f [file] [log] [blame]
<?xml version="1.0"?>
<!--
Copyright 2003-2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<?xml-stylesheet type="text/xsl" href="./xdoc.xsl"?>
<!-- $Revision$ $Date$ -->
<document url="linear.html">
<properties>
<title>The Commons Math User Guide - Linear Algebra</title>
</properties>
<body>
<section name="3 Linear Algebra">
<subsection name="3.1 Overview" href="overview">
<p>
Currently, numerical linear algebra support in commons-math is
limited to basic operations on real matrices and solving linear systems.
</p>
</subsection>
<subsection name="3.2 Real matrices" href="real_matrices">
<p>
The <a href="../apidocs/org/apache/commons/math/linear/RealMatrix.html">
RealMatrix</a> interface represents a matrix with real numbers as
entries. The following basic matrix operations are supported:
<ul>
<li>Matrix addition, subtraction, mutiplication</li>
<li>Scalar addition and multiplication</li>
<li>Inverse and transpose</li>
<li>Determinants and singularity testing</li>
<li>LU decomposition</li>
<li>Norm and Trace</li>
<li>Operation on a vector</li>
</ul>
</p>
<p>
Example:
<source>
// Create a real matrix with two rows and three columns
double[][] matrixData = { {1d,2d,3d}, {2d,5d,3d}};
RealMatrix m = new RealMatrixImpl(matrixData);
// One more with three rows, two columns
double[][] matrixData2 = { {1d,2d}, {2d,5d}, {1d, 7d}};
RealMatrix n = new RealMatixImpl(matrixData2);
// Note: constructor makes a
// Fresh copy of the input double[][] array
// Now multiply m by n
RealMatrix p = m.multiply(n);
System.out.println(p.getRowDimension()); // 2
System.out.println(p.getRowDimension()); // 2
// Invert p
RealMatrix pInverse = p.inverse();
</source>
</p>
</subsection>
<subsection name="3.3 Solving linear systems" href="solve">
<p>
The <code>solve()</code> methods of the <code>RealMatrix</code> interface
support solving linear systems of equations. In each case, the
<code>RealMatrix</code> represents the coefficient matrix of the system.
For example, to solve the linear system
<pre>
2x + 3y - 2z = 1
-x + 7y + 6x = -2
4x - 3y - 5z = 1
</pre>
Start by creating a RealMatrix to store the coefficients
<source>
double[][] coefficientsData = {{2, 3, -2}, {-1, 7, 6}, {4, -3, -5}};
RealMatrix coefficients = new RealMatrixImpl(coefficientsData);
</source>
Next create a <code>double[]</code> array to represent the constant
vector and use <code>solve(double[])</code> to solve the system
<source>
double[] constants = {1, -2, 1};
double[] solution = coefficients.solve(constants);
</source>
The <code>solution</code> array will contain values for x
(<code>solution[0]</code>), y (<code>solution[1]</code>),
and z (<code>solution[2]</code>) that solve the system.
</p>
<p>
If the coefficient matrix is not square or singular, an
<a href="../apidocs/org/apache/commons/math/linear/InvalidMatrixException.html">
InvalidMatrixException</a> is thrown.
</p>
<p>
It is possible to solve multiple systems with the same coefficient matrix
in one method call. To do this, create a matrix whose column vectors correspond
to the constant vectors for the systems to be solved and use
<code>solve(RealMatrix),</code> which returns a matrix with column
vectors representing the solutions.
</p>
</subsection>
</section>
</body>
</document>