+\r
+ public abstract class Matrix\r
+ {\r
+ public abstract double this[int row, int col]\r
+ {\r
+ get;\r
+ set;\r
+ }\r
+\r
+ public static Matrix operator +(Matrix m, double d)\r
+ {\r
+ return new MatrixExpression;\r
+ }\r
+ }\r
+\r
+\r
+ namespace Internal\r
+ {\r
+\r
+ public class MatrixImplementation : Matrix\r
+ {\r
+ internal double[] elements;\r
+ readonly int nrow, ncol;\r
+\r
+ public MatrixImplementation(int dnrow, int dncol)\r
+ {\r
+ nrow = dnrow;\r
+ ncol = dncol;\r
+ elements = new double[nrow * ncol];\r
+ }\r
+\r
+ public override double this[int row, int col]\r
+ {\r
+ get\r
+ {\r
+ return elements[(row - 1) * ncol + (col - 1)];\r
+ }\r
+ set\r
+ {\r
+ elements[(row - 1) * ncol + (col - 1)] = value;\r
+ }\r
+ }\r
+ }\r
+\r
+ public class MatrixExpression : Matrix\r
+ {\r
+ MatrixImplementation imp;\r
+ readonly int nrow, ncol;\r
+ readonly int drow, dcol;\r
+ \r
+ public MatrixExpression(MatrixImplementation target, int ddrow, int ddcol, int dnrow, int dncol)\r
+ {\r
+ nrow = dnrow;\r
+ ncol = dncol;\r
+ drow = ddrow;\r
+ dcol = ddcol;\r
+ imp = target;\r
+ }\r
+\r
+ public override double this[int row, int col]\r
+ {\r
+ get\r
+ {\r
+ return imp.elements[(row - drow) * ncol + (col - dcol)];\r
+ }\r
+ set\r
+ {\r
+ imp.elements[(row - drow) * ncol + (col - dcol)] = value;\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r