我正在开发一个开源科学库(用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代码,老实说,我无法想到算法并将其转换为代码来解决问题。我来自生物学背景,所以我对编码的算法思维方面没有太多经验。
有人对如何解决这个问题有什么建议吗?非常感谢!
答案 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周)但我可以尝试设置代码......如果没有其他人敢接受你的挑战。