【问题标题】:Contructor for matrix class in C++C++中矩阵类的构造函数
【发布时间】:2016-09-18 02:12:59
【问题描述】:

我正在用 C++ 编写一个矩阵操作类作为课程项目。我希望语法尽可能接近 MATLAB。我希望为矩阵实现一个构造函数,它允许我执行如下所示的操作:

Matrix X(3,3) = {1, 2, 3, 4, 5, 6, 7, 8, 9};
//     [1  2  3]
// X = [4  5  6]
//     [7  8  9]

我曾尝试使用 initializer_list 构造函数,但这只允许我这样做:

Matrix X(3,3,{1, 2, 3, 4, 5, 6, 7, 8, 9});

这是我的构造函数代码:

Matrix::Matrix(size_t row, size_t col) : nrow(row), ncol(col), len(row*col) {
    mat = std::unique_ptr<double[]>(new double[len]);
}

void Matrix::operator= (std::initializer_list<double> list) {
    if (list.size() != len)
        throw std::length_error("Sizes of matrix and initializer list do not match");
    auto it = list.begin();
    for (int i = 0; it != list.end(); ++i, ++it)
        mat[i] = *it;
}

Matrix::Matrix(size_t row, size_t col, std::initializer_list<double> list) : Matrix::Matrix(row, col) {
    *this = list;
}

我需要有关如何实施第一个建议的建议。

【问题讨论】:

  • 为什么不用std::vector&lt;double&gt; 而不是std::unique_ptr&lt;double[]&gt;
  • @NathanOliver 我可能完全错了,但我认为与向量相比,数组更快更轻。
  • std::vector 的性能应该同样快。在这两种情况下,您仍然有内存分配,之后访问速度应该是相同的。
  • @LakshayGarg 不幸的是,如果他们提出的问题是不可能的,这里的人们经常会否决问题。
  • 顺便说一句,opencv 有一种特殊的方法来做到这一点:Mat m = (Mat_&lt;double&gt;(3,3) &lt;&lt; 0,-1,0,-1,5,-1,0,-1,0); 虽然实现起来有点复杂

标签: c++ oop c++11 matrix constructor


【解决方案1】:

你的问题在于语法。

Matrix X(3,3) = {1, 2, 3, 4, 5, 6, 7, 8, 9};

不是合法的 c++,因为您在一个声明中同时使用了 direct initialization 语法和 aggregate initialization 语法。这意味着你想做的事情是行不通的。但是,您可以执行以下操作:

Matrix X(3,3);
X = {1, 2, 3, 4, 5, 6, 7, 8, 9};

我相信这将适用于您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    相关资源
    最近更新 更多