在C++中实现Matlab语法

3
在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++中复制此语法。我希望用户能够使用方便的方法创建矩阵,而不是创建矩阵并逐个元素添加值。
关于等号,我可以使用运算符重载处理它,但右边怎么办?如何处理“[]”或“;”?我不需要具体的冒号或大括号。任何其他语法也可以,只要对用户方便即可。
我意识到要求你实现这一点可能太过分了。我只想得到一些启发,或者相关信息的链接。
-谢谢。

3
草图:如果您可以接受动态大小的矩阵,您可以使用逗号运算符进行重载,以按列拼接值/向量/矩阵,并使用管道运算符进行重载,以按行拼接值/向量/矩阵,并使用移动语义来减少副本。请注意,考虑到这一点,您仍然需要自己的类型,否则会发生奇怪的事情......所以您可能仍然需要遵循上述^。或者您可以像Eigen所做的那样... - Rollen
@RollenD'Souza 谢谢。 - nnrales
2个回答

2
在《C++程序设计语言(第四版)》的第29章中,Stroutrup实现了一个Matrix类以满足您的要求。需要使用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} };

1
我不确定我会推荐它,但一个明显的可能性是:
std::vector<std::vector<int>> A = { 
    { 12 62 93 -8 22 },
    { 16 2 87 43 91  }, 
    { -4 17 -72 95 6 }
};

只要是纯粹的教育性内容,您不太关心浪费一些空间和数据不连续,那么就应该没问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接