三维数组存储
‘壹’ c 语言中,二维数组结构体和三维数组有什么不同,他们的输入储存各在哪里
C语言中,二维三维数组结构体基本是一样的,一维数组,如a[3]在内存里这样:
a[0]a[1]a[2]
二维a[2][3]就变成了 a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2]
三维a[2][2][3] a[0][0][0] a[0][0][1] a[0][0][2] a[0][1][0] a[0][1][1] a[0][1][2]....
不论如何都是线性存储的, 因为内存可以抽象成线性的
其实C语言中的三维数组一般都是定义成一个指向二维数组的一维数组, 二维数组也一般定义成指向数组的数组
给你的简单的例子:
(循环中)
// 增加内存区域 ---- 二维数组(只能增加, 没做减少处理)
MayBe =(LONG **) realloc(MayBe, sizeof(LONG *) * (MBCount+1));
MayBe[MBCount] = (LONG *) malloc(sizeof(LONG)*10);
MayBe[MBCount][0] = x[0];
MayBe[MBCount][1] = x[1];
MayBe[MBCount][2] = x[2];
MayBe[MBCount][3] = x[3];
MayBe[MBCount][4] = x[4];
MayBe[MBCount][5] = x[5];
MayBe[MBCount][6] = x[6];
MayBe[MBCount][7] = x[7];
MayBe[MBCount][8] = x[8];
MayBe[MBCount][9] = x[9];
MBCount ++;
删除:
for(i=0; i<MBCount; ++i)
if(MayBe[i]) free(MayBe[i]);
free(MayBe);
直接从我的一个程序中抠出来的:P
这里注意的是,不要把指针跟数组弄混了,虽然内存可以用数组的形式访问,但他们实际上是不一样的,数组比指针多一次寻址操作.
‘贰’ 求元素‘4,2,3’的存储首地址。
解:
数组A‘1..8,负2..6,0..6’相当于一个C语言的三维数组B[8][9][7],
则元素A‘4,2,3’相当于元素B[3][4][3]
三维数组的地址计算方法:
对于三维数组a[d1][d2][d3],可以想象成有d1页,每页有d2行和d3列,每一页内以行为主序存储.则第一个元素的地址即为a[0][0][0]的地址.设每个元素占R个字节,则元素a[i][j][k]的地址为:
Addr(a[i][j][k])=Addr(a[0][0][0])+(d2*d3*i+d3*j+k)*R.
到此本问题就可以解决了:
即:
Addr(A‘4,2,3’)=Addr(B[3][4][3])=Addr(a[0][0][0])+(9*7*3+7*4+3)*4
=78+(9*7*3+7*4+3)*4=958
说明:本题中,d1=8,d2=9,d3=7,R=4,Addr(a[0][0][0])=78(后两者问者给出)
‘叁’ 假设三维数组A[10][9][8]按行优先顺序存储,若每个元素占3个存储单元,且首地址为100,则元素A[9][8][7]的
(9×(9*8)+8*7+7)×3+100
9×(9*8)是因为有9个9×8的二维数组
8*7+7对单个的二维数组计算
对吧
‘肆’ 四维数组存储地址计算公式
四维数组存储地址计算公式:A[i][j]=A[0][0]+(i*N+j)*L。
A[8][5]前面有多少个元素。行下标i从1到8,列下标j从1到10,所有A[8][5]之前共有n7*10+4(74)个元素。每个元素的长度为3个字节,故共有3*74=222个字节。
三维数组A(ijk)按“行优先顺序”存储,其地址计算函数为:LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p+(k-1)]*d。
简介
通过一个整型下标可以访问数组的每一个值。数组维数是指在多维数组之中采用一系列有序的整数来标注,整数列表之中整数始终相同的个数。在数据库中,数组维数与表中属性数量有关,属性越多,数组维数越大。计算机中的字段属性、资源特性和那些读取与修改的权限。例如:文件属性、用户的属性。
‘伍’ 怎么计算三维数组的存储地址
假设数组各维的下界是不是1,二维数组A(mn)按“行优先顺序”存储在内存中,假设每个元素占用d个存储单元。元素a(ij)的存储地址应是数组的基地址加上排在a(ij)前面的元素所占用的单元数。因为a(ij)位于第i行、第j列,前面i-1行一共有(i-1)×n个元素,第i行上a(ij)前面又有j-1个元素,故它前面一共有(i-1) ×n+j-1个元素。
因此,a(ij)的地址计算函数为:LOC(aij)=LOC(a11)+[(i-1)*n+j-1]*d。
同样,三维数组A(ijk)按“行优先顺序”存储,其地址计算函数为:LOC(aijk)=LOC(a111)+[(i-1)*n*p+(j-1)*p+(k-1)]*d。
上述讨论均是假设数组各维的下界是1,更一般的二维数组是A[c1..d1,c2..d2],这里c1,c2不一定是1。a(ij)前一共有i-c1行,二维数组一共有d2-c2+1列,故这i-c1行共有(i-c1)*(d2-c2+1)个元素,第i行上a(ij)前一共有j-c2个元素。
因此,a(ij)的地址计算函数为:LOC(aij)=LOC(ac1c2)+[(i-c1)*(d2-c2+1)+j-c2)]*d。
例如,在C语言中,数组各维下标的下界是0,因此在C语言中,二维数组的地址计算公式为:LOC(aij)=LOC(a00)+(i*(d2+1)+j)*d。
‘陆’ 在matlab中如何导入数据为一个三维数组
假设您拥有以下结构的数据,由多个维度相等的矩阵组成。在 MATLAB 中,导入并处理这类数据的流程大致如下:
首先,您需要使用`zeros`函数创建一个三维数组,其大小与矩阵的数量及矩阵的维度相匹配。然后,通过`importdata`函数将数据导入 MATLAB 环境中。导入后,数据将以特定格式存储。
接下来,编写一个循环,将数据按照每固定维度的顺序,逐个存入之前创建的三维数组中。具体代码示例如下:
完成循环后,您的`decouple`数据便以三维数组的形式呈现,具有所需的结构。
通过上述方法,您便可以方便地调用和操作该三维数组,实现对数据的进一步分析与处理。