Triangular Matrices in IronPython QuickStart Sample

Illustrates how to work efficiently with upper or lower triangular or trapezoidal matrices in IronPython.

View this sample in: C# Visual Basic F#

```Python
from System import Array

import numerics

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

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

# Triangular matrices are matrices whose elements
# above or below the diagonal are all zero. The
# former is called lower triangular, the latter
# lower triangular. In addition, triangular matrices
# can have all 1's on the diagonal.

#
# Constructing triangular matrices
#

# Constructing triangular matrices is similar to
# constructing general matrices. See the
# BasicMatrices QuickStart samples for a more
# complete discussion.
#
# All constructors take a MatrixTriangle
# value as their first parameter. This indicates
# whether an upper or lower triangular matrix 
# should be created. The following creates a
# 5x5 lower triangular matrix:
t1 = Matrix.CreateLowerTriangular(5, 5)
# You can also specify whether the diagonal 
# consists of all 1's using a unitDiagonal parameter:
t2 = Matrix.CreateLowerTriangular(5, 5, MatrixDiagonal.UnitDiagonal)
# Triangular matrices access and modify only the
# elements that are non-zero. If the diagonal
# mode is UnitDiagonal, the diagonal elements
# are not used, since they are all equal to 1.
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 ])
# The following creates a matrix using the
# upper triangular part of the above.
t3 = Matrix.CreateUpperTriangular(5, 5, components, MatrixElementOrder.RowMajor)
print "t3 =", t3
# Same as above, but unit diagonal:
t4 = Matrix.CreateUpperTriangular(5, 5, components, MatrixDiagonal.UnitDiagonal, MatrixElementOrder.RowMajor, True)
print "t4 =", t4

#
# Extracting triangular matrices
#

# You may want to use part of a dense matrix
# as a triangular matrix. The static 
# ExtractUpperTriangle and ExtractLowerTriangle
# methods perform this task.
m = Matrix.Create(5, 5, components, MatrixElementOrder.ColumnMajor)
print "m =", m
# Both methods are overloaded. The simplest
# returns a triangular matrix of the same dimension:
t5 = TriangularMatrix.ExtractLowerTriangle(m)
print "t5 =", t5
# You can also specify if the matrix is unit diagonal:
t6 = TriangularMatrix.ExtractUpperTriangle(m, MatrixDiagonal.UnitDiagonal)
print "t6 =", t6
# Or the dimensions of the matrix if they don't 
# match the original:
t7 = TriangularMatrix.ExtractUpperTriangle(m, 3, 3, MatrixDiagonal.UnitDiagonal)
print "t7 =", t7
print 

#
# TriangularMatrix properties
#

# The IsLowerTriangular and IsUpperTriangular return
# a boolean value:
print "t4 is lower triangular? -", t4.IsLowerTriangular
print "t4 is upper triangular? -", t4.IsUpperTriangular
# The IsUnitDiagonal property indicates whether the
# matrix has all 1's on its diagonal:
print "t3 is unit diagonal? -", t3.IsUnitDiagonal
print "t4 is unit diagonal? -", t4.IsUnitDiagonal
print 
# You can get and set matrix elements:
t3[1, 3] = 55
print "t3[1, 3] =", t3[1, 3]
# But trying to set an element that is zero or
# is on the diagonal for a unit diagonal matrix
# causes an exception to be thrown:
try:
	t3[3, 1] = 100
except ComponentReadOnlyException as e:
	print "Error accessing element:", e.Message

#
# Rows and columns
#

# The GetRow and GetColumn methods are
# available.
row = t3.GetRow(1)
row = t3[1,:]
print "row 2 of t3 =", row
column = t4.GetColumn(1, 0, 2)
column = t4[0:3, 1]
print "2nd column of t4 from row 1 to 3 =", column
```