Pharo is a language that is better than other languages like Python in many ways.
For starters, the whole syntax of Pharo fits on a postcard. Pharo has a built-in live coding IDE that allows you to inspect and modify the code while it is running. Pharo is purely object-oriented which makes it really convenient to use.
But Pharo is a new language and doesn’t have as many libraries as languages like Python have.
Here we will see the package, Polymath that supports scientific computations in Pharo similar to the library, NumPy in Python.
We will be specifically looking into the usage of the PMMatrix class in Polymath that handles most of the matrix computations.
Initializing a 3x4 null matrix
aPMMatrix := PMMatrix rows: 3 columns: 4.
Initializing a specific matrix
To initialize a matrix as
[ 1 2]
[ 3 4]
aPMMatrix := PMMatrix rows: #(#(1 2) #(3 4)).
Similar to,
arr = numpy.array([[1,2],[3,4]])
Initializing a 2x3 matrix with ones
aPMMatrix := PMMatrix onesRows: 2 cols: 3.
Similar to,
a = numpy.ones([2,3],dtype = int)
Initializing a 2x3 matrix with zeroes
aPMMatrix := PMMatrix zerosRows: 2 cols: 3.
Similar to,
a = numpy.zeros([2,3],dtype = int)
Initializing a 3x4 matrix with random values
aPMMatrix := PMMatrix rows: 3 columns: 4 random: 10.
Here, the values in the matrix will always be less than or equal to 10.
In NumPy, something similar would be,
a = numpy.random.rand(3,4)
Initializing a 2x3 matrix with one specific value
We are filling the whole 2x3 matrix with 10 here.
aPMMatrix := PMMatrix rows: 2 columns: 3 element: 10.
Similar to,
a = numpy.full([2,3],10)
Dimension of a matrix
To find the dimension of a matrix,
aPMMatrix dimension.
In NumPy, it would be
a.shape
Matrix Product
To get the matrix product of matrices a and b,
c := a*b.
Note that here, b could also be a number instead of a matrix.
Element wise product
To multiply two matrices a and b element-wise,
c := a hadamardProduct: b.
Sum of rows
To find the sum of all rows of a matrix,
aPMMatrix sum.
Similar to numpy.sum()
Trace of a matrix
Similar to numpy.trace(), in Polymath, we can do
aPMMatrix tr.
Specify a condition on elements in matrix
" returns a boolean matrix with True if the element is lesser than 10 and False otherwise"
aPMMatrix < 10"checking if values are equal to 10"
aPMMatrix = 10
This is exactly similar to,
a < 10
a == 10
Argmax on columns and rows
To find argmax on all columns and rows of a matrix,
aPMMatrix argMaxOnColumns.
aPMMatrix argMaxOnRows.
Similar to numpy.argmax()
Flattening a matrix
To flatten a matrix on rows,
aPMMatrix flattenRows.
To flatten a matrix on columns,
aPMMatrix flattenColumns
Similar to numpy.flatten()
Accessing values
To access a value of a matrix at row 1, column 2
aPMMatrix at: 1 at: 2.
Note that in Pharo, we always follow 1th-indexing unlike Python
Changing values
To change the value at row 1, column 2 to a new element 10
aPMMatrix at: 1 at: 2 put: 10.
Accessing columns and rows
To get the 2nd column in a matrix,
aPMMatrix atColumn: 2.
Transpose of a matrix
In NumPy, we have numpy.transpose(). Similarly in Pharo,
aPMMatrix transpose.
Finding Determinant of a matrix
aPMMatrix determinant.
Finding Inverse of a matrix
aPMMatrix inverse.
Similar to numpy.linalg.inv()
Checking closeness of matrices
We can check if 2 matrices a and b are close to each other by a precision.
More formally, we check if the sum of the absolute values of the differences of each corresponding elements in the matrix is less than the given precision.
a closeTo: b precision: 0.0001.
Similar to numpy.isclose() in NumPy
Getting the Principal Diagonal
To get the principal diagonal of a matrix as a vector,
aPMMatrix principalDiagonal.
Similar to numpy.diagonal()
Rank of a matrix
Finding the rank of a matrix can be done by,
aPMMatrix rank.
Similar to numpy.linalg.matrix_rank() in NumPy.
Matrix Orthogonalization
To orthogonalize a matrix,
aPMMatrix orthogonalize.
Cholesky Decomposition
To perform cholesky decomposition on a matrix
aPMMatrix choleskyDecomposition.
Similar to numpy.linalg.cholesky()
QR Factorization
To perform QR decomposition of a matrix,
aPMMatrix qrFactorization.
These are some of the basic usages of the class PMMatrix in the Polymath package. Check out the Github repository for more.
If you have doubts, you can always ask them in the #polymath channel in the Pharo Discord community.