如何在C ++中高效地访问数组的多个元素?

时间:2016-01-04 06:06:42

标签: c++ arrays matlab matrix matrix-indexing

这是我的第一篇文章,我希望我能达到标准......

为了提高效率,我正在翻译成 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:顺便说一句,我发现了一些相关的问题,但是关于其他语言:

3 个答案:

答案 0 :(得分:2)

" Armadillo是一个高质量的C ++线性代数库,旨在实现速度和易用性之间的良好平衡

可直接在C ++中进行算法开发,或将研究代码快速转换为生产环境;语法(API)故意类似于Matlab"

链接:http://arma.sourceforge.net/

答案 1 :(得分:0)

数学程序数据结构可以是最精细的一些。我甚至无法弄清楚你的例子的第3行实际上是什么,所以我甚至无法猜测MATLAB如何实现任何东西。

我可以告诉你的是,一行MATLAB几乎肯定会隐藏大量的操作。如果你想重新创建它,你只需要创建一个带有几个for循环的实用程序函数,它们可以逐个复制所有正确的索引。最终,这与MATLAB没有太大的不同。

如果您需要支持大量矩阵运算,并且您正在进行大型项目,那么您可能需要考虑查找C ++矩阵库。我没有人推荐,但Boost是一个流行的C ++库,用于包括矩阵在内的多种用途。 (您也可以创建自己的数据结构,但不建议新手使用。)

答案 2 :(得分:0)

MATLAB 完全所做的事情是未指定的,并且可能因情况而异,具体取决于索引,甚至对于给定的索引集,它可能因机器而异。所以,我们不要推测。

特别是,未指定MATLAB是否物理复制M1。这样的副本可以伪造,这节省了时间。这种技术被称为"复制写入"。

在C ++中,这也是可能的,但更难。此外,现有的容器类都不支持它。

如果你要复制元素,CPU就不会成为瓶颈。相反,内存总线将限制你。当指数不连续时尤其如此。对于3x5矩阵,时间将由开销控制 - 连续性并不重要。