Проблема с классом внутри класса

rudicangiotti спросил: 03 февраля 2018 в 12:21 в: c++

Будучи немного любопытным в отношении машинного обучения, я начал читать некоторые вводные учебники, связанные с этой темой. В связи с этим, несколько дней назад я нашел очень простой пример нейронной сети, реализованный с использованием Python с библиотекой numpy и для практических целей, я решил реализовать тот же алгоритм с использованием C ++ с максимально возможными внешними библиотеками .

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

template <typename T>
class Matrix {
public:
  Matrix(int numRows, int numColumns);
  ~Matrix();
  int getRows();
  int getColumns();
  T readValue(int row, int column);
  void writeValue(int row, int column, T value);
  Matrix<T> operator+(Matrix<T> other);
  Matrix<T> operator-(Matrix<T> other);
  Matrix<T> operator*(T scalar);
  Matrix<T> operator*(Matrix<T> other);
  Matrix<T> entrywiseProduct(Matrix<T> other);
  Matrix<T> transpose();
  void print();
private:
  const int rows;
  const int columns;
  T** matrix;
};

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

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

#include "Matrix.h"template <typename T>
class Neuron {
public:
  Neuron(int matrixRows, int matrixColumns);
  ~Neuron();
  Matrix<T> estimate(Matrix<T> inputMatrix);
  void train(Matrix<T> inputMatrix, Matrix<T> outputMatrix, int iterations);
private:
  Matrix<T> weights;
};

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

И вот в чем проблема: указанная матрица должна быть определенно создана после инициализации класса Neuron. Насколько мне известно, для такого рода операций требуется использование указателя, который будет передан функцией new, используемой на его стороне, для динамического создания класса Matrix в этом случае. Однако, с другой стороны, я решил, что операции с матрицами всегда возвращают новую матрицу, а не указатель на матрицу, как вы можете видеть в заголовке первого класса.

Итак, я собираюсь спросить вы: возможно ли определить матрицу внутри конструктора Neuron и использовать ее как переменную класса, как определено в предыдущем заголовке? Таким образом, я должен иметь возможность перезаписывать одну и ту же переменную при выполнении операций над матрицей имен weights.
Если да, то как я могу это сделать?


0 ответов