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