选择多维数组切片的算法

时间:2013-07-26 20:23:53

标签: arrays multidimensional-array slice

我正在开发一个开源科学库(用C语言编写),我们想要支持的操作之一就是让“消费者”从“生产者”中复制出多维数组的任意切片。例如,假设我们有一个4x5 2D数组(我为格式化道歉):

10,20,30,40

50,60,70,80

90,100,110,120

130,140,​​150,160

170,180,190,200

这些是暴露为20:10,20,30,40,50,60,...,200

的线性阵列

用户代码基本上传递了它想要选择的偏移和计数(基本上是坐标):

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

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

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

这应该导致

130,140,​​150,170,180,190

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

众所周知:我们知道数组的尺寸大小(4x5),尺寸数(2)以及用户想要的“坐标”。

阵列尺寸可以是任意数量的尺寸...... 1,2,3 .. 6? 100?因为在科学应用程序中,为阵列提供非常大的维度是很常见的。

这是C代码,老实说,我无法想到算法并将其转换为代码来解决问题。我来自生物学背景,所以我对编码的算法思维方面没有太多经验。

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

2 个答案:

答案 0 :(得分:0)

为了在线性数组中开始,你必须使用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.
      }
 }

答案 1 :(得分:0)

您必须计算每个维度开头的偏移量。

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

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

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

并且通常对于索引a,position(n)= pos(a [0])+ n * dim(b)* dim(c)* dim(d)

现在采用线性排列方式,你的问题就变成了洋葱,剥去了外部的尺寸以找到内部尺寸内的位置

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

因此对于索引b,我们将相对于pos(a [2])的位置写为 pos(a [2] b [0])= pos(a [2])+ position(b [0])

像pos(a [0])一样,pos(b [0])也是0; &lt; 0 * dim(c)* dim(d)&gt;,但它现在相对于pos(a [n])表示任何有效值0&lt; = n&lt; = dim(a)

所以pos(a [2] b [0])= pos(a [2])+ 0

pos(a [2] b [1])是pos(a [2])+ pos(b [1]) 其中posb [1]为0 + 1 * dim(c)* dim(d)

因此对于任何给定的坐标pos(a [i] b [j] c [k],d [l]) 你的陈述位置是pos(a [i])+ pos(b [j],+ pos(c [k])+ pos(d [l])

要选择任意数量的元素,您的值实际上将来自最后一个维度的集合。

如果您想要a中的2个单位,b中的3个单位,c中的1个单位和d中的2个单位,则需要前进至pos(a [i] b [j] c [k] d [l])并选择元素d [l]和d [l + 1]

然后回溯到pos(a [i],b [j + 1],c [k],d [l])并再次选择两个项d [l]和d [l + 1]。

显然,这个解决方案最好由递归函数提供。

我与项目截止日期相关(剩下2.5周)但我可以尝试设置代码......如果没有其他人敢接受你的挑战。