用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++中复制这种语法。我希望用户能够使用一种方便的方法创建矩阵,而不是创建矩阵并遍历每个元素,然后添加值。
我可以使用运算符重载来处理=,但我该如何处理右手边。我该如何处理[]或。我并不特别需要冒号或大括号。只要用户方便,任何其他语法也可以。
我意识到要求你执行它太过分了。我想要的只是一些关于如何做到这一点的启发,或者与相关信息的链接。
-感谢
在C++编程语言(第4版)第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} };
我不确定我会推荐它,但一个明显的可能性是:
std::vector<std::vector<int>> A = {
{ 12 62 93 -8 22 },
{ 16 2 87 43 91 },
{ -4 17 -72 95 6 }
};
只要它纯粹是教育性的,而且你不太在乎浪费一些空间和数据不连续,它应该没问题。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- 有可能在Armadillo中复制MATLAB circshift方法吗
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 使用 MATLAB 语法的 c++ 函数参数?
- 将 GNU Octave(或 Matlab)矩阵输出到具有 C 数组语法的文件中
- 用C++实现Matlab语法
- Matlab语法[C++解释]
- 实现A(:,k)=b;c++矩阵库中的类matlab语法:避免const-ness
- 实现A(:,k)=b;一个c++矩阵库中的类似matlab的语法
- Matlab 语法帮助 ."*
- 使用OO语法将Matlab转换为c / c ++,而无需重写其功能