精华内容
下载资源
问答
  • 多维数组 和 多维指针

    千次阅读 2017-02-10 19:00:55
    多维数组 和 多维指针

    指向指针的指针—二级指针

    指针变量在内存中会占用一定的空间。
    可以定义指针来保存指针变量的地址值。

    举例:
    这里写图片描述

    举例说明,多级指针的使用,重置动态空间大小

    #include <stdio.h>
    #include <malloc.h>
    
    int reset(char**p, int size, int new_size)
    {
        int ret = 1;
        int i = 0;
        int len = 0;
        char* pt = NULL;
        char* tmp = NULL;
        char* pp = *p;
    
        if( (p != NULL) && (new_size > 0) )
        {
            pt = (char*)malloc(new_size);
    
            tmp = pt;
    
            len = (size < new_size) ? size : new_size;
    
            for(i=0; i<len; i++)
            {
                *tmp++ = *pp++;      
            }
    
            free(*p);
            *p = pt;
        }
        else
        {
            ret = 0;
        }
    
        return ret;
    }
    
    int main()
    {
        char* p = (char*)malloc(5);
    
        printf("%0X\n", p);
    
        if( reset(&p, 5, 3) )
        {
            printf("%0X\n", p);
        }
    
        return 0;
    }

    在上面的程序中,函数要改变外部的指针所指向的位置,因此需要用到传址调用,因此需要定义指向指针的指针。

    二维数组

    C语言中只有一维数组。
    二维数组在内存中以两个一维数组的方式排布。
    二维数组中的第一维是一维数组,数组的每个元素为一维数组。
    二维数组中的第二维才是具体的值。
    二维数组的数组名可看做常量指针。

    特别注意:在定义二维数组时,第一维可以不写数组大小,但是第二位必须要写上数组的大小,如下所示:

    int a[][5]={{1,2,3,4,5},{6,7,8,9,0}};

    这是因为必须要定义第一维数组元素的类型,上面a中第一维数组的类型就是int(*)[5],指向5元素数组的指针。

    二维数组在内存中的存放形态不是矩阵。

    这里写图片描述

    一维数组名代表数组首元素的地址
    int a[5] a的类型为int*
    二维数组名同样代表数组首元素的地址,只不过该数组的每个元素都是数组,二位数组名是一个数组指针,而且是常量。
    int m [2] [5] 数组名m的类型为int(*)[5],一个指向5个int元素数组的指针。

    结论:
    二维数组名可以看做是指向数组的常量指针
    二维数组在物理存储上可以看做是一维数组
    二维数组中的每个元素都是同类型的一维数组

    例题:

    #include <stdio.h>
    
    int main()
    {
        int a[5][5];
        int(*p)[4];
    
        p = a;//这里会有警告,或报错
    
        printf("%d\n", &p[4][2] - &a[4][2]);
    }

    问:这里打印的数值是多少?答案:-4
    解释:由于p指针的类型为int[4]而数组名a的类型为int[5],因此&p[4] [2] 和 &a [4] [2] 的偏移地址有所不同。计算方法如下:
    &p[4] [2] = 4*4+2 =18
    &a[4] [2] = 5*4+2 =22, 这样结果就是-4。
    指针后面加[ ] ,就是移动地址的意思。

    例题

    int main(int argc, char* argv[], char* env[])
    {
        int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
        int i = 0;
        int j = 0;
    
        for(i=0; i<3; i++)
        {
            for(j=0; j<3; j++)
            {
                printf("%d\n", *(*(a+i) + j));
            }
        }
    }

    上述代码的输出是0,1,2,3,4,5,6,7,8
    * 星号相当于寻址 ,a[i] [j] = * (a[i] + j) = * ( *(a+i) + j)

    例题:动态申请二维数组

    #include <malloc.h>
    
    int** malloc2d(int row, int col)
    {
        int** ret = (int**) malloc(sizeof(int *) * row);
        int* p = (int*) malloc(sizeof(int) * row *col);
    
        if(ret && p)
        {
            int i = 0;
            for(i = 0; i < row; i++)
            {
                ret[i] = p + col * i;
            }
        }
        else
        {
            free(ret);
            free(p);
            ret = NULL;
        }
        return ret;
    }
    
    void free2d(int** a)
    {
        free(a[0]);
        free(a);
    }

    小结

    C语言中只有一维数组,而且数组大小必须在编译期就作为常数确定。
    C语言中的数组元素可是任何类型的数据,即数组的元素可以是另一个数组。
    C语言中只有数组的大小和数组首元素的地址是编译器直接确定的。

    展开全文
  • 首先, 提出一种基于粒子群优化和四叉树空间划分的多维模式运动空间的构建方法, 为了定量描述多维模式的运动, 采用多维区间数度量多维模式类别变量; 然后, 定义一种多维区间T-S 模糊模型, 并以此构建多维运动模式的...
  • 多维数组

    2019-10-25 19:48:34
    多维数组 Task06:多维数组 语法知识 3.18.1多维数组的创建 (1)通过直接赋值来取得 (2)通过矩阵函数生成多维函数 3.18.2多维数组的运算 matlab内多数内装函数支持多维函数的运算,如果不能,则转化成二维数组的...

    多维数组

    Task06:多维数组
    语法知识
    3.18.1多维数组的创建
    (1)通过直接赋值来取得
    (2)通过矩阵函数生成多维函数
    3.18.2多维数组的运算
    matlab内多数内装函数支持多维函数的运算,如果不能,则转化成二维数组的多次运算。
    3.18.3猜数字游戏
    3.18.415个滑块游戏
    实战演练
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    学习心得
    1.多维数组的创建和计算。
    2.有关多维数组的程序设计。

    展开全文
  • 多维文本数据库上的OLAP:主题网络多维数据集及其应用
  • 8 多维数组在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。由于更多维的...

    8  多维数组

    在实际应用的过程中,经常需要构造多于二维的数组,我们将多于二维的数组统称为多维数组。

    对于二维数组,人们习惯于把数组的第1维称为“行”,把第2维称为“列”,我们将第3维称为“页”。

    由于更多维的数组的显示并不直观,所以本节以三维数组为例来介绍多维数组的使用。

    8.1  多维数组的创建

    创建多维数组最常用的方法有以下4种。

    (1)直接通过“全下标”元素赋值的方式创建多维数组。

    (2)由若干同样尺寸的二维数组组合成多维数组。

    (3)由函数ones、zeros、rand、randn等直接创建特殊多维数组。

    (4)借助cat、repmat、reshape等函数构建多维数组。

    【例2-26】  采用“全下标”元素赋值方式创建多维数组示例。

    >> A(3,3,3)=1                %  创建3*3*3数组,未赋值元素默认设置为0

    A(:,:,1) =

         0     0    0

         0     0    0

         0     0    0

    A(:,:,2) =

         0    0     0

         0     0    0

         0     0    0

    A(:,:,3) =

         0     0    0

         0     0    0

         0     0    1

    >> B(3,4,:)=1:4              % 创建3*4*4数组

    B(:,:,1) =

         0     0    0     0

         0     0    0     0

         0     0    0     1

    B(:,:,2) =

         0     0    0     0

         0     0    0     0

         0     0    0     2

    B(:,:,3) =

         0     0    0     0

         0     0    0     0

         0     0    0     3

    B(:,:,4) =

         0     0    0     0

         0     0    0     0

         0     0    0     4

    【例2-27】  由二维数组合成多维数组示例。

    >> clear

    >> A(:,:,1)=magic(4);                %  创建数组A1页的数据

    >> A(:,:,2)=ones(4);                 %  创建数组A2页的数据

    >> A(:,:,3)=zeros(4)                 %  创建数组A3页的数据

    A(:,:,1) =

        16     2    3    13

         5    11   10     8

         9    7     6    12

         4    14   15     1

    A(:,:,2) =

         1     1    1     1

         1     1    1     1

         1     1    1     1

         1     1    1     1

    A(:,:,3) =

         0     0    0     0

         0     0    0     0

         0     0    0     0

         0     0    0     0

    【例2-28】  由函数rand直接创建特殊多维数组示例。

    >> rand('state', 0);        % 设置随机种子,便于读者验证

    >> B=rand(3,4,3)

    B(:,:,1) =

       0.9501    0.4860    0.4565   0.4447

       0.2311    0.8913    0.0185   0.6154

       0.6068    0.7621    0.8214   0.7919

    B(:,:,2) =

        0.9218    0.4057   0.4103    0.3529

       0.7382    0.9355    0.8936   0.8132

       0.1763    0.9169    0.0579   0.0099

    B(:,:,3) =

       0.1389    0.6038    0.0153   0.9318

       0.2028    0.2722    0.7468   0.4660

       0.1987    0.1988    0.4451   0.4186

    【例2-29】  借助cat函数构建多维数组示例。

    >>B=cat(3,ones(2,3),ones(2,3)*2,ones(2,3)*3)

    B(:,:,1) =

         1     1    1

         1     1    1

    B(:,:,2) =

         2     2    2

         2     2    2

    B(:,:,3) =

         3     3    3

         3     3    3 

    cat指令第1个输入变量填写的数字“表示扩展方向的维号”。本例第1个输入变量是3,表示“沿第3维方向扩展”。为了对比下面我们分别演示使用cat函数沿其他方向进行扩展的情况。

    >>B=cat(2,ones(2,3),ones(2,3)*2,ones(2,3)*3)        % 沿第2维方向扩展

    B =

         1    1     1     2    2     2     3    3     3

         1    1     1     2    2     2     3    3     3

    >>B=cat(1,ones(2,3),ones(2,3)*2,ones(2,3)*3)       % 沿第1维方向扩展

    B =

         1    1     1

         1    1     1

         2    2     2

         2    2     2

         3    3     3

         3    3     3

    >>B=cat(4,ones(2,3),ones(2,3)*2,ones(2,3)*3)       % 沿第4维方向扩展

    B(:,:,1,1) =

         1    1     1

         1    1     1

    B(:,:,1,2) =

         2    2     2

         2    2     2

    B(:,:,1,3) =

         3    3     3

         3    3     3

    【例2-30】  借助repmat函数构建多维数组示例。

    >> repmat([1,2;3,4;5,6],[1,2,3])

    ans(:,:,1) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    ans(:,:,2) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    ans(:,:,3) =

         1     2    1     2

         3     4    3     4

         5     6    5     6

    repmat函数的第1个输入变量是构成多维数组的源数组。第2个输入变量是指定向各维方向上扩展的源数组个数。本例中输入变量[1,2,3]是指将源数组在行方向上扩展为1个,在列方向上扩展为2个,在页方向上扩展为3个。

    【例2-31】  借助reshape函数构建多维数组示例。

    >> A=reshape(1:60,5,4,3)

    A(:,:,1) =

         1     6   11    16

         2     7   12    17

         3     8   13    18

         4     9   14    19

         5    10   15    20

    A(:,:,2) =

        21    26   31    36

        22    27   32    37

        23    28   33    38

        24    29   34    39

        25    30   35    40

    A(:,:,3) =

        41    46   51    56

        42    47   52    57

        43    48   53    58

        44    49   54    59

        45    50   55    60

    >> B=reshape(A,4,5,3)

    B(:,:,1) =

         1     5    9    13    17

         2     6   10    14    18

         3     7   11    15    19

         4     8   12    16    20

    B(:,:,2) =

        21    25   29    33    37

        22    26   30    34    38

        23    27   31    35    39

        24    28   32    36    40

    B(:,:,3) =

        41    45   49    53    57

        42    46   50    54    58

        43    47   51    55    59

        44    48   52    56    60

    reshape的第1个输入变量是源数组,第234个输入变量是要生成的数组的行数、列数和页数。将要生成的数组必须和源数组的元素的个数相同。重组时,元素排列遵循“单下标”编号规则:第1页的第1列接该页的第2列,直至第1页最后一列。在第1页排列结束后,开始排列第2页的第1列,依次类推,直至所有的元素排列结束。

    8.2 多维数组的寻访与重构

    1.多维数组的寻访

    多维数组的寻访和二维数组一样,可以使用“全下标”、“单下标”和“逻辑下标”来寻访。“全下标”和“逻辑下标”两种形式与二维数组相同,是以非常直观的形式来表现的,这里不再赘述。而多维数组的“单下标”就比较复杂一点。本小节对此进行介绍。

    多维数组的“单下标”其实就是二维数组“单下标”的扩展,换句话说,二维数组的“单下标”编排方式是“单下标”的一种简单形式。用语言表示就是:将数组“全下标”格式中的各维按照出现的先后顺序依次循环,直至将所有的数据编排成为一列。

    【例2-32】  多维数组“单下标”排列示例。

    >> a=ones(2,2,2,2)             % 创建全为12*2*2*2四维数组a

    a(:,:,1,1) =

         1     1

         1     1

    a(:,:,2,1) =

         1     1

         1     1

    a(:,:,1,2) =

         1     1

         1     1

    a(:,:,2,2) =

         1     1

         1     1

    >> a(1:16)=1:16                %  按照单下标形式为数组a赋值

    a(:,:,1,1) =

         1     3

         2     4

    a(:,:,2,1) =

         5     7

         6     8

    a(:,:,1,2) =

         9    11

        10    12

    a(:,:,2,2) =

        13    15

        14    16

    从得到结果中的数组a被赋值以后的各元素分布,可以看出多维数组是如何按照“全下标”的各维顺序来存储数据的。

    2.多维数组的重构

    除了前面介绍的可以用来进行多维数组的重构函数catrepmatreshape之外,还有其他一些函数可用来进行多维数组的重构,详见表2-10

    2-10     多维数组重构函数

    函数形式

    函数功能

    函数形式

    函数功能

    permute

    广义非共轭转置

    flipdim

    以指定维交换对称位置上的元素

    ipermute

    广义反转置,permute的反操作

    shiftdim

    维移动函数

    【例2-33】  多维数组元素对称交换函数flipdim使用示例。

    >> A=reshape(1:18,2,3,3)            % 创建演示三维数组

    A(:,:,1) =

         1     3    5

         2     4    6

    A(:,:,2) =

         7     9   11

         8    10   12

    A(:,:,3) =

        13    15   17

        14    16   18

    >> B=flipdim(A,1)                    %  以第1维进行对称变换

    B(:,:,1) =

         2     4    6

         1     3    5

    B(:,:,2) =

         8    10   12

         7     9   11

    B(:,:,3) =

        14    16   18

        13    15   17

    >> C=flipdim(A,3)                    %  以第3维进行对称变换

    C(:,:,1) =

        13    15   17

        14    16   18

    C(:,:,2) =

         7     9   11

         8    10   12

    C(:,:,3) =

         1     3    5

         2     4    6

    从本例可以看出,函数flipdim(A,k)中的输入变量k就是指进行对称变换的维。另外flipdim(A,k)函数也可用于二维数组,读者可以自行验证。

    【例2-34】  多维数组元素维移动函数shiftdim使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> D=shiftdim(A,1)      %  将各维向左移动1位,使2*3*3数组变成3*3*2数组

    D(:,:,1) =

         1     7   13

         3     9   15

         5    11   17

    D(:,:,2) =

         2     8   14

         4    10   16

         6    12   18

    >> E=shiftdim(A,2)      %  将各维向左移动2位,使2*3*3数组变成3*2*3数组

    E(:,:,1) =

         1     2

         7     8

        13    14

    E(:,:,2) =

         3     4

         9    10

        15    16

    E(:,:,3) =

         5     6

        11    12

        17    18

    运算D=shiftdim(A,1)实现以下操作:D(j,k,i)=A(i,j,k)i, j, k分别是指各维的下标。对于三维数组,D=shiftdim(A,3)的操作就等同于简单的D=A

    【例2-35】  多维数组元素广义非共轭函数permute使用示例。

    本例在上例所建立的三维数组A上进行演示。

    >> F=permute(A,[3 2 1])

    F(:,:,1) =

         1     3    5

         7     9   11

        13    15   17

    F(:,:,2) =

         2     4    6

         8    10   12

        14    16   18

    >> G=permute(A,[3 1 2])

    G(:,:,1) =

         1     2

         7     8

        13    14

    G(:,:,2) =

         3     4

         9    10

        15    16

    G(:,:,3) =

         5     6

        11    12

        17    18

    运算F=permute(A, [3 2 1])实现以下操作:F(k,j,i)=A(i,j,k)i, j, k分别是指各维的下标。函数permute就是函数shiftdim的特殊形式,它可以任意指定维的移动顺序。

     e8b613fb70f3c443f9baa747306f4cbf.png

    展开全文
  • 多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算多维数组下标计算
  • 多维数据库

    2016-12-28 15:31:19
    多维数据库(Multi Dimensional Database,MDD)可以简单地理解为:将数据存放在一个n维数组中,而不是像关系数据库那样以记录的形式存放。因此它存在大量稀疏矩阵,人们可以通过多维视图来观察数据。多维数据库增加...
       多维数据库(Multi Dimensional Database,MDD)可以简单地理解为:将数据存放在一个n维数组中,而不是像关系数据库那样以记录的形式存放。因此它存在大量稀疏矩阵,人们可以通过多维视图来观察数据。多维数据库增加了一个时间维,与关系数据库相比,它的优势在于可以提高数据处理速度,加快反应时间,提高查询效率。
      目前有两种MDD 的OLAP产品:基于多维数据库的MOLAP和基于关系数据库的ROLAP。ROLAP建立了一种新的体系,即星型结构。
      MDD并没有公认的多维模型,也没有像关系模型那样标准地取得数据的方法(如SQL、API等)。基于MDD的OLAP产品,依据决策支持的内容使用范围也有很大的不同。
      在低端,用户使用基于单用户或小型LAN的工具来观察多维数据。这些工具的功能性和实用性可能相当不错,但由于受到规模的限制,它们不具备OLAP的所有特性。这些工具使用超立方结构,将模型限制在n维形态。当模型足够大且稀疏数据没有控制好时,这种模型将会不堪一击。这些工具使用数据库的大小是以MB来计量的,而不是以GB计量的,因此只能进行只读操作,且具备有限的复杂计算。
      在高端,OLAP工具用4GL提供了完善的开发环境、统计分析、时间序列分析、财政报告、用户接口、多层体系结构、图表等许多其他功能。尽管不同的OLAP工具都使用了它们自己的多维数据库,但它们在不同程度上也利用了关系数据库作为存储媒体。因为关系数据库和OLAP工具同时在高端服务器上处理,所以速度和效率仍然很快。
      纯多维数据库引擎也被开发出来。尽管这些工具缺乏4GL及充分的开发环境,但却有比高端MDD工具所使用的数据库更为复杂的数据库。这些工具也具有统计分析、财务分析和时间序列分析等功能,并有自己的API,允许其对前端的开发环境开放。
      MDD能提供优良的查询性能。存储在MDD中的信息比在关系数据库中的信息具有更详细的索引,可以常驻内存。MDD的信息是以数组形式存放的,所以它可以在不影响索引的情况下更新数据。因此MDD非常适合于读写应用。
    展开全文
  • 多维数组对象处理: 多维数组对象转一维数组对象 获取多维数组对象的层级/深度 /*入参数组格式:[ { id: 1, name: '一', age: 10, sex: 0, children: [ { id: 11, name: '一-一', age: 11, sex: 0, children:...
  • 多维数组VS多维空间

    2017-01-15 17:44:57
    数组VS物理多维空间 多维数组是如何构成的: 在数组的定义里,只有一维数组的概念,通常用[ ]表示,并没有定义多维数组。但是,幸运的是,因为并没有规定数组里面的元素的数据类型。所以,可以设置数组内部的...
  • 之前给大家介绍了java一维数组以及java二维数组,下面的话就来给大家讲一下java多维数组方面的知识。除去一维数组和二维数组之外,Java当中还支持更多维的数组。像三维数组、四维数组和五维数组等等它们都属于多维...
  • 多维建模 定义和部署多维数据集 定义多维数据集(三) 1. 新建多维数据集,在解决方案中右击多维数据集 2. 进入多维数据集创建向导,选择创建方法: 使用现有表 3. 选择度量值组表,Dim开头是维度表,...
  • 浅析联机分析处理技术的多维数据分析多维联机分析处理 如何实现 [ 摘要 ] 详细阐述不同的 OLAP多维数据结构和多维数据分析的 动作 , 针对 OLAP的多维数据分析与数据仓库的多维数据组织形成相 互结合相互补充的关系...
  • 易语言多维数组演示源码,多维数组演示
  • 本资源涵盖多维合并表头及如何将多维表导出至EXCEL,资源为源码范例,易懂易用,希望需要的人得到帮助
  • java多维数组

    2015-09-01 10:49:52
    详解java多维数组,提高对java多维数组的理解
  • 多维建模 定义和部署多维数据集 多维数据集部署(五) 1. 部署进度查看 2. 部署成功后看到的效果 posted on 2017-04-06...
  • langdata, 用于多维数据集的多维数据集的源训练数据 langdata用于多维数据集的多维数据集的源训练数据希望通过修改/扩充原始训练数据来为特定语言训练超正方体? 那你就到了正确的位置 !如果你想找到一个语言数据集...
  • 第34课 - 多维数组和多维指针
  • 多维标度法

    2014-09-11 09:45:15
    多维标度法是一种多维标度(Multidimensional scaling,缩写MDS,又译“多维尺度”)也称作“相似度结构分析”(Similarity
  • 赋值定义多维数组.rar

    2020-03-29 00:48:00
    赋值定义多维数组.rar 赋值定义多维数组.rar 赋值定义多维数组.rar 赋值定义多维数组.rar 赋值定义多维数组.rar 赋值定义多维数组.rar
  • 多维数组程序设计 多维数组程序设计 多维数组程序设计
  • 多维高斯分布模型

    万次阅读 多人点赞 2017-05-07 00:34:48
    多维高斯模型在机器学习中应用广泛,在学到 Generative Learning Algorithm的时候,碰到了高斯模型,才意识到一定要恶补一下这部分知识,之前上自然语言课的时候,就因为多维高斯模型不懂,全程懵逼。本来想把这部分...
  • 易语言赋值定义多维数组源码,赋值定义多维数组
  • cognos多维分析

    2011-04-16 19:37:58
    cognos多维分析cognos多维分析cognos多维分析
  • 然后通过unsetMultiKeys方法删除复杂的多维数组里面的指定键值对;最后查看运行结果即可。推荐:《PHP视频教程》php删除多维数组里面的值在手册里面发现,改造后变成了一个函数,可以删除复杂的多维数组里面的制定...
  • 多维多矿

    2020-12-16 00:32:59
    多维多矿的优点 全面 经济 简便
  • 易语言重定义多维数组源码,重定义多维数组,min,pInt,pInts,RtlCopyMemory,RtlMoveMemory

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 42,459
精华内容 16,983
关键字:

多维