



鉴于数组在程序设计中使用比较广泛,我们来着重介绍一下LabVIEW中可对数组进行的操作。简要来说,对数组的操作可以归纳为以下几类:
(1)数组的创建、合并和初始化。
(2)数组的插入、替换、添加和删除。
(3)数组元素的索引、比较、变形和一维数组的排序。
(4)一维数组的查找、分割、反转、旋转。
(5)一维数组线性插值、阈值、交错组合和抽取组合。
(6)二维数组的转置。
下面就结合例子来介绍这些函数的功能。
在设计时,数组创建一般需要通过两步来完成:一是创建“数组外壳”(Array Shell),二是拖放数组元素至外壳中。要在前面板中创建数组控件或显示控件,可以先将控件工具箱中的数组(Array)作为外壳拖放至前面板中,然后选择数据元素(例如数值)添加到数组外壳即可。如果要在后面板创建数组常量,可以使用同样的方法,将数组函数面板中的数组常量(Array Constant)作为外壳拖放至后面板,然后再在外壳中放置数组元素。创建完成后,数组外壳会自动按照数组元素的大小调整尺寸,数组节点在后面板上的颜色会按照所选择数据类型的颜色变化。
图3-28显示了在前、后面板中创建一维数值数组的过程。
 
    图3-28 创建数组
如果将前面板中的数组控件或显示控件拖放或复制到后面板中,LabVIEW会自动将其转换为同类型的数组常量,也可以通过相反的操作将后面板的数组常量转换为前面板的数组控件或显示控件。
多维数组可以在创建一维数组后,通过数组对象右键菜单中的“添加维数”(Add Dimension)选项来生成。也可以通过数组对象右键菜单中的“减少维数”(Remove Dimension)选项来降低多维数组的维数(图3-29)。
 
    图3-29 改变数组的维数
默认情况下,在设计时创建的数组会使用与所选数据类型一致的默认值来初始化数组元素。当然,如果需要也可以逐一修改数组元素的值,并使用数组右键菜单中的“设置为默认”选项来手工初始化数组。
在程序运行时也可以动态创建数组或对数组进行初始化。使用“数组构建”(Build Array)函数可以在程序代码中使用多个常量、变量或数组作为输入创建一个新的数组。开始时,数组构建函数只有一个输入端子,设计人员可以根据需要来改变输入参数的数量。如果要添加其他的输入,可以使用函数右键菜单中的“增加数组输入”(Add Array Input)和“减少输入”(Remove Input)选项,或者通过改变函数图标尺寸来增减输入参数个数。当数组构建函数输入参数均为数组时,可以实现多个数据的链接;用一个数组作为输入参数,多个常量或变量作为其余输入参数可实现数组的动态增长。另外一种动态创建数组的方法是利用循环的自动索引功能。For循环或While循环有一种称为“自动索引”(Indexing)的功能,当数组作为循环的输入时,使用它可以自动地按顺序索引数组元素并输入循环中,供每次循环使用;也可以自动按顺序连续累积每次循环中的常量、变量或数组,将这些数据打包成一个新的数组作为循环的输出,其中常量、变量将组成一维数组,一维数组将组成二维数组,以此类推。默认情况下,对于每个连接到For循环的数组都会执行自动索引功能。可以禁止这个功能的执行,方法是在循环数据通道的右键菜单中选择“禁止自动索引”(Disable Indexing)选项。有时需要使用某一个固定值在程序运行时动态创建并初始化数组,可以使用LabVIEW提供的“数组初始化”(Initialize Array)函数,通过函数的右键菜单或更改函数图标的尺寸来增加函数的“输入维数”实现一维或多维数组的创建或初始化。
图3-30显示了在运行时使用常量创建和初始化数组的两种方法。图3-30(a)的方法是将5个数字常量组合为一维数组;图3-30(b)的方法是将三组数值常数放入三个一维数值数组,再将这三个数组组成一个二维3×3的数组,三列分别是3,4,7;–1,6,2;5,–2,8。
 
    图3-30 两种创建数组的方法
图3-31给出了运行时用常量3对一个3×4的数组进行初始化的例子,执行后每个元素的值均等于3。如果要对更多维数的数组进行初始化,则可以拖动函数图标尺寸,指定数组长度。
 
    图3-31 使用常量对数组进行初始化
数组创建后,就可以在程序中访问数组各元素。通常,可以通过循环的自动索引和“索引数组”(Index Array)函数来访问数组元素。
图3-32显示了在运行时使用For循环自动索引功能的方法。图3-32(a)将一维数组作为输入,使用For循环按顺序取出每个元素,加1后再按顺序组合成新数组,循环结束后新的一维数组中元素为2、3、4、5。图3-32(b)显示了以二维数组作为For循环输入,按顺序取出二维数组的每一行(一维数组)并对其中所有元素加1,随后再将一维数组重新组合成新的二维数组输出。
 
    图3-32 For循环的自动索引功能
另一种方法是通过“索引数组”函数来访问数组中的元素。在程序中可以通过将常量或变量连接到索引端子来访问某个数组的元素。“索引数组”函数会自动按照数组维数扩展其索引端子。例如将一个二维数组与索引数组函数相连,它会包含两个索引端子;将一个三维数组与索引数组函数相连,它会含三个索引端子,以此类推。图3-33(a)显示了索引数组函数访问一维数组第三个元素的例子,图3-33(b)显示了索引数组函数访问二维数组第二行第三列元素的例子。注意,第一个元素的索引为0,故数组中第n个元素的索引为n-1。
 
    图3-33 数组元素的索引
索引数组函数允许按照任何维数的组合提取子数组。图3-34显示了如何从一个二维数组中提取一个一维的行或者列数组,其中第一个索引数组函数从二维数组中提取出了第4列,第二个索引数组函数从二维数组中提取出了第3行。
 
    图3-34 从二维数组中索引一维数组
同理,也可以通过禁止两个索引端子,从一个三维数组中提取一个二维数组;或者通过禁止一个索引端子提取一个一维数组。图3-35显示了从三维数组提取数组的各种方法。
 
    图3-35 从三维数组提取数组的各种方法
有时需要在程序中选取数组或者矩阵的某个部分,这时可以使用“数组子集”(Array Subset)函数。它可以返回从指定索引开始,指定长度的数组子集作为新数组。图3-36中分别给出了从一维数组和二维数组中提取数组子集的例子。
 
    图3-36 从一维数组和二维数组中提取数组子集
LabVIEW还提供了对一维数组和多维数组进行插入、替换和删除等操作的函数。图3-37显示了用一个一维数组替换二维数组中第二行数据、将一个一维数组插入二维数组中第二列以及删除二维数组第二行数据的例子。需要注意的是,在进行插入、替换和删除操作时,必须按照小于输入数组的整维数进行。例如对二维数组进行这些操作时,所插入、替换或删除的部分必须为同长度的行或者列。此外,如果要在数组最末端添加元素,可以使用组件数组函数。
 
    图3-37 数组的替换、插入、删除操作
如果要在程序中获取数组中的最大、最小值,设计人员无须额外编写比较算法,LabVIEW提供了“数组最值”(Array Max & Min)函数可以方便地返回一维或多维数组元素中的最大值和最小值及其索引。然而,有时仅知道数组元素的最大、最小值还不够,可能还需要对数组中的元素进行排序。如果需要排序的数组是一维数组,则可以使用LabVIEW提供的“一维数组排序”(Sort 1D Array)函数,它可以将输入的一维数组中元素按照升序排列后返回。如果需要排序的数组为多维数组,则需要单独编写排序算法实现排序,或者先使用“数组变形”(Reshape Array)函数将多维数组变形为一维数组后排序,然后再变回多维数组。数组变形函数可以将输入数组按照指定的维数重新变形,例如将含有5个元素的一维数组变为2行3列的二维数组,或者将一个3行5列的二维数组裁剪为2行3列的二维数组,如图3-38所示。在变形过程中,如果原数组元素比变形后数组元素少,则使用数组元素数据类型的默认值填补,如果比变形后的数组元素多,则只按顺序取需要的部分。
 
    图3-38 数组变形
图3-39给出了一种使用数组变形函数对多维数组进行排序的例子。首先,使用“数组大小”(Array Size)函数返回二维数组的大小。该函数可以返回数组的维数和长度,如果输入数组为一维数组,则返回一维数组的长度,如果输入为多维数组,则返回一个一维数组,其元素按顺序列出数组的维数和长度。对这个例子来说,数组大小函数返回一个包含两个元素3和5的一维数组。其次,使用数组索引函数分别取出二维数组的行、列大小,通过行、列数相乘计算出数组中元素的个数。随后,使用数组变形函数将二维数组变形为长度等于二维数组元素个数的一维数组,并对其中元素使用一维数组排序函数进行排序。最后再将排序后的一维数组变形为与原二维数组有相同维数的新二维数组,新数组中的元素按照顺序从大到小进行排序。此外,例子中还演示了使用数组最值函数获取数组元素最大、最小值及其索引的情况。
 
    图3-39 多维数组的排序
和图3-40所示例子的原理相同,在对多维数组操作时,可以先将其变形为较低维数的一维或二维数组(降维)进行处理,随后再恢复到原来的维数。对一维数组来说,LabVIEW不仅提供排序函数,还提供了下列处理函数。
 
   用于从指定索引位置开始在一维数组中查找某个指定的数据元素,如果找到,则返回元素在数组中的索引,如果要找的元素不存在,则返回-1。
 
   用于从指定的索引位置将一维数组分割为两部分,其中前半部分包括索引从0到“指定索引减1”的部分元素,后半部分为其余元素。
 
   用于将一维数组中元素的顺序前后反转,例如原数组为[1,2,3],反转后为[3,2,1]。
 
   用于对一维数组进行指定次数的移位。如果指定的次数为正数,则向右移位,溢出的元素填补在数组起始位置;若指定的次数为负数,则向左移位,溢出元素填补在数组末端。例如,如果要对一个长度为N的一维数组移动-2次,则第3个元素(索引为2)变为第1个元素,第4个元素(索引为3)变为第2个元素,以此类推,而第N-2个元素为原索引为0的元素,第N-1个元素则变为原索引为1的元素。相反如果要对一个长度为N的一维数组移动2次,则旋转方向相反(图3-40)。
 
    图3-40 数组的旋转
 和一维数组阈值插值(Threshold 1D Array)
    和一维数组阈值插值(Threshold 1D Array)
     
   
    一维数组的插值函数根据输入的数组或一组坐标系中的离散点的坐标值,通过线性插值的方法来确定所指定的分数索引或某个在坐标系中
    
     x
    
    轴上的值所对应的
    
     y
    
    值。所谓线性插值方法是指在选定的两点组成的线段上取值的方法。具体来说,假定坐标系中有两点(
    
     x
    
    
     m
    
    ,
    
     y
    
    
     m
    
    )和(
    
     x
    
    
     n
    
    ,
    
     y
    
    
     n
    
    ),则用这两点对
    
     x
    
    
     m
    
    ≤
    
     x
    
    
     k
    
    ≤
    
     x
    
    
     n
    
    取线性插值时,
    
     y
    
    
     k
    
    的值按照公式
     进行计算。
    进行计算。
   
例如,如图3-41所示,一维数组中含有元素0.5、1.5、2、1,如果用数组的索引作为坐标系的 x 值,则各个点在坐标系中的分布如图3-41(a)所示。如果要根据线性插值方法获取坐标系中 x 轴上值为1.5的点对应的y值,函数首先根据索引1.5找到数组中距其最近的两个元素值,在坐标系中坐标为(1,1.5)和(2,2),此后按照线性插值公式可得 x k =1.5时, y k =1.75。在使用线性插值函数时需要注意:
(1)如果指定的索引或 x 值超出输入数组或坐标系中离散点 x 值的范围,则 y 值取边界点的值,例如图3-41(b)中函数的索引如果不是1.5而是3.5时,则输出为索引3对应的 y 值1;
(2)参与线性插值运算的值由数组中距索引点最近的两个元素值确定;
(3)用于线性插值的数组元素既可以是数值也可以是离散点的坐标(用包含 x 、 y 值的簇作为元素),当数组元素为数值时(作为 y 值),用数组索引作为 x 值。
一维数组的阈值函数是一维数组线性插值函数的逆过程,它从指定的起始位置开始,按照线性插值的逆过程,寻找指定的 y 值所对应的 x 值。开始时,函数先根据给定的 y 值,从起始值开始在数组中寻找连续的两个点,这两个点的 y 值一个比其大,另一个比其小;随后,函数以这两个点作为线性插值逆过程的输入,按照线性插值公式,计算出 y 值对应的 x 值。例如,如果要对图3-41(a)数组中从第一个元素开始计算 y 值为1.75对应的阈值 x ,会返回1.5。
 
    图3-41 一维数组的线性插值
 和抽取一维数组(Decimate 1D Array)
    和抽取一维数组(Decimate 1D Array)
     
   这两个函数互为逆过程,交错函数将输入的多个一维数组元素重新组合为新的一维数组,组合办法是先按顺序取各输入一维数组的第一个元素放入新数组,再按顺序取各输入一维数组的第二个元素追加在由第一个元素组成的数组之后,以此类推。输出数组的长度等于其中最短数组的长度乘以输入数组的个数,如果有多余的数组元素则舍弃。一维数组抽取函数刚好相反,根据要求输出数组的个数,先按顺序从输入数组中取值,填充输出数组的第一个元素,再填充第二个元素,以此类推。输出数组的长度等于输入数组元素的个数除以要求输出数组的个数并取整,如果有多余的数组元素则舍弃。图3-42显示了如何使用一维数组交错和抽取函数。
 
    图3-42 一维数组的交错和抽取
    LabVIEW还提供二维数组的转置函数(Transpose 2D Array)
     ,用于实现二维数组元素沿对角线进行反转,以图3-43为示例。
    ,用于实现二维数组元素沿对角线进行反转,以图3-43为示例。
   
 
    图3-43 二维数组的转置