Как избежать упаковки / распаковки большого динамического объекта? - PullRequest
0 голосов
/ 09 апреля 2019

Мне нужно умножить две относительно большие матрицы и сделать это много раз (в цикле). Однако формат (тип объектов), как эти матрицы хранятся в памяти, должен быть выбран пользователем. Есть три варианта:

  1. double [,] M1; double [,] M2; (двумерные массивы)

  2. double[][] M1; double [][]M2; (зубчатые массивы).

  3. Matrix <double> M1;Matrix <double> M2; (формат Math Net Numerics).

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

object M1;
object M2;

switch case 
{
    case 1:
        M1 = new double[rows,columns];
    .../etc
}

Один из способов ее решения очень прост: просто объявить 6 матриц (6 переменных) и во время выполнения инициализировать две из них. Но это выглядит некрасиво и сделает код намного сложнее.

Мой вопрос: есть ли элегантное решение этой проблемы? Я новичок в C #, но поиск по сайту мне не сильно помог.

1 Ответ

0 голосов
/ 09 апреля 2019

Да, с вами все в порядке, здесь нет никакого бокса / распаковки. Я понял, что я хочу и нужно делать. Я создам интерфейс, который объявляет некоторые матричные методы:

interface MatrixMethods
{
   void MatrixIni();
   void DoMultiplication();
   double ReturnFinalResult();
// etc
}

Тогда я буду использовать общий класс:

class MatrixStorage <T> 
{
  protected T M1;
  protected T M2;
// etc
}

и наконец необходимый класс:

    class MatrixMult<T> : MatrixStorage<T> , MatrixMethods
{
    public void MatrixIni()
    {
        //etc Matrix random ini
    }
    public void DoMultiplication()
    {
        // multiplication
    }
    public double ReturnFinalResult()
    {
        // compute output
    }
    MatrixMult(params int[] input)
    {
        // ini
    }

}

и затем я создаю экземпляр класса и выполняю вычисления:

MatrixMethods newMatrixMult;
newMatrixMult = new MatrixMult<UserMatrixType>(userData);
newMatrixMult.DoMultiplication();
double result = newMatrixMult.ReturnFinalResult

Я прошу прощения за вводящий в заблуждение вопрос. Лучший

...