// // Math.NET Numerics, part of the Math.NET Project // http://numerics.mathdotnet.com // http://github.com/mathnet/mathnet-numerics // http://mathnetnumerics.codeplex.com // Copyright (c) 2009-2010 Math.NET // Permission is hereby granted, free of charge, to any person // obtaining a copy of this software and associated documentation // files (the "Software"), to deal in the Software without // restriction, including without limitation the rights to use, // copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the // Software is furnished to do so, subject to the following // conditions: // The above copyright notice and this permission notice shall be // included in all copies or substantial portions of the Software. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR // OTHER DEALINGS IN THE SOFTWARE. // using System; using System.Globalization; using MathNet.Numerics.LinearAlgebra.Double; namespace Examples.LinearAlgebraExamples { /// /// Basic matrix arithmetic operations as "+", "-", "*", "/" /// /// public class MatrixArithmeticOperations : IExample { /// /// Gets the name of this example /// public string Name { get { return "Matrix Arithmetics"; } } /// /// Gets the description of this example /// public string Description { get { return "Basic operations between matrix/matrix and matrix/vecor"; } } /// /// Run example /// /// Multiply matrix by scalar /// Multiply matrix by vector /// Multiply matrix by matrix /// Pointwise multiplies matrix with another matrix /// Addition and subtraction public void Run() { // Initialize IFormatProvider to print matrix/vector data var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone(); formatProvider.TextInfo.ListSeparator = " "; // Create matrix "A" var matrixA = DenseMatrix.OfArray(new[,] { { 1.0, 2.0, 3.0 }, { 4.0, 5.0, 6.0 }, { 7.0, 8.0, 9.0 } }); Console.WriteLine(@"Matrix A"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Create matrix "B" var matrixB = DenseMatrix.OfArray(new[,] { { 1.0, 3.0, 5.0 }, { 2.0, 4.0, 6.0 }, { 3.0, 5.0, 7.0 } }); Console.WriteLine(@"Matrix B"); Console.WriteLine(matrixB.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Multiply matrix by scalar // 1. Using operator "*" var resultM = 3.0 * matrixA; Console.WriteLine(@"Multiply matrix by scalar using operator *. (result = 3.0 * A)"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Multiply method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.Multiply(3.0); Console.WriteLine(@"Multiply matrix by scalar using method Multiply. (result = A.Multiply(3.0))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using Multiply method and updating matrix itself matrixA.Multiply(3.0, matrixA); Console.WriteLine(@"Multiply matrix by scalar using method Multiply. (A.Multiply(3.0, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Multiply matrix by vector (right-multiply) var vector = new DenseVector(new[] { 1.0, 2.0, 3.0 }); Console.WriteLine(@"Vector"); Console.WriteLine(vector.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 1. Using operator "*" var resultV = matrixA * vector; Console.WriteLine(@"Multiply matrix by vector using operator *. (result = A * vec)"); Console.WriteLine(resultV.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Multiply method and getting result into different vector instance resultV = (DenseVector)matrixA.Multiply(vector); Console.WriteLine(@"Multiply matrix by vector using method Multiply. (result = A.Multiply(vec))"); Console.WriteLine(resultV.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using Multiply method and updating vector itself matrixA.Multiply(vector, vector); Console.WriteLine(@"Multiply matrix by vector using method Multiply. (A.Multiply(vec, vec))"); Console.WriteLine(vector.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Multiply vector by matrix (left-multiply) // 1. Using operator "*" resultV = vector * matrixA; Console.WriteLine(@"Multiply vector by matrix using operator *. (result = vec * A)"); Console.WriteLine(resultV.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using LeftMultiply method and getting result into different vector instance resultV = (DenseVector)matrixA.LeftMultiply(vector); Console.WriteLine(@"Multiply vector by matrix using method LeftMultiply. (result = A.LeftMultiply(vec))"); Console.WriteLine(resultV.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using LeftMultiply method and updating vector itself matrixA.LeftMultiply(vector, vector); Console.WriteLine(@"Multiply vector by matrix using method LeftMultiply. (A.LeftMultiply(vec, vec))"); Console.WriteLine(vector.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Multiply matrix by matrix // 1. Using operator "*" resultM = matrixA * matrixB; Console.WriteLine(@"Multiply matrix by matrix using operator *. (result = A * B)"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Multiply method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.Multiply(matrixB); Console.WriteLine(@"Multiply matrix by matrix using method Multiply. (result = A.Multiply(B))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using Multiply method and updating matrix itself matrixA.Multiply(matrixB, matrixA); Console.WriteLine(@"Multiply matrix by matrix using method Multiply. (A.Multiply(B, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Pointwise multiplies matrix with another matrix // 1. Using PointwiseMultiply method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.PointwiseMultiply(matrixB); Console.WriteLine(@"Pointwise multiplies matrix with another matrix using method PointwiseMultiply. (result = A.PointwiseMultiply(B))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using PointwiseMultiply method and updating matrix itself matrixA.PointwiseMultiply(matrixB, matrixA); Console.WriteLine(@"Pointwise multiplies matrix with another matrix using method PointwiseMultiply. (A.PointwiseMultiply(B, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Pointwise divide matrix with another matrix // 1. Using PointwiseDivide method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.PointwiseDivide(matrixB); Console.WriteLine(@"Pointwise divide matrix with another matrix using method PointwiseDivide. (result = A.PointwiseDivide(B))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using PointwiseDivide method and updating matrix itself matrixA.PointwiseDivide(matrixB, matrixA); Console.WriteLine(@"Pointwise divide matrix with another matrix using method PointwiseDivide. (A.PointwiseDivide(B, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Addition // 1. Using operator "+" resultM = matrixA + matrixB; Console.WriteLine(@"Add matrices using operator +. (result = A + B)"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Add method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.Add(matrixB); Console.WriteLine(@"Add matrices using method Add. (result = A.Add(B))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using Add method and updating matrix itself matrixA.Add(matrixB, matrixA); Console.WriteLine(@"Add matrices using method Add. (A.Add(B, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Subtraction // 1. Using operator "-" resultM = matrixA - matrixB; Console.WriteLine(@"Subtract matrices using operator -. (result = A - B)"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Subtract method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.Subtract(matrixB); Console.WriteLine(@"Subtract matrices using method Subtract. (result = A.Subtract(B))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 3. Using Subtract method and updating matrix itself matrixA.Subtract(matrixB, matrixA); Console.WriteLine(@"Subtract matrices using method Subtract. (A.Subtract(B, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // Divide by scalar // 1. Using Divide method and getting result into different matrix instance resultM = (DenseMatrix)matrixA.Divide(3.0); Console.WriteLine(@"Divide matrix by scalar using method Divide. (result = A.Divide(3.0))"); Console.WriteLine(resultM.ToString("#0.00\t", formatProvider)); Console.WriteLine(); // 2. Using Divide method and updating matrix itself matrixA.Divide(3.0, matrixA); Console.WriteLine(@"Divide matrix by scalar using method Divide. (A.Divide(3.0, A))"); Console.WriteLine(matrixA.ToString("#0.00\t", formatProvider)); Console.WriteLine(); } } }