7 public abstract class Matrix
\r
9 public static Matrix gen(int row, int col)
\r
11 return new Internal.MatrixImplementation(row, col);
\r
14 public abstract double this[int row, int col]
\r
21 public abstract Internal.MatrixExpression this[Interval row, Interval col]
\r
29 public static Matrix operator +(Matrix m, double d)
\r
31 return new Internal.MatrixExpression();
\r
34 public void each(Func<double, double> f)
\r
36 for (int i = 1; i <= getRows(); i++)
\r
38 for (int j = 1; j <= getCols(); j++)
\r
40 this[i, j] = f(this[i, j]);
\r
45 public abstract int rows { get; }
\r
46 public abstract int cols { get; }
\r
47 public int getRows() { return rows; }
\r
48 public int getCols() { return cols; }
\r
56 public class MatrixImplementation : Matrix
\r
58 internal double[,] elements;
\r
60 public MatrixImplementation(int dnrow, int dncol)
\r
62 elements = new double[dnrow, dncol];
\r
65 public override double this[int row, int col]
\r
69 return elements[row - 1, col - 1];
\r
73 elements[row - 1, col - 1] = value;
\r
77 public override MatrixExpression this[Interval row, Interval col]
\r
81 return new MatrixExpression(this, row.int_floor(), col.int_floor(), row.int_ceil(), col.int_ceil());
\r
86 elements[row - 1, col - 1] = value;
\r
91 public override int rows { get { return elements.GetLength(0); } }
\r
92 public override int cols { get { return elements.GetLength(1); } }
\r
96 public class MatrixExpression : Matrix
\r
98 MatrixImplementation imp;
\r
99 readonly int brow, bcol;
\r
100 readonly int erow, ecol;
\r
102 internal MatrixExpression(MatrixImplementation target, int dbrow, int dbcol, int derow, int decol)
\r
111 public override double this[int row, int col]
\r
115 return imp.elements[(row - 1 - brow), (col - 1 - bcol)];
\r
119 imp.elements[(row - 1 - brow), (col - 1 - bcol)] = value;
\r
123 public override int rows { get { return erow - brow + 1; } }
\r
124 public override int cols { get { return ecol - bcol + 1; } }
\r