Arrays 选择多维数组切片的算法
我正在开发一个开源科学库(用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代码,老实说,我想不出一个算法并把它转换成代码来解决这个问题。我来自生物学背景,所以我对编码的算法思维方面不太有经验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
有人对如何解决这个问题有什么建议吗?非常感谢您的帮助!为了开始线性阵列,您必须使用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在运行时确定。请参阅我的答案。