Symmetric Matrices in IronPython QuickStart Sample

Illustrates how to work efficiently with symmetric matrices in IronPython.

View this sample in: C# Visual Basic F#

```Python
import numerics

from math import sin

from System import Array

from Extreme.Mathematics import *
# The SymmetricMatrix class resides in the Extreme.Mathematics.LinearAlgebra
# namespace.
from Extreme.Mathematics.LinearAlgebra import *

# Illustrates the use of the SymmetricMatrix class in the 
# Extreme.Mathematics.LinearAlgebra namespace of Numerics.NET.

# Symmetric matrices are matrices whose elements
# are symmetrical around the main diagonal.
# Symmetric matrices are always square, and are
# equal to their own transpose.

#
# Constructing symmetric matrices
#

# Constructing symmetric matrices is similar to
# constructing general matrices. See the
# BasicMatrices QuickStart samples for a more
# complete discussion.
			
# Symmetric matrices are always square. You don't
# have to specify both the number of rows and the
# number of columns.
#
# The following creates a 5x5 symmetric matrix:
s1 = Matrix.CreateSymmetric[float](5)

# Symmetric matrices access and modify only the
# elements on and either above or below the 
# main diagonal. When initializing a
# symmetric matrix in a constructor, you must
# specify a triangleMode parameter that specifies
# whether to use the upper or lower triangle:
components = Array[float]([ \
    11, 12, 13, 14, 15, \
    21, 22, 23, 24, 25, \
    31, 32, 33, 34, 35, \
    41, 42, 43, 44, 45, \
    51, 52, 53, 54, 55 ])
s2 = Matrix.CreateSymmetric(5, components, MatrixTriangle.Upper, MatrixElementOrder.ColumnMajor)
print "s2 = {0:.0f}".format(s2)

# You can also create a symmetric matrix by
# multiplying any matrix by its transpose:
m = Matrix.Create(3, 4, Array[float]([ \
    1, 2, 3, 2, \
    3, 4, 3, 4, \
    5, 4, 5, 7 ]), \
	MatrixElementOrder.ColumnMajor)
print "m = {0:.0f}".format(m)
# This calculates transpose(m) times m:
s3 = SymmetricMatrix[float].FromOuterProduct(m)
print "s3 = {0:.0f}".format(s3)
# An optional 'side' parameter lets you specify
# whether the left or right operand of the 
# multiplication is the transposed matrix.
# This calculates m times transpose(m):
s4 = SymmetricMatrix[float].FromOuterProduct(m, MatrixOperationSide.Right)
print "s4 = {0:.0f}".format(s4)

#
# SymmetricMatrix methods
#

# The GetEigenvalues method returns a vector
# containing the eigenvalues.
l = s4.GetEigenvalues()
print "Eigenvalues: {0:.4f}".format(l)

# The ApplyMatrixFunction calculates a function 
# of the entire matrix. For example, to calculate
# the 'sine' of a matrix:
sinS = s4.ApplyMatrixFunction(sin)
print "sin(s4): {0:.4f}".format(sinS)

# Symmetric matrices don't have any specific
# properties.

# You can get and set matrix elements:
s3[1, 3] = 55
print "s3[1, 3] =", s3[1, 3]
# And the change will automatically be reflected
# in the symmetric element:
print "s3[3, 1] =", s3[3, 1]

#
# Row and column views
#

# The GetRow and GetColumn methods are
# available.
rom = s2.GetRow(1)
row = s2[1,:]
print "row 1 of s2 =", row
column = s2.GetColumn(2, 3, 4)
column = s2[3:5, 2]
print "column 3 of s2 from row 4 to row 5 =", column
```