gpt4 book ai didi

c++ - 类内类问题

转载 作者:行者123 更新时间:2023-11-27 22:41:06 24 4
gpt4 key购买 nike

由于对机器学习有点好奇,我开始阅读与该主题相关的一些介绍性教程。因此,几天前我发现了一个非常简单的神经网络示例,使用 Python 和 numpy 库实现,出于练习目的,我决定使用 C++ 实现相同的算法,使用尽可能少的外部图书馆。

然后,我首先编写了一个能够处理矩阵定义/声明和相关数学运算(如加法、乘法等)的简单类。我 Eloquent 地将该类命名为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 的矩阵进行操作时覆盖相同的变量。
如果是,我该怎么做?

最佳答案

是的;像您应该初始化任何其他类成员一样初始化您的矩阵:在构造函数的 member initialisation list 中.

Neuron::Neuron(int matrixRows, int matrixColumns)
: weights(matrixRows, matrixColumns)
{}

当你这样做时:

T::T()
{
member = firstValue;
}

那不是初始化,是赋值。当你说如果成员的类型没有默认构造函数这是不够的,你是正确的,因为如果你不自己初始化一个成员,编译器会尝试为你初始化它,并且它不能提供它不提供的参数知道关于。如果由于某种原因(例如,需要先收集信息)不能正确初始化您的成员,智能指针/动态分配是一种常见的解决方法。

顺便说一下,T** 建议您创建一个指针数组。 Don't do that ;它非常低效且过于复杂。只需创建一个宽度×高度的数组 T 并相应地映射索引(i = y×width + x; x = i % width; y = i/width)。

关于c++ - 类内类问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49020863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com