【发布时间】: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<double>而不是std::unique_ptr<double[]>? -
@NathanOliver 我可能完全错了,但我认为与向量相比,数组更快更轻。
-
std::vector的性能应该同样快。在这两种情况下,您仍然有内存分配,之后访问速度应该是相同的。 -
@LakshayGarg 不幸的是,如果他们提出的问题是不可能的,这里的人们经常会否决问题。
-
顺便说一句,opencv 有一种特殊的方法来做到这一点:
Mat m = (Mat_<double>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);虽然实现起来有点复杂
标签: c++ oop c++11 matrix constructor