c++ - 在 C++ 中实现 Matlab 语法

标签 c++ matlab matrix syntax operator-overloading

在 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满足您要求的类(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} };

关于c++ - 在 C++ 中实现 Matlab 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29519021/

相关文章:

c++ - OpenGL 纹理映射错误

c++ - 有没有一本使用 C++ 编写控制台/终端应用程序的书?

python - 递归地以螺旋顺序打印矩阵

R 相当于 Matlab 对 Schur 分解的重新排序?

c++ - 使用 CUDA 对矩阵进行按行/按列操作

拥有对象的 C++ shared_ptr 调用析构函数

c++ - 程序没有进入 FOR 循环

matlab - 将图像转换为色度图像

MATLAB:如何正确应用 ifft 将 "filtered"信号带回时间域?

java到matlab的转换