这是我的第一篇文章,我希望我能达到标准......
为了提高效率,我正在翻译成 c ++ (这是我很新的)一个最初用 MATLAB 编写的程序。我实际上正在处理的代码片段在一个步骤中恢复对向量(矩阵)的各种索引的访问。例如,如果M1是一个大小的矩阵,比方说,10x15,程序将定义一个新的矩阵,如下所示:
idxs1 = [1 2 3];
idxs2 = [1 2 3 4 5];
M2 = M1 (idxs1 , idxs2);
得到M2作为大小为3x5的矩阵。现在,我想 MATLAB 实际上做的是逐个访问索引给出的M1的各个位置,然后通过重新排列获取的许多内容来构建M2,这些都非常有效。
我的问题是,如何在 c ++ 中重现这种机制?据我所知,没有直接的方法来连续访问数组的各种索引,而我正在使用的for
循环似乎相当麻烦。也许有一些聪明的方法可以做到这一点,而不需要“太多”的处理器时间?另外,为了教育目的,如果有人能够解释执行此类操作时MATLAB实际执行的操作,我将不胜感激。
提前致谢并对最终的不便表示抱歉!
P.S:如果它在问题中添加了任何内容,我正在使用 MEX 文件来链接这两种语言。 P.S2:顺便说一句,我发现了一些相关的问题,但是关于其他语言:
答案 0 :(得分:2)
" Armadillo是一个高质量的C ++线性代数库,旨在实现速度和易用性之间的良好平衡
可直接在C ++中进行算法开发,或将研究代码快速转换为生产环境;语法(API)故意类似于Matlab"
答案 1 :(得分:0)
数学程序数据结构可以是最精细的一些。我甚至无法弄清楚你的例子的第3行实际上是什么,所以我甚至无法猜测MATLAB如何实现任何东西。
我可以告诉你的是,一行MATLAB几乎肯定会隐藏大量的操作。如果你想重新创建它,你只需要创建一个带有几个for循环的实用程序函数,它们可以逐个复制所有正确的索引。最终,这与MATLAB没有太大的不同。
如果您需要支持大量矩阵运算,并且您正在进行大型项目,那么您可能需要考虑查找C ++矩阵库。我没有人推荐,但Boost是一个流行的C ++库,用于包括矩阵在内的多种用途。 (您也可以创建自己的数据结构,但不建议新手使用。)
答案 2 :(得分:0)
MATLAB 完全所做的事情是未指定的,并且可能因情况而异,具体取决于索引,甚至对于给定的索引集,它可能因机器而异。所以,我们不要推测。
特别是,未指定MATLAB是否物理复制M1。这样的副本可以伪造,这节省了时间。这种技术被称为"复制写入"。
在C ++中,这也是可能的,但更难。此外,现有的容器类都不支持它。
如果你要复制元素,CPU就不会成为瓶颈。相反,内存总线将限制你。当指数不连续时尤其如此。对于3x5矩阵,时间将由开销控制 - 连续性并不重要。