矩阵基本操作的实现(C# 源代码)
第一次搬进自己的blog,打算放点东东到里面。在工程软件开发过程中,会碰到很多有关矩阵的运算。这是一年前的源代码
  1
using System;
2
using System.IO;
3
using System.Diagnostics;
4
5
6
namespace Adjust
7
{
8
    /// <summary>
9
    /// Matrix 的摘要说明。
10
    /// 实现矩阵的基本运算
11
    /// </summary>
12
    public class Matrix
13
    {
14
    
15
        //构造方阵
16
        public  Matrix(int row)
17
        {
18
            m_data = new double[row,row];
19
20
        }
21
        public Matrix(int row,int col)
22
        {
23
            m_data = new double[row,col];
24
        }
25
        //复制构造函数
26
        public Matrix(Matrix m)
27
        {
28
            int row = m.Row;
29
            int col = m.Col;
30
            m_data = new double[row,col];
31
32
            for(int i=0;i<row;i++)
33
                for(int j=0;j<col;j++)
34
                    m_data[i,j] = m[i,j];
35
36
        }
37
38
        /*
39
        //分配方阵的大小
40
        //对于已含有内存的矩阵,将清空数据
41
        public void SetSize(int row)
42
        {
43
            m_data = new double[row,row];
44
        }
45
46
        
47
        //分配矩阵的大小
48
        //对于已含有内存的矩阵,将清空数据
49
        public void SetSize(int row,int col)
50
        {
51
            m_data = new double[row,col];
52
        }
53
        */
54
55
        //unit matrix:设为单位阵
56
        public void SetUnit()
57
        {
58
            for(int i=0;i<m_data.GetLength(0);i++)
59
                for(int j=0;j<m_data.GetLength(1);j++)
60
                    m_data[i,j] = ((i==j)?1:0);
61
        }
62
63
        //设置元素值
64
        public void SetValue(double d)
65
        {
66
            for(int i=0;i<m_data.GetLength(0);i++)
67
                for(int j=0;j<m_data.GetLength(1);j++)
68
                    m_data[i,j] = d;
69
        }
70
71
        // Value extraction:返中行数
72
        public int Row
73
        {
74
            get
75
            {
76
77
                return m_data.GetLength(0);
78
            }
79
        }
80
81
        //返回列数
82
        public int Col
83
        {
84
            get
85
            {
86
                return m_data.GetLength(1);
87
            }
88
        }
89
90
        //重载索引
91
        //存取数据成员
92
        public double this[int row,int col]
93
        {
94
            get
95
            {
96
                return m_data[row,col];
97
            }
98
            set
99
            {
100
                m_data[row,col] = value;
101
            }
102
        }
103
104
        //primary change
105
        // 初等变换 对调两行:ri<-->rj
106
        public Matrix  Exchange(int i,int j)
107
        {
108
            double temp;
109
110
            for(int k=0;k<Col;k++)
111
            {
112
                temp = m_data[i,k];
113
                m_data[i,k] = m_data[j,k];
114
                m_data[j,k] = temp;
115
            }
116
            return this;
117
        }
118
119
120
        //初等变换 第index 行乘以mul
121
        Matrix Multiple(int index,double mul)    
122
        {
123
            for(int j=0;j<Col;j++)
124
            {
125
                m_data[index,j] *= mul;
126
            }
127
            return this;
128
        }
129
                
130
131
        //初等变换 第src行乘以mul加到第index行
132
        Matrix MultipleAdd(int index,int src,double mul)
133
        {
134
            for(int j=0;j<Col;j++)
135
            {
136
                m_data[index,j] += m_data[src,j]*mul;
137
            }
138
139
            return this;
140
        }
141
142
        //transpose 转置
143
        public Matrix Transpose()
144
        {
145
            Matrix ret = new Matrix(Col,Row);
146
147
            for(int i=0;i<Row;i++)
148
                for(int j=0;j<Col;j++)
149
                {
150
                    ret[j,i] = m_data[i,j];
151
                }
152
            return ret;
153
        }
154
        
155
        //binary addition 矩阵加
156
        public static Matrix operator+ (Matrix lhs,Matrix rhs)
157
        {
158
            if(lhs.Row != rhs.Row)    //异常
159
            {
160
                System.Exception e = new Exception("相加的两个矩阵的行数不等");
161
                throw e;
162
            }
163
            if(lhs.Col != rhs.Col)     //异常
164
            {
165
                System.Exception e = new Exception("相加的两个矩阵的列数不等");
166
                throw e;
167
            }
168
169
            int row = lhs.Row;
170
            int col = lhs.Col;
171
            Matrix ret=new Matrix(row,col);
172
173
            for(int i=0;i<row;i++)
174
                for(int j=0;j<col;j++)
175
                {
176
                    double d = lhs[i,j] + rhs[i,j];
177
                    ret[i,j] = d;
178
                }
179
            return ret;
180
181
        }
182
183
        //binary subtraction 矩阵减
184
        public static Matrix operator- (Matrix lhs,Matrix rhs)
185
        {
186
            if(lhs.Row != rhs.Row)    //异常
187
            {
188
                System.Exception e = new Exception("相减的两个矩阵的行数不等");
189
                throw e;
190
            }
191
            if(lhs.Col != rhs.Col)     //异常
192
            {
193
                System.Exception e = new Exception("相减的两个矩阵的列数不等");
194
                throw e;
195
            }
196
197
            int row = lhs.Row;
198
            int col = lhs.Col;
199
            Matrix ret=new Matrix(row,col);
200
201
            for(int i=0;i<row;i++)
202
                for(int j=0;j<col;j++)
203
                {
204
                    double d = lhs[i,j] - rhs[i,j];
205
                    ret[i,j] = d;
206
                }
207
            return ret;
208
        }
209
210
211
        //binary multiple 矩阵乘
212
        public static Matrix operator* (Matrix lhs,Matrix rhs)
213
        {
214
            if(lhs.Col != rhs.Row)    //异常
215
            {
216
                System.Exception e = new Exception("相乘的两个矩阵的行列数不匹配");
217
                throw e;
218
            }
219
220
            Matrix ret = new Matrix (lhs.Row,rhs.Col);
221
            double temp;
222
            for(int i=0;i<lhs.Row;i++)
223
            {
224
                for(int j=0;j<rhs.Col;j++)
225
                {
226
                    temp = 0;
227
                    for(int k=0;k<lhs.Col;k++)
228
                    {
229
                        temp += lhs[i,k] * rhs[k,j];
230
                    }
231
                    ret[i,j] = temp;
232
                }
233
            }
234
235
            return ret;
236
        }
237
238
239
        //binary division 矩阵除
240
        public static Matrix operator/ (Matrix lhs,Matrix rhs)
241
        {
242
            return lhs * rhs.Inverse();
243
        }
244
245
        //unary addition单目加
246
        public static Matrix operator+ (Matrix m)
247
        {
248
            Matrix ret = new Matrix(m);
249
            return ret;
250
        }
251
252
        //unary subtraction 单目减
253
        public static Matrix operator- (Matrix m)
254
        {
255
            Matrix ret = new Matrix(m);
256
            for(int i=0;i<ret.Row;i++)
257
                for(int j= 0;j<ret.Col;j++)
258
                {
259
                    ret[i,j] = -ret[i,j];
260
                }
261
262
            return ret;
263
        }
264
265
        //number multiple 数乘
266
        public static Matrix operator* (double d,Matrix m)
267
        {
268
            Matrix ret = new Matrix(m);
269
            for(int i=0;i<ret.Row;i++)
270
                for(int j=0;j<ret.Col;j++)
271
                    ret[i,j] *= d;
272
273
            return ret;
274
        }
275
276
        //number division 数除
277
        public static Matrix operator/ (double d,Matrix m)
278
        {
279
            return d*m.Inverse();
280
        }
281
282
        //功能:返回列主元素的行号
283
        //参数:row为开始查找的行号
284
        //说明:在行号[row,Col)范围内查找第row列中绝对值最大的元素,返回所在行号
285
        int Pivot(int row)
286
        {
287
            int index=row;
288
289
            for(int i=row+1;i<Row;i++)
290
            {
291
                if(m_data[i,row] > m_data[index,row])
292
                    index=i;
293
            }
294
295
            return index;
296
        }
297
298
        //inversion 逆阵:使用矩阵的初等变换,列主元素消去法
299
        public Matrix Inverse()
300
        {
301
            if(Row != Col)    //异常,非方阵
302
            {
303
                System.Exception e = new Exception("求逆的矩阵不是方阵");
304
                throw e;
305
            }
306
StreamWriter sw = new StreamWriter("..\\annex\\close_matrix.txt");
307
            Matrix tmp = new Matrix(this);
308
            Matrix ret =new Matrix(Row);    //单位阵
309
            ret.SetUnit();
310
311
            int maxIndex;
312
            double dMul;
313
314
            for(int i=0;i<Row;i++)
315
            {
316
                maxIndex = tmp.Pivot(i);
317
    
318
                if(tmp.m_data[maxIndex,i]==0)
319
                {
320
                    System.Exception e = new Exception("求逆的矩阵的行列式的值等于0,");
321
                    throw e;
322
                }
323
324
                if(maxIndex != i)    //下三角阵中此列的最大值不在当前行,交换
325
                {
326
                    tmp.Exchange(i,maxIndex);
327
                    ret.Exchange(i,maxIndex);
328
329
                }
330
331
                ret.Multiple(i,1/tmp[i,i]);
332
333
                tmp.Multiple(i,1/tmp[i,i]);
334
335
                for(int j=i+1;j<Row;j++)
336
                {
337
                    dMul = -tmp[j,i]/tmp[i,i];
338
                    tmp.MultipleAdd(j,i,dMul);
339
                    ret.MultipleAdd(j,i,dMul);
340
    
341
                }
342
sw.WriteLine("tmp=\r\n"+tmp);
343
sw.WriteLine("ret=\r\n"+ret);
344
            }//end for
345
346
347
sw.WriteLine("**=\r\n"+ this*ret);
348
349
            for(int i=Row-1;i>0;i--)
350
            {
351
                for(int j=i-1;j>=0;j--)
352
                {
353
                    dMul = -tmp[j,i]/tmp[i,i];
354
                    tmp.MultipleAdd(j,i,dMul);
355
                    ret.MultipleAdd(j,i,dMul);
356
                }
357
            }//end for
358
359
360
sw.WriteLine("tmp=\r\n"+tmp);
361
sw.WriteLine("ret=\r\n"+ret);
362
sw.WriteLine("***=\r\n"+ this*ret);
363
sw.Close();
364
        
365
            return ret;
366
367
        }//end Inverse
368
369
        #region
370
/*
371
        //inversion 逆阵:使用矩阵的初等变换,列主元素消去法
372
        public Matrix Inverse()
373
        {
374
            if(Row != Col)    //异常,非方阵
375
            {
376
                System.Exception e = new Exception("求逆的矩阵不是方阵");
377
                throw e;
378
            }
379
            ///////////////
380
            StreamWriter sw = new StreamWriter("..\\annex\\matrix_mul.txt");
381
            ////////////////////
382
            ///    
383
            Matrix tmp = new Matrix(this);
384
            Matrix ret =new Matrix(Row);    //单位阵
385
            ret.SetUnit();
386
387
            int maxIndex;
388
            double dMul;
389
390
            for(int i=0;i<Row;i++)
391
            {
392
393
                maxIndex = tmp.Pivot(i);
394
    
395
                if(tmp.m_data[maxIndex,i]==0)
396
                {
397
                    System.Exception e = new Exception("求逆的矩阵的行列式的值等于0,");
398
                    throw e;
399
                }
400
401
                if(maxIndex != i)    //下三角阵中此列的最大值不在当前行,交换
402
                {
403
                    tmp.Exchange(i,maxIndex);
404
                    ret.Exchange(i,maxIndex);
405
406
                }
407
408
                ret.Multiple(i,1/tmp[i,i]);
409
410
                /////////////////////////
411
                //sw.WriteLine("nul \t"+tmp[i,i]+"\t"+ret[i,i]);
412
                ////////////////
413
                tmp.Multiple(i,1/tmp[i,i]);
414
                //sw.WriteLine("mmm \t"+tmp[i,i]+"\t"+ret[i,i]);
415
                sw.WriteLine("111111111 tmp=\r\n"+tmp);
416
                for(int j=i+1;j<Row;j++)
417
                {
418
                    dMul = -tmp[j,i];
419
                    tmp.MultipleAdd(j,i,dMul);
420
                    ret.MultipleAdd(j,i,dMul);
421
    
422
                }
423
                sw.WriteLine("222222222222=\r\n"+tmp);
424
425
            }//end for
426
427
428
429
            for(int i=Row-1;i>0;i--)
430
            {
431
                for(int j=i-1;j>=0;j--)
432
                {
433
                    dMul = -tmp[j,i];
434
                    tmp.MultipleAdd(j,i,dMul);
435
                    ret.MultipleAdd(j,i,dMul);
436
                }
437
            }//end for
438
        
439
            //////////////////////////
440
441
442
            sw.WriteLine("tmp = \r\n" + tmp.ToString());
443
444
            sw.Close();
445
            ///////////////////////////////////////
446
            ///
447
            return ret;
448
449
        }//end Inverse
450
451
*/
452
453
        #endregion
454
455
        //determine if the matrix is square:方阵
456
        public bool IsSquare()
457
        {
458
            return Row==Col;
459
        }
460
461
        //determine if the matrix is symmetric对称阵
462
        public bool IsSymmetric()
463
        {
464
465
            if(Row != Col) 
466
                return false;
467
                             
468
            for(int i=0;i<Row;i++)
469
                for(int j=i+1;j<Col;j++)
470
                    if( m_data[i,j] != m_data[j,i])
471
                        return false;
472
473
            return true;
474
        }
475
476
        //一阶矩阵->实数
477
        public double ToDouble()
478
        {
479
            Trace.Assert(Row==1 && Col==1);
480
481
            return m_data[0,0];
482
        }
483
484
        //conert to string
485
        public override string ToString()
486
        {
487
        
488
            string s="";
489
            for(int i=0;i<Row;i++)
490
            {
491
                for(int j=0;j<Col;j++)
492
                    s += string.Format("{0} ",m_data[i,j]);
493
494
                s += "\r\n";
495
            }
496
            return s;
497
498
        }
499
500
501
        //私有数据成员
502
        private double[,] m_data;
503
        
504
    }//end class Matrix
505
}
using System;2
using System.IO;3
using System.Diagnostics;4

5

6
namespace Adjust7
{8
    /// <summary>9
    /// Matrix 的摘要说明。10
    /// 实现矩阵的基本运算11
    /// </summary>12
    public class Matrix13
    {14
    15
        //构造方阵16
        public  Matrix(int row)17
        {18
            m_data = new double[row,row];19

20
        }21
        public Matrix(int row,int col)22
        {23
            m_data = new double[row,col];24
        }25
        //复制构造函数26
        public Matrix(Matrix m)27
        {28
            int row = m.Row;29
            int col = m.Col;30
            m_data = new double[row,col];31

32
            for(int i=0;i<row;i++)33
                for(int j=0;j<col;j++)34
                    m_data[i,j] = m[i,j];35

36
        }37

38
        /*39
        //分配方阵的大小40
        //对于已含有内存的矩阵,将清空数据41
        public void SetSize(int row)42
        {43
            m_data = new double[row,row];44
        }45

46
        47
        //分配矩阵的大小48
        //对于已含有内存的矩阵,将清空数据49
        public void SetSize(int row,int col)50
        {51
            m_data = new double[row,col];52
        }53
        */54

55
        //unit matrix:设为单位阵56
        public void SetUnit()57
        {58
            for(int i=0;i<m_data.GetLength(0);i++)59
                for(int j=0;j<m_data.GetLength(1);j++)60
                    m_data[i,j] = ((i==j)?1:0);61
        }62

63
        //设置元素值64
        public void SetValue(double d)65
        {66
            for(int i=0;i<m_data.GetLength(0);i++)67
                for(int j=0;j<m_data.GetLength(1);j++)68
                    m_data[i,j] = d;69
        }70

71
        // Value extraction:返中行数72
        public int Row73
        {74
            get75
            {76

77
                return m_data.GetLength(0);78
            }79
        }80

81
        //返回列数82
        public int Col83
        {84
            get85
            {86
                return m_data.GetLength(1);87
            }88
        }89

90
        //重载索引91
        //存取数据成员92
        public double this[int row,int col]93
        {94
            get95
            {96
                return m_data[row,col];97
            }98
            set99
            {100
                m_data[row,col] = value;101
            }102
        }103

104
        //primary change105
        // 初等变换 对调两行:ri<-->rj106
        public Matrix  Exchange(int i,int j)107
        {108
            double temp;109

110
            for(int k=0;k<Col;k++)111
            {112
                temp = m_data[i,k];113
                m_data[i,k] = m_data[j,k];114
                m_data[j,k] = temp;115
            }116
            return this;117
        }118

119

120
        //初等变换 第index 行乘以mul121
        Matrix Multiple(int index,double mul)    122
        {123
            for(int j=0;j<Col;j++)124
            {125
                m_data[index,j] *= mul;126
            }127
            return this;128
        }129
                130

131
        //初等变换 第src行乘以mul加到第index行132
        Matrix MultipleAdd(int index,int src,double mul)133
        {134
            for(int j=0;j<Col;j++)135
            {136
                m_data[index,j] += m_data[src,j]*mul;137
            }138

139
            return this;140
        }141

142
        //transpose 转置143
        public Matrix Transpose()144
        {145
            Matrix ret = new Matrix(Col,Row);146

147
            for(int i=0;i<Row;i++)148
                for(int j=0;j<Col;j++)149
                {150
                    ret[j,i] = m_data[i,j];151
                }152
            return ret;153
        }154
        155
        //binary addition 矩阵加156
        public static Matrix operator+ (Matrix lhs,Matrix rhs)157
        {158
            if(lhs.Row != rhs.Row)    //异常159
            {160
                System.Exception e = new Exception("相加的两个矩阵的行数不等");161
                throw e;162
            }163
            if(lhs.Col != rhs.Col)     //异常164
            {165
                System.Exception e = new Exception("相加的两个矩阵的列数不等");166
                throw e;167
            }168

169
            int row = lhs.Row;170
            int col = lhs.Col;171
            Matrix ret=new Matrix(row,col);172

173
            for(int i=0;i<row;i++)174
                for(int j=0;j<col;j++)175
                {176
                    double d = lhs[i,j] + rhs[i,j];177
                    ret[i,j] = d;178
                }179
            return ret;180

181
        }182

183
        //binary subtraction 矩阵减184
        public static Matrix operator- (Matrix lhs,Matrix rhs)185
        {186
            if(lhs.Row != rhs.Row)    //异常187
            {188
                System.Exception e = new Exception("相减的两个矩阵的行数不等");189
                throw e;190
            }191
            if(lhs.Col != rhs.Col)     //异常192
            {193
                System.Exception e = new Exception("相减的两个矩阵的列数不等");194
                throw e;195
            }196

197
            int row = lhs.Row;198
            int col = lhs.Col;199
            Matrix ret=new Matrix(row,col);200

201
            for(int i=0;i<row;i++)202
                for(int j=0;j<col;j++)203
                {204
                    double d = lhs[i,j] - rhs[i,j];205
                    ret[i,j] = d;206
                }207
            return ret;208
        }209

210

211
        //binary multiple 矩阵乘212
        public static Matrix operator* (Matrix lhs,Matrix rhs)213
        {214
            if(lhs.Col != rhs.Row)    //异常215
            {216
                System.Exception e = new Exception("相乘的两个矩阵的行列数不匹配");217
                throw e;218
            }219

220
            Matrix ret = new Matrix (lhs.Row,rhs.Col);221
            double temp;222
            for(int i=0;i<lhs.Row;i++)223
            {224
                for(int j=0;j<rhs.Col;j++)225
                {226
                    temp = 0;227
                    for(int k=0;k<lhs.Col;k++)228
                    {229
                        temp += lhs[i,k] * rhs[k,j];230
                    }231
                    ret[i,j] = temp;232
                }233
            }234

235
            return ret;236
        }237

238

239
        //binary division 矩阵除240
        public static Matrix operator/ (Matrix lhs,Matrix rhs)241
        {242
            return lhs * rhs.Inverse();243
        }244

245
        //unary addition单目加246
        public static Matrix operator+ (Matrix m)247
        {248
            Matrix ret = new Matrix(m);249
            return ret;250
        }251

252
        //unary subtraction 单目减253
        public static Matrix operator- (Matrix m)254
        {255
            Matrix ret = new Matrix(m);256
            for(int i=0;i<ret.Row;i++)257
                for(int j= 0;j<ret.Col;j++)258
                {259
                    ret[i,j] = -ret[i,j];260
                }261

262
            return ret;263
        }264

265
        //number multiple 数乘266
        public static Matrix operator* (double d,Matrix m)267
        {268
            Matrix ret = new Matrix(m);269
            for(int i=0;i<ret.Row;i++)270
                for(int j=0;j<ret.Col;j++)271
                    ret[i,j] *= d;272

273
            return ret;274
        }275

276
        //number division 数除277
        public static Matrix operator/ (double d,Matrix m)278
        {279
            return d*m.Inverse();280
        }281

282
        //功能:返回列主元素的行号283
        //参数:row为开始查找的行号284
        //说明:在行号[row,Col)范围内查找第row列中绝对值最大的元素,返回所在行号285
        int Pivot(int row)286
        {287
            int index=row;288

289
            for(int i=row+1;i<Row;i++)290
            {291
                if(m_data[i,row] > m_data[index,row])292
                    index=i;293
            }294

295
            return index;296
        }297

298
        //inversion 逆阵:使用矩阵的初等变换,列主元素消去法299
        public Matrix Inverse()300
        {301
            if(Row != Col)    //异常,非方阵302
            {303
                System.Exception e = new Exception("求逆的矩阵不是方阵");304
                throw e;305
            }306
StreamWriter sw = new StreamWriter("..\\annex\\close_matrix.txt");307
            Matrix tmp = new Matrix(this);308
            Matrix ret =new Matrix(Row);    //单位阵309
            ret.SetUnit();310

311
            int maxIndex;312
            double dMul;313

314
            for(int i=0;i<Row;i++)315
            {316
                maxIndex = tmp.Pivot(i);317
    318
                if(tmp.m_data[maxIndex,i]==0)319
                {320
                    System.Exception e = new Exception("求逆的矩阵的行列式的值等于0,");321
                    throw e;322
                }323

324
                if(maxIndex != i)    //下三角阵中此列的最大值不在当前行,交换325
                {326
                    tmp.Exchange(i,maxIndex);327
                    ret.Exchange(i,maxIndex);328

329
                }330

331
                ret.Multiple(i,1/tmp[i,i]);332

333
                tmp.Multiple(i,1/tmp[i,i]);334

335
                for(int j=i+1;j<Row;j++)336
                {337
                    dMul = -tmp[j,i]/tmp[i,i];338
                    tmp.MultipleAdd(j,i,dMul);339
                    ret.MultipleAdd(j,i,dMul);340
    341
                }342
sw.WriteLine("tmp=\r\n"+tmp);343
sw.WriteLine("ret=\r\n"+ret);344
            }//end for345

346

347
sw.WriteLine("**=\r\n"+ this*ret);348

349
            for(int i=Row-1;i>0;i--)350
            {351
                for(int j=i-1;j>=0;j--)352
                {353
                    dMul = -tmp[j,i]/tmp[i,i];354
                    tmp.MultipleAdd(j,i,dMul);355
                    ret.MultipleAdd(j,i,dMul);356
                }357
            }//end for358

359

360
sw.WriteLine("tmp=\r\n"+tmp);361
sw.WriteLine("ret=\r\n"+ret);362
sw.WriteLine("***=\r\n"+ this*ret);363
sw.Close();364
        365
            return ret;366

367
        }//end Inverse368

369
        #region370
/*371
        //inversion 逆阵:使用矩阵的初等变换,列主元素消去法372
        public Matrix Inverse()373
        {374
            if(Row != Col)    //异常,非方阵375
            {376
                System.Exception e = new Exception("求逆的矩阵不是方阵");377
                throw e;378
            }379
            ///////////////380
            StreamWriter sw = new StreamWriter("..\\annex\\matrix_mul.txt");381
            ////////////////////382
            ///    383
            Matrix tmp = new Matrix(this);384
            Matrix ret =new Matrix(Row);    //单位阵385
            ret.SetUnit();386

387
            int maxIndex;388
            double dMul;389

390
            for(int i=0;i<Row;i++)391
            {392

393
                maxIndex = tmp.Pivot(i);394
    395
                if(tmp.m_data[maxIndex,i]==0)396
                {397
                    System.Exception e = new Exception("求逆的矩阵的行列式的值等于0,");398
                    throw e;399
                }400

401
                if(maxIndex != i)    //下三角阵中此列的最大值不在当前行,交换402
                {403
                    tmp.Exchange(i,maxIndex);404
                    ret.Exchange(i,maxIndex);405

406
                }407

408
                ret.Multiple(i,1/tmp[i,i]);409

410
                /////////////////////////411
                //sw.WriteLine("nul \t"+tmp[i,i]+"\t"+ret[i,i]);412
                ////////////////413
                tmp.Multiple(i,1/tmp[i,i]);414
                //sw.WriteLine("mmm \t"+tmp[i,i]+"\t"+ret[i,i]);415
                sw.WriteLine("111111111 tmp=\r\n"+tmp);416
                for(int j=i+1;j<Row;j++)417
                {418
                    dMul = -tmp[j,i];419
                    tmp.MultipleAdd(j,i,dMul);420
                    ret.MultipleAdd(j,i,dMul);421
    422
                }423
                sw.WriteLine("222222222222=\r\n"+tmp);424

425
            }//end for426

427

428

429
            for(int i=Row-1;i>0;i--)430
            {431
                for(int j=i-1;j>=0;j--)432
                {433
                    dMul = -tmp[j,i];434
                    tmp.MultipleAdd(j,i,dMul);435
                    ret.MultipleAdd(j,i,dMul);436
                }437
            }//end for438
        439
            //////////////////////////440

441

442
            sw.WriteLine("tmp = \r\n" + tmp.ToString());443

444
            sw.Close();445
            ///////////////////////////////////////446
            ///447
            return ret;448

449
        }//end Inverse450

451
*/452

453
        #endregion454

455
        //determine if the matrix is square:方阵456
        public bool IsSquare()457
        {458
            return Row==Col;459
        }460

461
        //determine if the matrix is symmetric对称阵462
        public bool IsSymmetric()463
        {464

465
            if(Row != Col) 466
                return false;467
                             468
            for(int i=0;i<Row;i++)469
                for(int j=i+1;j<Col;j++)470
                    if( m_data[i,j] != m_data[j,i])471
                        return false;472

473
            return true;474
        }475

476
        //一阶矩阵->实数477
        public double ToDouble()478
        {479
            Trace.Assert(Row==1 && Col==1);480

481
            return m_data[0,0];482
        }483

484
        //conert to string485
        public override string ToString()486
        {487
        488
            string s="";489
            for(int i=0;i<Row;i++)490
            {491
                for(int j=0;j<Col;j++)492
                    s += string.Format("{0} ",m_data[i,j]);493

494
                s += "\r\n";495
            }496
            return s;497

498
        }499

500

501
        //私有数据成员502
        private double[,] m_data;503
        504
    }//end class Matrix505
}例子:
//Square n*n Matrix 
Matrix m1 = new Matrix(n);
//m*n Matrix
Matrix m2 = new Matrix(m,n):
//Matrix Add Operattion
Mtrix result = m_1 + m_2;
//Display Matrix Method 1
for(int i=0;i<m.Row;i++)
  {
    for(int j=0;j<m.Col;j++)
      Console.WriteLine(m[i,j]);
    Console.Writeline();
   }
//Display Matrix Method 2
Console.WriteLine(m.ToString()); 
                    
                

    
                
            
        
浙公网安备 33010602011771号