2

我想进入神经网络,这就是为什么我想编写自己的 C++ 矩阵类。问题是我对 C++ 也很陌生,为了简单起见,我想使用 std::vector 而不是 2D-Array。目前我的课看起来像

class Matrix {

private:

    std::vector<std::vector<float>> data_;

public:

    Matrix(const int& rows, const int& columns);
};

我知道 std::vector 有点开销,但我想通过将向量缩小到所需的确切大小来尽可能地减少开销:

Matrix::Matrix(const int &rows, const int &columns) {
    this->data_ = std::vector<std::vector<float>>{};
    this->data_.resize(rows);
    for (auto col : this->data_) {
        col.resize(columns);
    }

}

我的问题是:这种缩小是否符合我的预期,或者有更好的方法吗?

非常感谢!

4

1 回答 1

2

Shrinking意味着变小。鉴于构造函数的上下文,我认为您的意思是扩大.

您的解决方案并不完全正确,因为您的for-loop 调整了您想要调整大小的向量副本的大小。

不太重要,但值得一提:此外,您制作了一个不必要的空向量副本来初始化data_。事实上,当你进入构造函数的主体时,所有的成员都已经构造好了。最后,也没有必要使用this->来访问成员,除非参数名称有歧义:

Matrix::Matrix(const int &rows, const int &columns) {
    data_.resize(rows);
    for (auto& col : data_) {   // note the & to resize the vector in the vector 
        col.resize(columns);
    }
}

附录:

您还可以为成员的构造函数提供显式参数:

Matrix::Matrix(const int &rows, const int &columns) : data_(rows) {
    for (auto& col : data_) {
        col.resize(columns);
    }
}

如果你喜欢简洁,你甚至可以选择:

Matrix::Matrix(const int &rows, const int &columns) : data_(rows, vector<float>(columns)) {
}
于 2019-05-05T20:27:55.113 回答