Как я могу инициализировать свой матричный объект, как я бы сделал с многомерным массивом в C #?

#c# #arrays #matrix #multidimensional-array #neural-network

#c# #массивы #матрица #многомерный массив #нейронная сеть

Вопрос:

Мне пришлось создать класс Matrix, чтобы я мог использовать его в своем проекте нейронной сети. Как я мог бы добиться, чтобы при создании матричного объекта он работал так же, как с многомерным массивом?

Итак, в основном у меня есть матричный класс, который выглядит следующим образом:

 class Matrix
{
    private int rows;
    private int size;
    private int columns;
    private double[,] _inMatrix;
    public double this[int row, int col]
    {
        get
        {
            return _inMatrix[row, col];
        }
        set
        {
            _inMatrix[row, col] = value;
        }

    }
    public Matrix(int row, int col)
    {
        rows = row;
        columns = col;
        size = row * col;
        _inMatrix = new double[rows, columns];
    }
    public Matrix()
    {

    }
    //and bunch of operations
  

Это работает как шарм, когда я знаю строки и столбцы матрицы, но я хотел бы иметь возможность устанавливать значения в начале или позже.
Когда я создаю матричный объект, я делаю это таким образом:

 Matrix m1=new Matrix(row, column)
  

Что я хочу сделать, так это иметь возможность устанавливать значения в начале, как я бы делал с массивами.
Я знаю, что в C # именно так мы инициализируем многомерный массив:

 double[,] 2Darray = new double[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
//or
int[,] 2Darray;
2Darray = new int[,] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
  

Как я мог бы добиться чего-то подобного?

Комментарии:

1. Попробуйте изменить _inMatrix = new double[rows, columns]; на _inMatrix = new double[,] { };

2. Вы могли бы легко передать массив в свой конструктор и таким образом создать свой матричный объект.

3. Прочитайте learn.microsoft.com/en-us/dotnet/csharp/programming-guide /…

Ответ №1:

Может быть, что-то вроде этого, чтобы иметь implicit operator возможность делать Matrix m = new double[,] { {1,1}, {2,3}}; . Также вам не нужно _rows и _columns , поскольку вы могли бы легко извлечь это из лежащего в основе многомерного массива ( GetLength(int dimention) ).

 class Matrix
{
    private double[,] _inMatrix;

    public double this[int row, int col]
    {
        get => _inMatrix[row, col];
        set => _inMatrix[row, col] = value;
    }

    public Matrix(double[,] a) => Initialize(a);

    //and bunch of operations

    private void Initialize(double[,] a) => _inMatrix = a;

    public static implicit operator Matrix(double[,] a) => new Matrix(a);
}
  

Ответ №2:

Чтобы заранее установить значения, вы можете просто сделать то, что вы уже предлагаете сами.

Просто заполните свой пустой конструктор значениями, которые вы хотите там.

 public Matrix()
{
    _inMatrix = new double[ , ] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
}
  

После этого вы можете просто создать новую матрицу со значениями, которые вы хотели бы там иметь.

 Matrix m1=new Matrix()
  

Вы даже можете создать матрицу, в которой вы хотите, чтобы ваша матрица была инициализирована, и передать ее в другой конструктор.

 public Matrix(double[,] _NewMatrix)
{
    _inMatrix = _NewMatrix;
}
  

и вызовите его с

 double[,] NewMatrix = new double[ , ] { { 1, 2 }, { 3, 4 }, { 5, 6 }, { 7, 8 } };
Matrix m_Matrix = new Matrix( NewMatrix );