【正点原子STM32连载】第五十五章 T9拼音输入法实验 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

news2024/11/17 3:05:07

1)实验平台:正点原子MiniPro H750开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=677017430560
3)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-336836-1-1.html
4)对正点原子STM32感兴趣的同学可以加群讨论:879133275

第五十五章 T9拼音输入法实验

本章,我们将介绍如何在STM32板子上实现一个简单的T9中文拼音输入法。本章分为如下几个小节:
55.1 拼音输入法简介
55.2 硬件设计
55.3 程序设计
55.4 下载验证

55.1 拼音输入法简介

在计算机上汉字的输入法有很多种,比如拼音输入法、五笔输入法、笔画输入法、区位输入法等。其中,又以拼音输入法用的最多。拼音输入法又可以分为很多类,比如全拼输入、双拼输入等。
在手机上,用得最多的就是T9拼音输入法了,T9输入法全名为智能输入法,字库容量九千多字,支持十多种语言。T9输入法是由美国特捷通讯(Tegic Communications)软件公司开发的,该输入法解决了小型掌上设备的文字输入问题,已经成为全球手机文字输入的标准之一。
一般情况下,手机拼音输入键盘如图55.1.1所示:
在这里插入图片描述
图55.1.1 手机拼音输入键盘
在这个键盘上,我们对比下传统的输入法和 T9 输入法,输入“中国”两个字需要的按键次数。传统的方法,先按4次9,输入字母z,再按2次4,输入字母 h,再按3次6,输入字母o,再按2次6,输入字母n,最后按1次4,输入字母g。这样,输入“中”字,要按键12 次,接着同样的方法,输入“国”字,需要按6次,总共就是18次按键。
如果是T9,我们输入“中”字,只需要输入:9、4、6、6、4,即可实现输入“中”字,在选择“中”字之后,T9会联想出一系列同“中”字组合的词,如:文、国、断、山等。这样输入“国”字,我们直接选择即可,所以输入“国”字按键0次,这样使用T9输入法总共只需要5次按键。
这就是T9智能输入法的优越之处。正因为T9输入法高效便捷的输入方式得到了众多手机厂商的采用,以至于T9成为了使用频率最高知名度最大的手机输入法。
在本实验中,我们实现的T9拼音输入法,没有真正的T9那么强大,我们这里仅实现输入部分,不支持词组联想。
55.2 硬件设计

  1. 例程功能
    开机的时候先检测字库,然后显示提示信息和绘制拼音输入表,之后进入等待输入状态。此时用户可以通过屏幕上的拼音输入表输入拼音数字串(通过DEL可以实现退格),然后程序自动检测与之对应的拼音和汉字,并显示在屏幕上(同时输出到串口)。如果有多个匹配的拼音,则通过KEY0进行选择。按键KEY1用于清除一次输入,按键WK_UP用于触摸屏校准。
    LED0闪烁用于提示程序正在运行。
  2. 硬件资源
    1)RGB灯
    RED :LED0 - PB4
    2)独立按键
    KEY0 – PA1
    KEY1 – PA15
    WK_UP – PA0
    3)串口1 (PA9/PA10连接在板载USB转串口芯片CH340上面)
    4)正点原子2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
    5)QSPI(PB2/PB6/PD11/PD12/PD13/PE2)
    6)norflash(QSPI FLASH芯片,连接在QSPI上)
    7)触摸屏(电阻式/电容式)
    55.3 程序设计
    55.3.1 程序流程图
    在这里插入图片描述

图55.3.1.1 T9拼音输入法实验程序流程图
55.3.2 程序解析

  1. T9INPUT代码
    这里我们只讲解核心代码,详细的源码请大家参考光盘本实验对应源码。T9INPUT驱动源码包括三个文件:pyinput.c、pyinput.h和pymb.h。
    首先我们先介绍一下定义在pymb.h中的拼音索引。先介绍一下汉字排列表,该表将汉字拼音所有可能的组合都列出来了,如下所示:
/* 汉字排列表 */
const uint8_t PY_mb_space []={""};
const uint8_t PY_mb_a     []={"啊阿腌吖锕厑嗄錒呵腌"};
const uint8_t PY_mb_ai    []={"爱埃挨哎唉哀皑癌蔼矮艾碍隘捱嗳嗌嫒瑷暧砹锿霭"};
…………此处省略N多个组合
const uint8_t PY_mb_zu    []={"足组卒族租祖诅阻俎菹镞"};
const uint8_t PY_mb_zuan  []={"钻攥纂缵躜"};
const uint8_t PY_mb_zui   []={"最罪嘴醉蕞觜"};
const uint8_t PY_mb_zun   []={"尊遵樽鳟撙"};
const uint8_t PY_mb_zuo   []={"左佐做作坐座昨撮唑柞阼琢嘬怍胙祚砟酢"};
这里我们只列出了部分组合,我们将这些组合称之为码表,然后将这些码表和其对应的数字串对应起来,组成一个拼音索引表,如下所示:
/* 拼音索引表 */
const py_index py_index3[]=
{
{"" ,"",(uint8_t*)PY_mb_space},
{"2","a",(uint8_t*)PY_mb_a},
{"3","e",(uint8_t*)PY_mb_e},
{"6","o",(uint8_t*)PY_mb_o},
{"24","ai",(uint8_t*)PY_mb_ai},
…………此处省略N多个组合
{"94664","zhong",(uint8_t*)PY_mb_zhong},
{"94824","zhuai",(uint8_t*)PY_mb_zhuai},
{"94826","zhuan",(uint8_t*)PY_mb_zhuan},
{"248264","chuang",(uint8_t*)PY_mb_chuang},
{"748264","shuang",(uint8_t*)PY_mb_shuang},
{"948264","zhuang",(uint8_t*)PY_mb_zhuang},
};
其中py_index是一个结构体,定义如下:
/* 拼音码表与拼音的对应表 */
typedef struct
{
  uint8_t *py_input;   	/* 输入的字符串 */
  uint8_t *py;          	/* 对应的拼音 */
  uint8_t *pymb;       	/* 码表 */
}py_index;

其中py_input,即与拼音对应的数字串,比如“94824”。py,即与py_input数字串对应的拼音,如果py_input = “94824”,那么py就是“zhuai”。最后pymb就是我们前面说到的码表。注意,一个数字串可以对应多个拼音,也可以对应多个码表。
有了这个拼音索引表(py_index3)之后,我们只需要将输入的数字串和py_index3索引表里面所有成员的py_input对比,将所有完全匹配的情况记录下来,用户要输入的汉字就被确定了,然后由用户选择可能的拼音组成(假设有多个匹配的项目),再选择对应的汉字,即完成一次汉字输入。
当然还可能是找遍了索引表,也没有发现一个完全符合要求的成员,那么我们会统计匹配数最多的情况,作为最佳结果,反馈给用户。比如,用户输入“323”,找不到完全匹配的情况,那么我们就将能和“32”匹配的结果返回给用户。这样,用户还是可以得到输入结果,同时还可以知道输入有问题,提示用户需要检查输入是否正确。
我们归纳一下一个完整的T9拼音输入步骤:
1)输入拼音数字串
我们用到的T9拼音输入法的核心思想就是对比用户输入的拼音数字串,所以必须先由用户输入拼音数字串。
2)在拼音索引表里面查找和输入字符串匹配的项,并记录
在得到用户输入的拼音数字串之后,在拼音索引表里面查找所有匹配的项目,如果有完全匹配的项目,就全部记录下来,如果没有完全匹配的项目,则记录匹配情况最好的一个项目。
3)显示匹配清单里面所有可能的文字,供用户选择
将匹配项目的拼音和对应的汉字显示出来,供用户选择。如果有多个匹配项(一个数字串对应多个拼音的情况),则用户还需要选择拼音。
4)用户选择匹配项,并选择对应的汉字
用户对匹配的拼音和汉字进行选择,选中其真正想输入的拼音和汉字,实现一次拼音输入。
下面介绍一下pyinput.c中比较核心的函数get_matched_pymb,代码如下:

/**
 * @brief       获取匹配的拼音码表
 * @param       strin     : 输入的字符串,形如:"726"
 * @param       matchlist : 输出的匹配表
 * @retval      匹配状态
 *              [7]  , 0,表示完全匹配;1,表示部分匹配(仅在没有完全匹配的时候才会出现)
 *              [6:0], 完全匹配的时候,表示完全匹配的拼音个数
 *                      部分匹配的时候,表示有效匹配的位数
 */
uint8_t get_matched_pymb(uint8_t *strin, py_index **matchlist)
{
    py_index *bestmatch = 0;    /* 最佳匹配 */
    uint16_t pyindex_len = 0;
    uint16_t i = 0;
    uint8_t temp, mcnt = 0, bmcnt = 0;
    
    bestmatch = (py_index *)&py_index3[0];  /* 默认为a的匹配 */
    pyindex_len = sizeof(py_index3) / sizeof(py_index3[0]); /*得到py索引表的大小*/

    for (i = 0; i < pyindex_len; i++)
    {
        temp = str_match(strin, (uint8_t *)py_index3[i].py_input);

        if (temp)
        {
            if (temp == 0XFF)
            {
                matchlist[mcnt++] = (py_index *)&py_index3[i];
            }
            else if (temp > bmcnt)  /* 找最佳匹配 */
            {
                bmcnt = temp;
                bestmatch = (py_index *)&py_index3[i];  /* 最好的匹配 */
            }
        }
    }

    if (mcnt == 0 && bmcnt)     /* 没有完全匹配的结果,但是有部分匹配的结果 */
    {
        matchlist[0] = bestmatch;
        mcnt = bmcnt | 0X80;    /* 返回部分匹配的有效位数 */
    }
    return mcnt;    /* 返回匹配的个数 */
}
该函数实现的是将用户输入拼音数字串同拼音索引表里面的各个项对比,找出匹配结果,并将完全匹配的项目存放在matchlist里面,同时记录匹配数。对于那些没有完全匹配的输入串,则查找与其最佳匹配的项目,并将匹配的长度返回。
其中该文件还有一个函数test_py,提供给usmart调用,实现串口测试,在串口测试的时候才能用到,如果不使用的话,可以去掉。本实验也是加入usmart控制,大家可以通过该函数实现串口调试拼音输入法。

其他两个函数比较简单,这里就不细说了。
前面提及的matchlist,其定义在pyinput.h中,代码如下:

/* 拼音输入法 */
typedef struct
{
   uint8_t(*getpymb)(uint8_t *instr);    	/* 字符串到码表获取函数 */
   py_index *pymb[MAX_MATCH_PYMB];       	/* 码表存放位置 */
}pyinput;

该结构体提供了两个成员,一个成员就是字符串到码表获取函数,另外一个成员也就是码表的存放位置。另外一个结构体py_index,已经在前面讲解了,这里就不作展开。
2. main.c代码
在main.c文件下,除了main函数之外,还有py_load_ui、py_key_staset、py_get_keynum和py_show_result函数。其中,py_load_ui函数是用于加载输入键盘,在LCD上显示我们输入拼音数字串的虚拟键盘。py_key_staset函数用于与设置虚拟键盘某个按键的状态(按下/松开)。py_get_keynum函数用于得到触摸屏当前按下的按键键值,通过该函数实现拼音数字串的获取。py_show_result函数用于显示输入串的匹配结果,并将结果打印到串口。这部分代码就不列出来了,大家可以自行理解。
下面看一下main主函数的代码:

int main(void)
{
    uint8_t i = 0;
    uint8_t result_num;
    uint8_t cur_index;
    uint8_t key;
    uint8_t inputstr[7];    	/* 最大输入6个字符+结束符 */
    uint8_t inputlen;       	/* 输入长度 */

    sys_cache_enable();                   	/* 打开L1-Cache */
    HAL_Init();                             	/* 初始化HAL库 */
    sys_stm32_clock_init(240, 2, 2, 4);	/* 设置时钟, 480Mhz */
    delay_init(480);                       	/* 延时初始化 */ 
    usart_init(115200);                   	/* 串口初始化为115200 */
    mpu_memory_protection();             	/* 保护相关存储区域 */
    led_init();                             	/* 初始化LED */
    lcd_init();                             	/* 初始化LCD */
    key_init();                             	/* 初始化按键 */
    tp_dev.init();                         	/* 初始化触摸屏 */
    my_mem_init(SRAMIN);                  	/* 初始化内部内存池(AXI) */
    my_mem_init(SRAM12);                  	/* 初始化SRAM12内存池(SRAM1+SRAM2) */
    my_mem_init(SRAM4);                   	/* 初始化SRAM4内存池(SRAM4) */
    my_mem_init(SRAMDTCM);               	/* 初始化DTCM内存池(DTCM) */
    my_mem_init(SRAMITCM);               	/* 初始化ITCM内存池(ITCM) */
    exfuns_init();                        	/* 为fatfs相关变量申请内存 */
    f_mount(fs[0], "0:", 1);            	/* 挂载SD卡 */
    f_mount(fs[1], "1:", 1);            	/* 挂载FLASH */

RESTART:
    while (fonts_init())     			/* 检查字库 */
    {
        lcd_show_string(60, 50, 200, 16, 16, "Font Error!", RED);
        delay_ms(200);
        lcd_fill(60, 50, 240, 66, WHITE);   /* 清除显示 */
        delay_ms(200);
    }

    text_show_string(30, 5, 200, 16, "正点原子STM32开发板", 16, 0, RED);
    text_show_string(30, 25, 200, 16, "拼音输入法实验", 16, 0, RED);
    text_show_string(30, 45, 200, 16, "ATOM@ALIENTEK", 16, 0, RED);
    text_show_string(30, 65, 200, 16, "KEY_UP:校准", 16, 0, RED);
    text_show_string(30, 85, 200, 16, "KEY0:翻页  KEY1:清除", 16, 0, RED);
    text_show_string(30, 105, 200, 16, "输入:        匹配:  ", 16, 0, RED);
    text_show_string(30, 125, 200, 16, "拼音:        当前:  ", 16, 0, RED);
    text_show_string(30, 145, 210, 32, "结果:", 16, 0, RED);

    /* 根据LCD分辨率设置按键大小 */
    if (lcddev.id == 0X5310)
    {
        kbdxsize = 86;    
        kbdysize = 43;
    }
    else if (lcddev.id == 0X5510)
    {
        kbdxsize = 140;
        kbdysize = 70;
    }
    else
    {
        kbdxsize = 60;
        kbdysize = 40;
    }

    py_load_ui(30, 195);
    my_mem_set(inputstr, 0, 7); /* 全部清零 */
    inputlen = 0;    /* 输入长度为0 */
    result_num = 0; /* 总匹配数清零 */
    cur_index = 0;

    while (1)
    {
        i++;
        delay_ms(10);
        key = py_get_keynum(30, 195);
        if (key)
        {
            if (key == 1)   /* 删除 */
            {
                if (inputlen)inputlen--;
                inputstr[inputlen] = '\0'; /* 添加结束符 */
            }
            else
            {
                inputstr[inputlen] = key + '0'; /* 输入字符 */
                if (inputlen < 7)inputlen++;
            }

            if (inputstr[0] != NULL)
            {
                key = t9.getpymb(inputstr); /* 得到匹配的结果数 */
                if (key)    /* 有部分匹配/完全匹配的结果 */
                {
                    result_num = key & 0X7F;    /* 总匹配结果 */
                    cur_index = 1;                /* 当前为第一个索引 */
                    if (key & 0X80)               /* 是部分匹配 */
                    {
                        inputlen = key & 0X7F;  /* 有效匹配位数 */
                        inputstr[inputlen] = '\0';  /* 不匹配的位数去掉 */
/* 重新获取完全匹配字符数 */
                        if (inputlen > 1)result_num = t9.getpymb(inputstr); 
                    }
                }
                else    /* 没有任何匹配 */
                {
                    inputlen--;
                    inputstr[inputlen] = '\0';
                }
            }
            else
            {
                cur_index = 0;
                result_num = 0;
            }
/* 清除之前的显示 */
            lcd_fill(30 + 40, 105, 30 + 40 + 48, 110 + 16, WHITE); 
            /* 显示匹配的结果数 */
            lcd_show_num(30 + 144, 105, result_num, 1, 16, BLUE); 
            text_show_string(30 + 40, 105, 200, 16, (char *)inputstr, 
16, 0, BLUE); /* 显示有效的数字串 */
            py_show_result(cur_index);     /* 显示第cur_index的匹配结果 */
        }
        key = key_scan(0);
        if (key == WKUP_PRES && tp_dev.touchtype == 0)  /* WKUP按下,且是电阻屏 */
        {
            tp_dev.adjust();
            lcd_clear(WHITE);
            goto RESTART;
        }
        if (result_num) /* 存在匹配的结果 */
        {
            switch (key)
            {
                case KEY0_PRES: /* 下翻 */
                    if (cur_index < result_num)cur_index++;
                    else cur_index = 1;

                    py_show_result(cur_index);  /* 显示第cur_index的匹配结果 */
                    break;

                case KEY1_PRES: /* 清除输入 */
/* 清除之前的显示 */
                    lcd_fill(30 + 40, 145, lcddev.width - 1, 145 + 48, WHITE);  
                    goto RESTART;
            }
        }
        if (i == 30)
        {
            i = 0;
            LED0_TOGGLE();
        }
    }
}

在main函数里,实现了我们在55.2.1小节所说的功能,也是按照它表述的逻辑进行实现。在这里我们并没有实现汉字选择功能,但是由本例程作为基础,再实现汉字选择功能就比较简单了,大家自行实现即可。注意:kbdxsize和kbdysize代表虚拟键盘按键宽度和高度,程序根据LCD分辨率不同而自动设置这两个参数,以达到较好的输入效果。
55.4 下载验证
将程序下载到开发板后,可以看到LED0不停的闪烁,提示程序已经在运行了。LCD显示的内容如图55.4.1所示:
在这里插入图片描述

图55.4.1 汉字输入法界面图
此时,我们在虚拟键盘上输入拼音数字串,即可实现拼音输入,如图55.4.2所示:
在这里插入图片描述

图55.4.2 实现拼音输入
如果发现输入错误了,可以通过屏幕上的DEL按键,来退格。如果有多个匹配的情况(匹配值大于1),则可以通过KEY0来选择拼音。通过按下KEY1,可以清除当前输入;通过按下KEY_UP,可以实现触摸屏校准(仅限电阻屏,电容屏无需校准)。
本章,我们还可以借助USMART调用test_py来实现输入法调试,如图55.4.3所示:
在这里插入图片描述

图55.4.2 USMART测试T9拼音输入法图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1361.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

deepwalknode2vec 代码实战

提示&#xff1a;笔记内容来自于B站up主同济子豪兄 文章目录1. Embedding嵌入的艺术2. deepwalk2.1. 什么是图嵌入&#xff1f;2.2. deepwalk的步骤1、生成graph&#xff1b;2、利用random walk生成多个路径&#xff1b;3、训练表示向量的学习&#xff1b;4、为了解决分类个数过…

航拍遥感数据集

一、Roundabout Aerial Images for Vehicle Detection 本数据集是从无人机拍摄的西班牙环形交叉口航空图像数据集&#xff0c;使用PASCAL VOC XML文件进行注释&#xff0c;指出车辆在其中的位置。此外&#xff0c;还附带一个CSV文件&#xff0c;其中包含与捕获的环形交叉口的位…

深度学习 神经网络(2)前向传播

深度学习 神经网络&#xff08;2&#xff09;前向传播一、前言二、神经网络结构三、前向传播四、参考资料一、前言 前面介绍了《感知器》&#xff0c;类似于单个神经元细胞&#xff0c;现在我们用多个感知器组合成更加复杂的神经网络。本文介绍了多层神经网络通过前向传播方法…

超市营业额数据分析

文章目录1&#xff1a;查看单日交易额最小的3天的交易数据&#xff0c;并查看这3天是周几1.1&#xff1a;导入模块1.2&#xff1a;数据处理1.3&#xff1a;输出结果完整代码2&#xff1a;把所有员工的工号前面增加一位数字&#xff0c;增加的数字和原工号最后一位相同&#xff…

FBAR滤波器的工作原理及制备方法

近年来&#xff0c;随着无线通信技术朝着高频率和高速度方向迅猛发展&#xff0c;以及电子元器件朝着微型化和低功耗的方向发展&#xff0c;基于薄膜体声波谐振器&#xff08;Film Bulk Acoustic Resonator&#xff0c;FBAR&#xff09;的滤波器的研究与开发越来越受到人们的关…

酒楼拓客营销流程,酒楼宣传推广方案

随著网络时代的发展&#xff0c;许多行业受到了大大的冲击&#xff0c;其中也涵盖酒楼&#xff0c;在目前的情况下&#xff0c;对于酒楼来说&#xff0c;无论是互联网还是线下&#xff0c;引流都是最重要的。那么酒楼如何做好营销推广工作&#xff0c;从而提升业绩&#xff1f;…

乘风而起!企业级应用软件市场迅猛发展,有哪些机会可以把握?

数字化转型战略的深入&#xff0c;使我国企业级软件市场得到了迅速的发展&#xff0c;据统计&#xff0c;2021年我国企业级应用软件市场规模超过了600亿元&#xff0c;其中商业智能&#xff08;BI&#xff09;市场规模超过了50亿元。 得益于中国企业对于数据系统的本地化部署需…

Hadoop3 - MapReduce DB 操作

一、MapReduce DB 操作 对于本专栏的前面几篇文章的操作&#xff0c;基本都是读取本地或 HDFS 中的文件&#xff0c;如果有的数据是存在 DB 中的我们要怎么处理呢&#xff1f; Hadoop 为我们提供了 DBInputFormat 和 DBOutputFormat 两个类。顾名思义 DBInputFormat 负责从数…

MODBUS通信浮点数存储解析常用算法

MODBUS通信相关的基础知识,各种PLC通信程序的写法。可以参看专栏的其它文章这里不赘述。MODBUS通信时,数据帧都是以字节为单位发送和接收的,接收到的字节,如何存放和解析。就需要我们具备数据处理类的知识了,这里需要大家简单了解下有关数据结构的基础知识,这方面比较薄弱…

AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

文章目录前言一、树状数组1.1、树状数组知识点1.2、树状数组代码模板模板题&#xff1a;AcWing 1264. 动态求连续区间和例题例题1、AcWing 1265. 数星星【中等&#xff0c;信息学奥赛一本通】习题习题1&#xff1a;1215. 小朋友排队【中等&#xff0c;蓝桥杯】二、 线段树知识点…

27.5 Java集合之Set学习(基本概念,存储原理,性能测试)

文章目录1.Set接口1.1 Set的特性是什么&#xff1f;2.具体实现2.1 HashSet2.1.1 存储原理2.1.2 性能测试2.2 TreeSet2.2.1 存储原理2.2.2 性能测试2.3 EnumSet&#xff08;了解即可&#xff09;2.3.1 存储原理2.4 LinkedHashSet2.4.1 存储原理2.4.2 性能测试2.4.3 代码地址1.Se…

【Gitee】上传本地项目到 Gitee 仓库(入门篇)

本文主要介绍上传本地项目到 Gitee 仓库的过程&#xff0c;可以说是一个比较傻瓜的教材吧&#xff0c;从0开始&#xff0c;祝大家都能一次成功~~~ 一、前期准备 1. 配置 Gitte 创建 Gitte 账号&#xff0c;绑定好邮箱&#xff0c;并创建一个空仓库 。创建账号绑定邮箱过程这部…

【信号检测】基于小波变换的信号趋势检测和分离研究附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

双十一好物推荐:2022年好用的数码好物分享

一年一度的双十一尽在眼前&#xff0c;因为双十一的优惠力度是一年中最大的一次&#xff0c;所以许多人都想着直接一年屯一次&#xff0c;一次屯一年的理念&#xff0c;那么作为资深剁手党的我来说&#xff0c;对比于选购双十一好物来说我还是比较有心得的&#xff0c;下面让我…

机器视觉之工业摄像机知识点(一)

本文主要记录一些基础的工业摄像机的一些简要知识点。我也是根据我觉得比较重要的来记录。作为一位算法工程师&#xff0c;其实是有两条路来走&#xff0c;即技术专家以及技术经理。这两个实际是不同的职业方向。如果你不擅于与外部沟通交流&#xff0c;并且具备非常强的科研和…

基于OpenHarmony的ArkUI框架进阶对于高性能容器类和持久化和原子化的运用

文章目录高性能容器类Badge原子化服务代码简析表达式持久化高性能容器类 顾名思义&#xff0c;容器类是一个存储类&#xff0c;用于存储各种数据类型的元素&#xff0c;并提供一系列处理数据元素的方法。ArkUI开发框架提供了两种类型的容器类&#xff0c;线性和非线性。这些容…

【机器学习】求矩阵的-1/2次方的方法

目录 一、背景描述 二、D^(-1/2)的理论基础 三、代码实现 四、总结 一、背景描述 今天在看如下论文的时候&#xff1a; 态势感知图卷积网络在电力系统连锁故障中的应用-机器学习文档类资源-CSDN文库https://download.csdn.net/download/mzy20010420/86745616?spm1001.20…

Rust之常用集合(一):向量(vector)

开发环境 Windows 10Rust 1.64.0VS Code 1.72.2 项目工程 这里继续沿用上次工程rust-demo 常用集合 Rust的标准库包括许多非常有用的数据结构&#xff0c;称为集合。大多数其他数据类型表示一个特定的值&#xff0c;但是集合可以包含多个值。与内置数组和元组类型不同&…

2022年数维杯数学建模A题银行效率评价与破产成因分析求解全过程文档及程序

2022年数维杯数学建模 A题 银行效率评价与破产成因分析 原题再现&#xff1a; 银行在国家经济社会发展过程中扮演者重要的决策&#xff0c;银行的破产会对企业和个人造成众多不利的影响。相比国内的银行&#xff0c;国际银行的倒闭频次更高&#xff0c;因此国际银行倒闭原因的…

一小时教你轻松学会使用Java 整合 Easy Excel 操作 Excel 文件

文章目录一、Apache POI简介二、POI操作Excel构建maven项目导入依赖使用POI实现基本写操作使用POI实现大数据量写操作使用POI实现基本读操作使用POI读取不同类型的数据三、Easy Excel简介构建maven项目导入依赖实现写操作实现读操作目前市面上比较流行的操作Excel 文件工具大致…