列出矩阵的初始化 class
list initialization for a matrix class
我正在尝试为线性代数计算编写一个矩阵 class。我几乎写完了我想写的东西。但是我在创建一个使用列表初始化来创建矩阵的构造函数时遇到了一些麻烦。
这是我的 class 数据成员:
template <typename T>
class Matx
{
private:
// data members
//rows and columns of matrix
int rows, cols;
//pointer to pointer to type T
T** matrix;
这是我的初始化代码:
template <typename T>
Matx<T>::Matx(T* ptM[], int m, int n) : rows(m), cols(n)
{
matrix = new T*[rows];
for (int i = 0; i < rows; i++)
matrix[i] = new T[cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
matrix[i][j] = *(ptM[i] + j);
}
主要:
double mat[][5] = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } };
double* pm[5];
for (int i=0;i<5;i++)
pm[i]=mat[i];
Matx<double> yourMat = Matx<double>(pm, 5,5);
但我认为有更好的方法。
我想要的是能够像数组一样初始化它。像这样:
Matx<double> yourMat = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } };
可能吗?
这绝对是可能的,我已经为类似的 类 创建了使用初始化列表的构造函数。像这样的构造函数应该可以完成这项工作:
template <typename T>
Matx<T>::Matx(std::initializer_list<std::initializer_list<T>> listlist) {
rows = (int)(listlist.begin())->size();
cols = (int)listlist.size();
matrix = new T*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new T[cols];
for (int j = 0; j < cols; j++) {
matrix[i][j] = ((listlist.begin()+i)->begin())[j];
}
}
}
对于有类似问题的任何人,此版本对其他答案进行了一些小的更正。试过这个,它适用于 gcc 7.3,ubuntu 16.04.
template <typename T>
Matx<T>::Matx(std::initializer_list<std::initializer_list<T>> listlist) {
rows = (int)(listlist.begin())->size(); /* pointer correction here */
cols = (int)listlist.size();
matrix = new T*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new T[cols];
for (int j = 0; j < cols; j++) {
matrix[i][j] = ((listlist.begin()+i)->begin())[j]; /* again minor correction */
}
}
}
我正在尝试为线性代数计算编写一个矩阵 class。我几乎写完了我想写的东西。但是我在创建一个使用列表初始化来创建矩阵的构造函数时遇到了一些麻烦。 这是我的 class 数据成员:
template <typename T>
class Matx
{
private:
// data members
//rows and columns of matrix
int rows, cols;
//pointer to pointer to type T
T** matrix;
这是我的初始化代码:
template <typename T>
Matx<T>::Matx(T* ptM[], int m, int n) : rows(m), cols(n)
{
matrix = new T*[rows];
for (int i = 0; i < rows; i++)
matrix[i] = new T[cols];
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++)
matrix[i][j] = *(ptM[i] + j);
}
主要:
double mat[][5] = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } };
double* pm[5];
for (int i=0;i<5;i++)
pm[i]=mat[i];
Matx<double> yourMat = Matx<double>(pm, 5,5);
但我认为有更好的方法。 我想要的是能够像数组一样初始化它。像这样:
Matx<double> yourMat = { {5,5,-1,7,54},{4,-9,20,12,-6},{9,-18,-3,1,21},{ 61,-8,-10,3,13 },{ 29,-28,-1,4,14 } };
可能吗?
这绝对是可能的,我已经为类似的 类 创建了使用初始化列表的构造函数。像这样的构造函数应该可以完成这项工作:
template <typename T>
Matx<T>::Matx(std::initializer_list<std::initializer_list<T>> listlist) {
rows = (int)(listlist.begin())->size();
cols = (int)listlist.size();
matrix = new T*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new T[cols];
for (int j = 0; j < cols; j++) {
matrix[i][j] = ((listlist.begin()+i)->begin())[j];
}
}
}
对于有类似问题的任何人,此版本对其他答案进行了一些小的更正。试过这个,它适用于 gcc 7.3,ubuntu 16.04.
template <typename T>
Matx<T>::Matx(std::initializer_list<std::initializer_list<T>> listlist) {
rows = (int)(listlist.begin())->size(); /* pointer correction here */
cols = (int)listlist.size();
matrix = new T*[rows];
for (int i = 0; i < rows; i++) {
matrix[i] = new T[cols];
for (int j = 0; j < cols; j++) {
matrix[i][j] = ((listlist.begin()+i)->begin())[j]; /* again minor correction */
}
}
}