在 C++ 中实现 Matlab 语法
Implement Matlab Syntax in C++
在 Matlab 中,向矩阵添加元素的语法是
A = [12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6]
A =
12 62 93 -8 22
16 2 87 43 91
-4 17 -72 95 6
我正在用 C++ 构建一个用于教育目的的小型矩阵库,
我能想出的最好方法是创建一个数组并使用列表初始化,但它对我的目的不起作用。
我需要先知道有多少行多少列才能初始化矩阵。
有没有办法在 C++ 中复制此语法。我希望用户能够使用方便的方法创建矩阵,而不是创建矩阵并遍历每个元素,添加一个值。
我可以使用运算符重载来处理 =,但是我该如何处理右侧。我如何处理 [ ] 或 ; .我并不特别需要冒号或大括号。只要用户方便,任何其他语法也可以。
我意识到要求你实施它会太过分了。我想要的只是关于如何执行此操作的一些启发式方法,或具有相关信息的 link。
-谢谢
在C++程序设计语言(第4版)、第29章中,Stroutrup实现了一个Matrix
class 满足你的要求。不过,需要 C++11。
具体可以这样初始化:
Matrix<int,2> m = {{1,2,3},{4,5,6}};
特别是,在 §29.4.4 中,他定义了 Matrix_init
,一个嵌套的 initializer_list
,这就是您要查找的内容。 Matrix_init<T,N>
只是将 Matrix_init<T,N-1>
作为其成员类型:
template<typename T, size_t N>
struct Matrix_init {
using type = initializer_list<typename Matrix_init<T,N-1>::type>;
};
// specialization for N = 1
template<typename T>
struct Matrix_init<T,1> {
using type = initializer_list<T>;
};
您现在可以写:
Matrix_init<int, 2>::type m{ {1,2}, {3,4} };
或者,通过模板别名,
template<typenameT,size_t N>
using Matrix_initializer = typename Matrix_init<T,N>::type;
Matrix_initializer<int,2> m{ {1,2}, {3,4} };
我不确定我是否会推荐它,但一个明显的可能性是:
std::vector<std::vector<int>> A = {
{ 12 62 93 -8 22 },
{ 16 2 87 43 91 },
{ -4 17 -72 95 6 }
};
只要是纯粹的教育,你不太在乎浪费一些space和数据不连续,应该没问题。
在 Matlab 中,向矩阵添加元素的语法是
A = [12 62 93 -8 22; 16 2 87 43 91; -4 17 -72 95 6]
A =
12 62 93 -8 22
16 2 87 43 91
-4 17 -72 95 6
我正在用 C++ 构建一个用于教育目的的小型矩阵库, 我能想出的最好方法是创建一个数组并使用列表初始化,但它对我的目的不起作用。
我需要先知道有多少行多少列才能初始化矩阵。
有没有办法在 C++ 中复制此语法。我希望用户能够使用方便的方法创建矩阵,而不是创建矩阵并遍历每个元素,添加一个值。
我可以使用运算符重载来处理 =,但是我该如何处理右侧。我如何处理 [ ] 或 ; .我并不特别需要冒号或大括号。只要用户方便,任何其他语法也可以。
我意识到要求你实施它会太过分了。我想要的只是关于如何执行此操作的一些启发式方法,或具有相关信息的 link。
-谢谢
在C++程序设计语言(第4版)、第29章中,Stroutrup实现了一个Matrix
class 满足你的要求。不过,需要 C++11。
具体可以这样初始化:
Matrix<int,2> m = {{1,2,3},{4,5,6}};
特别是,在 §29.4.4 中,他定义了 Matrix_init
,一个嵌套的 initializer_list
,这就是您要查找的内容。 Matrix_init<T,N>
只是将 Matrix_init<T,N-1>
作为其成员类型:
template<typename T, size_t N>
struct Matrix_init {
using type = initializer_list<typename Matrix_init<T,N-1>::type>;
};
// specialization for N = 1
template<typename T>
struct Matrix_init<T,1> {
using type = initializer_list<T>;
};
您现在可以写:
Matrix_init<int, 2>::type m{ {1,2}, {3,4} };
或者,通过模板别名,
template<typenameT,size_t N>
using Matrix_initializer = typename Matrix_init<T,N>::type;
Matrix_initializer<int,2> m{ {1,2}, {3,4} };
我不确定我是否会推荐它,但一个明显的可能性是:
std::vector<std::vector<int>> A = {
{ 12 62 93 -8 22 },
{ 16 2 87 43 91 },
{ -4 17 -72 95 6 }
};
只要是纯粹的教育,你不太在乎浪费一些space和数据不连续,应该没问题。