石鑫华视觉论坛

 找回密码
 注册会员
查看: 360|回复: 1

[原创] LabVIEW删除数组中的指定元素

[复制链接]
  • TA的每日心情

    3 小时前
  • 签到天数: 3416 天

    连续签到: 18 天

    [LV.Master]2000FPS

     楼主| 发表于 2024-11-13 17:45:08 | 显示全部楼层 |阅读模式 来自:广东省深圳市 电信

    注册登陆后可查看附件和大图,以及购买相关内容

    您需要 登录 才可以下载或查看,没有账号?注册会员

    x
    LabVIEW删除数组中的指定元素
    在编写教程《LabVIEW驱动相机采集图像指南(24.11)》http://visionbbs.com/thread-32381-1-1.html时,使用Halcon来驱动相机采集图像时,是按照接口来罗列其下的设备的方式来处理的。最后返回的是一个二维字符串数组,每一行表示了一个接口中包含的所有设备。二维数组的行数是接口数量;而列数,则以设备最多的接口为准,其他没有这么多设备的接口,则后面使用空白来补齐。返回数组结构如下:

    image1.png
    包含补齐空位的二维字符串数组
           在主程序中,根据接口,来选择其下具体可用的设备,则使用设备接口的具体索引值来索引上面的二维数组的行。这时,如上图中的GigEvision2接口的设备只有2个,最后有一个空元素;而GenICam接口则只有一个设备,最后补齐了两个空元素。
           在索引得到设备时,需要将设备列表赋值给组合框的字符串数组,方便用户选择该接口下具体可用的设备;但是这里的空元素则不需要赋值过去,不能让用户选择空设备。所以,需要将索引的行中的空元素删除过滤掉。这种需求,还可以扩展到删除过滤指定的值的元素。
           LabVIEW的数组函数中,并没有删除过滤数组中的指定元素的功能函数,所以只能自己想办法来处理。
           这里要处理,其实也是非常简单的,最简单容易理解的方式,那就是直接每个元素都判断一下。

    image2.png
    使用For循环逐个删除空元素
    这里只判断了元素是不是空。如果要判断其他元素,那也可以使用=来判断。不过这种方法,相对来说,效率比较低,数组比较小时,可能还没有太多问题,而如果数组比较大时,则效率会比较慢,毕竟要每个元素都要判断。
    要想更高效的过滤删除数组中的元素,则使用搜索一维数组函数,利用返回的元素索引位置来删除该元素,则效率会更高一些(也要看搜索算法本身是不是效率会更高,如果搜索方法也是顺序搜索全部数组都判断,那么效率则会更慢)。如果没有搜索到指定元素时,返回-1时,则不删除。当然,也是循环判断的,不过这里直接使用while循环就可以,没有找到时,元素索引返回-1,则停止循环;找到指定搜索的元素时,则使用删除数组元素函数,将其删除掉:

    image3.png
    删除空元素

    image4.png
    删除b元素
    OpenG里有类似的Filter函数,不过略微复杂。可以借鉴一下其中的思路,对于搜索时,可以将搜索到的元素给到下一次循环,从新的元素位置开始搜索,这样对于大数组时更有利,可以加快搜索速度。

    image5.png
    增加开始索引移位寄存器
    LV2020版本:
    删除数组指定元素.vi (13.84 KB, 下载次数: 2)
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 22:52
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]400FPS

    发表于 2024-12-5 22:01:43 | 显示全部楼层 来自:广东省深圳市 电信
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册会员

    本版积分规则

    LabVIEW HALCON图像处理入门教程(24.09)
    石鑫华机器视觉与LabVIEW Vision图像处理PDF+视频教程11种全套
    《LabVIEW Vision函数实例详解2020-2024》教程-NI Vision所有函数使用方法介绍,基于NI VISION2020,兼容VDM21/22/23/24

    QQ|石鑫华视觉论坛 |网站地图

    GMT+8, 2024-12-26 13:13

    Powered by Discuz! X3.4

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表