Описать класс, реализующий тип "Вещественная матрица" - C#
Формулировка задачи:
Здравствуйте! При написании программы у меня возникли такие проблемы:
1. Если ввести не квадратную матрицу, доступ к элементу по индексу выдает ошибку.
2. Как вызывать в основной программе метод доступа к элементу по индексу?
3. Как сделать метод ввода матриц с клавиатуры вместо рандома?
Зарание благодарю за помощь.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication49
{
class Program
{
public class Matrix
{
double[,] matrix;
int Row = 0, Col = 0;
//матрица N x M
public Matrix(int row, int col)
{
matrix = new double[row, col];
Row = row; Col = col;
}
/* //квадратная матрица
public Matrix(int N)
{
matrix = new double[N, N];
Row = Col = N;
}*/
//доступ к элементу по индексам
public double this[int i, int j]
{
get { return matrix[i, j]; }
set { matrix[i, j] = value; }
}
//произведение матриц
public static Matrix operator *(Matrix first, Matrix second)
{
Matrix matr = new Matrix(first.Row, first.Col);
if (first.Col != second.Row) throw new ArgumentException("Число столбцов матрицы А не равно числу строк матрицы В.");
for (int i = 0; i < first.Row; i++)
{
for (int j = 0; j < second.Col; j++)
{
double sum = 0;
for (int r = 0; r < first.Col; r++)
sum += first[i, r] * second[r, j];
matr[i, j] = sum;
}
}
return matr;
}
//умножение на число
public static Matrix operator *(Matrix m, int t)
{
Matrix mat = new Matrix(m.Row, m.Col);
for (int i = 0; i < m.Row; i++)
for (int j = 0; j < m.Col; j++)
mat[i, j] = m[i, j] * t;
return mat;
}
//деление на число
public static Matrix operator /(Matrix m, int t)
{
Matrix mat = new Matrix(m.Row, m.Col);
for (int i = 0; i < m.Row; i++)
for (int j = 0; j < m.Col; j++)
mat[i, j] = m[i, j] / t;
return mat;
}
//возведение в степень
public static Matrix operator ^(Matrix first, int pow)
{
Matrix matr = new Matrix(first.Row, first.Col);
matr = first;
for (int z = 1; z < pow; z++)
{
Matrix bufer = new Matrix(first.Row, first.Col);
for (int i = 0; i < first.Row; i++)
{
for (int j = 0; j < first.Row; j++)
{
double sum = 0;
for (int r = 0; r < first.Row; r++)
sum += matr[i, r] * first[r, j];
bufer[i, j] = sum;
}
}
matr = bufer;
}
return matr;
}
//детерминант
public double Determinant()
{
if (Col!= Row) throw new ArgumentException("Вычисление определителя возможно только для квадратных матриц.");
Matrix matr = new Matrix(Row,Col);
matr.matrix = (double[,])this.matrix.Clone();
double det = 1;
int order = Row;
for (int i = 0; i < order - 1; i++)
{
double[] masterRow = matr.GetRow(i);
det *= masterRow[i];
if (det == 0) return 0;
for (int t = i + 1; t < order; t++)
{
double[] slaveRow = matr.GetRow(t);
double[] tmp = MulArrayConst(masterRow, slaveRow[i] / masterRow[i]);
double[] source = matr.GetRow(t);
matr.SetRow(SubArray(source, tmp), t);
}
}
det *= matr[order - 1, order - 1];
return det;
}
// возвращает массив соответствующий указанной строке матрицы
public double[] GetRow(int row)
{
if (row >= Row) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
double[] ret = new double[Col];
for (int i = 0; i < Col; i++)
ret[i] = matrix[row, i];
return ret;
}
// заполняет указанную строку матрицы значениями из массива
public void SetRow(double[] values, int row)
{
if (row >= Row) throw new IndexOutOfRangeException("Индекс строки не принадлежит массиву.");
for (int i = 0; i < (Col > values.Length ? values.Length : Col); i++)
matrix[row, i] = values[i];
}
double[] SubArray(double[] A,double[] B)
{
double[] ret = (double[])A.Clone();
for (int i = 0; i < (A.Length > B.Length ? A.Length : B.Length); i++)
ret[i] -= B[i];
return ret;
}
double[] MulArrayConst(double[] array, double number)
{
double[] ret = (double[])array.Clone();
for (int i = 0; i < ret.Length; i++)
ret[i] *= number;
return ret;
}
//вывод матрицы
public void PrintMatrix()
{
for (int i = 0; i < this.Row; i++)
{
for (int j = 0; j < this.Col; j++)
Console.Write("{0} ", this[i, j]);
Console.Write("\n");
}
}
}
static void Main(string[] args)
{
Console.WriteLine("Введите размерность первой матрицы:\n");
int N = Convert.ToInt32(Console.ReadLine());
int M = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите размерность второй матрицы:\n");
int K = Convert.ToInt32(Console.ReadLine());
int L = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("Введите степень:\n");
int pow = Convert.ToInt32(Console.ReadLine());
Random rand = new Random();
Matrix first = new Matrix(N,M);
Matrix second = new Matrix(K,L);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
{
first[i, j] = rand.Next(1, 5);
second[i, j] = rand.Next(1, 5);
}
Console.WriteLine("Первая матрица:\n\n");
first.PrintMatrix();
Console.WriteLine("\n\nВторая матрица:\n\n");
second.PrintMatrix();
Console.WriteLine("\n\nУмножение на число:\n\n");
(first * 3).PrintMatrix();
Console.WriteLine("\n\nДеление на число:\n\n");
(first / 3).PrintMatrix();
Console.WriteLine("\n\nПроизведение матриц:\n\n");
(first * second).PrintMatrix();
Console.WriteLine("\n\n{0} степень матрицы:\n\n", pow);
(first ^ pow).PrintMatrix();
Console.WriteLine("\n\nДетерминант матрицы:\n\n");
Console.WriteLine(first.Determinant());
Console.ReadKey();
}
}
}Решение задачи: «Описать класс, реализующий тип "Вещественная матрица"»
textual
Листинг программы
for (int i = 0; i < K; i++)
for (int j = 0; j < L; j++)
{
second[i, j] = rand.Next(1, 5);
}