Умножение матриц между собой и на число - 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();
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 3.923 из 5
Похожие ответы