Умножение матриц между собой и на число - C#
Формулировка задачи:
Добрый день. Появилась проблема с матрицами. По заданию нужно сделать класс вещ. квадратных матриц, и провести операции над ними: 1. Умножение матриц между собой так и на число
2. Возведение в степень.
3. методы вычисления Детерминант и нормы.
С 3 заданием полный стопор... Не знаю как описать класс. В программировании и в матрицах не очень силен. Прошу помочь с данным заданием (если нужно могу выложить решение остальных частей задачи). Спасибо за внимание
Решение задачи: «Умножение матриц между собой и на число»
textual
Листинг программы
using System; using System.Collections.Generic; using System.Text; using System.Linq; public class Matrix:ICloneable { private int _n, _m; private double[][] _data; private double[][] Data { get { return _data ?? (Data = new int[_n][].Select(c=>new double[_m]).ToArray()); } set { _data = value; } } public double this[int i, int j] { get { return Data[i][j]; } set { Data[i][j] = value; } } private Matrix(int n, int m) { _n = n; _m = m; } public static Matrix Create(int n, int m) { return new Matrix(n, m); } public Matrix Fill(int a, int b) { var rand = new Random(); for (var i = 0; i < _n; i++) for (var j = 0; j < _m; j++) this[i, j] = a+rand.NextDouble()*(b-a); return this; } public double DeterminantFact { get { double result = 0; if (_m == 0) result = 1; else for (var j = 0; j < _m; j++) { var k = j%2 == 0 ? 1 : -1; result += k*this[0,j]*Minor(0, j).DeterminantFact; } return result; } } public double Determinant { get { var triangle = Triangle; if (triangle == null) throw new Exception("n!=m"); if (_n == 0) return 0; var result = 1.0; for (var i = 0; i < _n; i++) { result *= triangle[i, i]; if (result.Equals(0)) return 0; } return result; } } public object Clone() { var result = (Matrix) MemberwiseClone(); result.Data = Data.Select(c => c.Clone() as double[]).ToArray(); return result; } public Matrix Triangle { get { var result = (Matrix)Clone(); if (_n != _m) return result; for (var j = 0; j < _m;j++ ) { for (var i = j + 1; i < _n; i++) { if (!result[j, j].Equals(0)) { var corr = result[i, j] / result[j, j]; result[i, j] = 0; for (var k = j + 1; k < _n; k++) result[i, k] -= corr * result[j, k]; } else if (!result[i, j].Equals(0)) { var t = result.Data[j]; result.Data[j] = result.Data[i].Select(it=>-it).ToArray(); result.Data[i] = t; } } } return result; } } public Dictionary<int[][], Matrix> Mdict = new Dictionary<int[][], Matrix>(); public Matrix Minor(int[] n, int[] m) { var result = (Matrix) Clone(); for (var i = 0; i < n.Length; i++) { result = result.Minor(n[i], m[i]); } return result; } public Matrix Minor(int n, int m) { if (n >= _n || m >= _m || n < 0 || m < 0) return null; var result = Create(_n - 1, _m - 1); var _i = 0; for (var i = 0; i < _n; i++) { if (i == n) continue; var _j = 0; for (var j = 0; j < _m; j++) { if (j == m) continue; result[_i, _j] = this[i, j]; _j++; } _i++; } return result; } public override String ToString() { var result = new StringBuilder(); for (var i = 0; i < _n; i++) { for (var j = 0; j < _m; j++) result.Append(String.Format("{0,7}", Math.Round(this[i, j],3))); result.AppendLine(); } return result.ToString(); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д