Arrays 选择多维数组切片的算法

Arrays 选择多维数组切片的算法,arrays,multidimensional-array,slice,Arrays,Multidimensional Array,Slice,我正在开发一个开源科学库(用C编写),我们希望支持的操作之一是让“使用者”从“生产者”复制多维数组的任意片段。例如,假设我们有一个4x5 2D数组(很抱歉格式化): 10,20,30,40 50,60,70,80 90100110120 130140150160 170180190200 它们是以20:10、20、30、40、50、60、…、200的线性阵列形式暴露的 用户代码基本上会传入要选择的偏移量和计数(基本上是坐标): 开始[2]={0,2}(x开始,y开始) 计数[2]={3,2}(x

我正在开发一个开源科学库(用C编写),我们希望支持的操作之一是让“使用者”从“生产者”复制多维数组的任意片段。例如,假设我们有一个4x5 2D数组(很抱歉格式化):

10,20,30,40

50,60,70,80

90100110120

130140150160

170180190200

它们是以20:10、20、30、40、50、60、…、200的线性阵列形式暴露的

用户代码基本上会传入要选择的偏移量和计数(基本上是坐标):

开始[2]={0,2}(x开始,y开始)

计数[2]={3,2}(x计数,y计数)

这意味着对于x维度,从0位置开始,给我3(x坐标范围为[0:2],对于y维度,从2位置开始,给我2(y坐标范围为[3,4])

这将导致

130140150170180190

复制到用户缓冲区(长度为6)

所以我们知道的是:我们知道数组的维度大小(4x5)、维度数(2)以及用户想要的“坐标”

数组维度可以是任意数量的维度…1、2、3..6?100?,因为在科学应用程序中,数组的维度非常大是很常见的

这是C代码,老实说,我想不出一个算法并把它转换成代码来解决这个问题。我来自生物学背景,所以我对编码的算法思维方面不太有经验


有人对如何解决这个问题有什么建议吗?非常感谢您的帮助!

为了开始线性阵列,您必须使用start[0]*numColumns+start[1]。并且必须有一个循环,如

即使使用线性数组,也可以使用多维语法访问元素,因为c在内部将多维数组存储为线性数组

 for(int i = start[0], countx = 0, count < xcount; countx++, i++) {
      for( int j = start[1], county = 0; county < ycount; county++, j++) {
           // copy array[i][j] into another array.
      }
 }
for(int i=start[0],countx=0,count
必须计算每个标注起点的偏移量

给定数组[5][6][7][8];//索引a、b、c、d等以及维度dim(a)=5,dim(b)=6,dim(c)=7,dim(d)=8

对于索引a,位置(0):位置(a[0])=0,实际上是0*6*7*8

对于索引a,位置(a[1])是0{pos(a[0]}+1(索引a的当前值)*6*7*8

通常对于指数a,位置(n)=位置(a[0])+n*dim(b)*dim(c)*dim(d)

现在,在这样一个线性排列中,你的问题变成了一个洋葱,剥去外部尺寸,在内部尺寸内定位一个位置

对于索引b,位置(或值)0取决于索引a的值

对于索引b,我们写一个相对于位置(a[2])的位置,如下所示 位置(a[2]b[0])=位置(a[2])+位置(b[0])


与pos(a[0])一样,pos(b[0])也是0;,但它现在相对于pos(a[n])对于任何有效值0,谢谢您的回复。这将适用于二维数组。但是,我无法将此基本概念扩展到任意维数组。您知道如何将其扩展到n维吗?谢谢!我想很清楚,我在编译时不知道数组维度;要交换的数组是d在运行时确定。请参阅我的答案。