Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多维数组在任意轴上的遍历_C++_C++11_Multidimensional Array - Fatal编程技术网

C++ 多维数组在任意轴上的遍历

C++ 多维数组在任意轴上的遍历,c++,c++11,multidimensional-array,C++,C++11,Multidimensional Array,我的代码中有一个(某种)性能问题,它根源于所选择的体系结构 我将以立方体的形式使用多维张量(基本上是具有更多维度的矩阵)来存储数据。 由于在编译时不知道维度,所以我不能使用Boost的多维数组(IIRC),但必须提出自己的解决方案 现在,我自己保存每个维度。我有一个维度的张量(比如说3),它包含很多维度2的张量(在一个std::vector中),每个都有一个维度1的张量的std::vector,每个都包含一个(数值)数据的std::vector。我使用一个抽象基类作为我的张量,因此其中的所有内容

我的代码中有一个(某种)性能问题,它根源于所选择的体系结构

我将以立方体的形式使用多维张量(基本上是具有更多维度的矩阵)来存储数据。 由于在编译时不知道维度,所以我不能使用Boost的多维数组(IIRC),但必须提出自己的解决方案

现在,我自己保存每个维度。我有一个维度的张量(比如说3),它包含很多维度2的张量(在一个std::vector中),每个都有一个维度1的张量的std::vector,每个都包含一个(数值)数据的std::vector。我使用一个抽象基类作为我的张量,因此其中的所有内容都是指向抽象类的指针,同时(秘密地)是多维或一维的

我通过给一个张量提供一个std::索引列表来提取一个数字数据点,该列表获取第一个元素,搜索相应的张量,并通过递归调用将列表的其余部分传递给该张量

我现在必须对这些数据进行多维快速傅里叶变换。我使用线程池和作业对象,它们沿着一维从张量复制数据,进行FFT并将数据写回

我已经有了实现ThreadPool和组织要进行FFT的维度的逻辑,但有一个问题:

我的数据结构是缓存中最不友好的野兽,你可以想到。。。虽然沿第一维(即,数据在单个一维张量中)复制数据的速度相当快,但在其他方向,我需要从各地复制数据

由于没有竞争条件(我确保每个并发FFT都在不同的数据点上),我想,我不会使用互斥锁保护让每个人同时复制。然而,这大大减慢了进程(“我现在复制数据!”——“不,我现在复制数据!”——“现在轮到我了!”…)

使用互斥锁保护复制进程不会提高速度。对一个包含1024个元素的向量进行FFT要快得多,然后是获取这些元素的复制过程,导致几乎所有线程都在等待,而其中一个正在复制

长话短说: 是否有任何一种多维数据结构,不需要在编译时设置维度,允许我沿所有轴快速遍历?我搜索了一会儿,除了Boost MultiArray之外,什么也没找到。矢量化也不起作用,因为索引增长太快,无法在通常的int类型中保持


我想不出如何在这里展示代码示例,因为大部分代码都很简单,但如果需要,我可以把它们放进去

具有多维张量支持(名义上不支持,但由DeepMind人编写,所以“多少”支持?),FFTW具有一维到三维FFT。使用带有一组1D到3D FFT的外部库会将大部分艰苦工作外包出去


编辑:事实上,FFTW支持线程化的n维FFT

而不是分配向量的向量(向量的向量),你不能使用一个维度大小的向量然后一个向量来存储所有数据吗?每个维度中的大小都是相同的。我的数据都是超立方体(目前)。将所有数据放在一个向量中的问题是索引。我试图为向量建立索引,但失败了,因为太小的整数类型。只是一个想法,你能把整个东西细分成更小的超立方体吗?假设子进程不经常在同一个超立方体中,这意味着它们可以不受干扰地访问数据,直到跳转到下一个超立方体。@Laray:你说的“太小的int类型”是什么意思?您肯定使用的是64位平台,
size\u t
是64位吗?什么东西太小了?当我试着这样做时,我无法计算单个向量的大小(在某个特定值设置为零)。当我使用long-long int作为索引时,由于某种原因,它给了我一个错误,无法将它与std::vector一起使用。到目前为止,看起来非常好。现在,我很难理解这个模块是如何工作的(我更喜欢数学,而不是计算机科学),但我会看看它!