classes/Matrix.ps1

# Need to parameterize class with "id" in order to re-load class during testing
$Id = if ($Env:ProjectName -eq 'pwsh-prelude') { 'Test' } else { '' }
if ("Matrix${Id}" -as [Type]) {
  return
}
Add-Type -TypeDefinition @"
    using System;

    public class Matrix${Id} {

        public int[] Order;
        public double[][] Values;

        public Matrix${Id}(int n) {
            this.Order = new int[2];
            this.Order[0] = n;
            this.Order[1] = n;
            this.Values = Matrix${Id}.Create(n,n);
        }
        public Matrix${Id}(int m, int n) {
            this.Order = new int[2];
            this.Order[0] = m;
            this.Order[1] = n;
            this.Values = Matrix${Id}.Create(m,n);
        }
        public static double[][] Create(int m, int n) {
            double[][] result = new double[m][];
            for (var i = 0; i < m; ++i)
                result[i] = new double[n];
            return result;
        }
        public static Matrix${Id} Unit(int size) {
            var temp = new Matrix${Id}(size,size);
            for (var i = 0; i < temp.Order[0]; ++i)
                temp.Values[i][i] = 1;
            return temp;
        }
        public static Matrix${Id} Transpose(Matrix${Id} a) {
            var m = a.Order[0];
            var n = a.Order[1];
            var temp = new Matrix${Id}(n,m);
            for (var row = 0; row < m; ++row)
                for (var col = 0; col < n; ++col)
                    temp.Values[row][col] = a.Values[col][row];
            return temp;
        }
        public Matrix${Id} Add(Matrix${Id} a, Matrix${Id} b) {
            return a;
        }
        public Matrix${Id} Multiply(Matrix${Id} a, Matrix${Id} b) {
            return a;
        }
    }
"@