OSDN Git Service

12
[psychlops/silverlight.git] / dev5 / psychlops / core / math / matrix.cs
1 using System;\r
2 \r
3 namespace Psychlops\r
4 {\r
5 \r
6 \r
7         public abstract class Matrix\r
8         {\r
9                 public static Matrix gen(int row, int col)\r
10                 {\r
11                         return new Internal.MatrixImplementation(row, col);\r
12                 }\r
13 \r
14                 public abstract double this[int row, int col]\r
15                 {\r
16                         get;\r
17                         set;\r
18                 }\r
19 \r
20                 /*\r
21                 public abstract Internal.MatrixExpression this[Interval row, Interval col]\r
22                 {\r
23                         get;\r
24                         set;\r
25                 }\r
26 \r
27 \r
28                 /*\r
29                 public static Matrix operator +(Matrix m, double d)\r
30                 {\r
31                         return new Internal.MatrixExpression();\r
32                 }\r
33                 */\r
34                 public void each(Func<double, double> f)\r
35                 {\r
36                         for (int i = 1; i <= getRows(); i++)\r
37                         {\r
38                                 for (int j = 1; j <= getCols(); j++)\r
39                                 {\r
40                                         this[i, j] = f(this[i, j]);\r
41                                 }\r
42                         }\r
43                 }\r
44 \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
49 \r
50         }\r
51 \r
52 \r
53         namespace Internal\r
54         {\r
55 \r
56                 public class MatrixImplementation : Matrix\r
57                 {\r
58                         internal double[,] elements;\r
59 \r
60                         public MatrixImplementation(int dnrow, int dncol)\r
61                         {\r
62                                 elements = new double[dnrow, dncol];\r
63                         }\r
64 \r
65                         public override double this[int row, int col]\r
66                         {\r
67                                 get\r
68                                 {\r
69                                         return elements[row - 1, col - 1];\r
70                                 }\r
71                                 set\r
72                                 {\r
73                                         elements[row - 1, col - 1] = value;\r
74                                 }\r
75                         }\r
76                         /*\r
77                         public override MatrixExpression this[Interval row, Interval col]\r
78                         {\r
79                                 get\r
80                                 {\r
81                                         return new MatrixExpression(this, row.int_floor(), col.int_floor(), row.int_ceil(), col.int_ceil());\r
82                                 }\r
83                                 set\r
84                                 {\r
85                                         for(int r = 0, r<)\r
86                                         elements[row - 1, col - 1] = value;\r
87                                 }\r
88                         }\r
89                          * */\r
90 \r
91                         public override int rows { get { return elements.GetLength(0); } }\r
92                         public override int cols { get { return elements.GetLength(1); } }\r
93 \r
94                 }\r
95 \r
96                 public class MatrixExpression : Matrix\r
97                 {\r
98                         MatrixImplementation imp;\r
99                         readonly int brow, bcol;\r
100                         readonly int erow, ecol;\r
101 \r
102                         internal MatrixExpression(MatrixImplementation target, int dbrow, int dbcol, int derow, int decol)\r
103                         {\r
104                                 brow = dbrow;\r
105                                 bcol = dbcol;\r
106                                 erow = derow;\r
107                                 ecol = decol;\r
108                                 imp = target;\r
109                         }\r
110 \r
111                         public override double this[int row, int col]\r
112                         {\r
113                                 get\r
114                                 {\r
115                                         return imp.elements[(row - 1 - brow), (col - 1 - bcol)];\r
116                                 }\r
117                                 set\r
118                                 {\r
119                                         imp.elements[(row - 1 - brow), (col - 1 - bcol)] = value;\r
120                                 }\r
121                         }\r
122 \r
123                         public override int rows { get { return erow - brow + 1; } }\r
124                         public override int cols { get { return ecol - bcol + 1; } }\r
125                 }\r
126         }\r
127 \r
128 }