#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 );