Visual Studio 2010+C#实现信源和信息熵

news2024/11/15 17:58:56

1. 设计要求

以图形界面的方式设计一套程序,该程序可以实现以下功能:

  1. 从输入框输入单个或多个概率,然后使用者可以通过相关按钮的点击求解相应的对数,自信息以及信息熵
  2. 程序要能够实现马尔可夫信源转移概率矩阵的输入并且可以计算该马尔可夫信源在每一个状态下每输出一个符号的平均信息量,稳态概率以及最后的信息熵。
  3. 结果在在界面中直接呈现

2. 设计过程

首先进行图形界面的设计,根据要求界面中应该包括相关标签,输入,输出以及对应按钮,单行少量输入可以采用普通TextBox控件,多行输入可以采用RichTextBox控件,输出要有对应的标签,为了美观,将输出控件原始标签删除修改为空白,只有输出值才会出现

本实验总体界面设计如图一所示:

图1 设计图形界面

接下来对于点击不同按钮产生的事件进行设计:

由于对数值以及自信息设计过程相对简单,以下着重介绍信息熵以及马尔可夫信源设计过程。

 查看信息熵按钮代码实现:

 private void button5_Click(object sender, EventArgs e)
        {
            string[] a = new string[richTextBox1.Lines.Length];//定义数组,设定空间大小为输入框的行数
            double[] px = new double[richTextBox1.Lines.Length];
            double[] y = new double[richTextBox1.Lines.Length];
            double z = 0;
            for (int i = 0; i < richTextBox1.Lines.Length; i++)
            {
                a[i] = richTextBox1.Lines[i];//获取每一行的值,存入数组a中
                px[i] = Convert.ToDouble(a[i]);//将字符串转换为可计算的double类型
                y[i] = Math.Log(1 / px[i], 2);
                z = z + px[i] * y[i];//计算信息熵
            }
            label8.Text = Convert.ToString(Math.Round(z, 2));//结果转换成字符串形式再输出
        }

在相关按钮中输入上述所示代码即可实现信息熵的计算

在设计马尔可夫信源时,考虑到其概率矩阵更便于观察,所以需要通过输入概率矩阵然后提取相关的概率来进行计算。

要想求信源熵,我们得知道稳态概率值以及在si状态下每输出一个符号的平均信息量,最后对状态取统计平均后得到信源每输出一个符号的信息量,即马尔可夫信源的熵。

对于H(X|si)的值可以直接通过计算得到,求法如下:

 private void button6_Click(object sender, EventArgs e)
        {
            int a = richTextBox2.Lines.Length;
            double[,] p = new double[a, a];
            char[] sp = new char[3] { ' ', '\t', '\n' };
            string[] str1 = new string[100];
            str1 = richTextBox2.Text.Split(sp);
            label10.Text = "";
            for (int i = 0; i < a; i++)
            {
                double h = 0;
                for (int j = 0; j < a; j++)
                {
                    p[i, j] = Convert.ToDouble(str1[i * a + j]);
                    if (p[i, j] == 0)
                    {
                        p[i, j] = 1;
                    }
                    h = h + p[i, j] * Math.Log(1 / p[i, j], 2);
                }
                label10.Text += Convert.ToString(Math.Round(h, 3)) + '\n';
            }
        }

对于稳态概率的值无法直接进行计算得到,因为需要解方程,我对此采用的方法为高斯列选主元消元迭代求解。

首先将概率矩阵进行转置,然后每一行都可以列方程,为使求解更加简便,将方程移项,等式左边为未知数,右边为一个常数,例如初始概率矩阵第一列为0.1 0.5 0 这三个数,转置后可列方程组W1=0.1*W1+0.5*W2+0*W3,移相后为-0.9*W1+0.5*W2+0*W3=0,而在数组中即为[-0.9 0.5 0 0],而对于已知方程概率和W1+W2+W3=1在数组中形式为[1 1 1 1]。

处理后代码如下:

//以下a为处理后的矩阵,b为每一行方程等式右边的常数值
            double[] b = new double[n];
            for (int i = 0; i < n; i++)
            {
                b[i] = a[i, n];//将最后一列(方程右边常数值)存入数组b中

            }
            for (int k = 0; k < n - 1; k++)
            {
                //找每一列主元,最开始我们选k行k列的为最大
                max = Math.Abs(a[k, k]);//最大元值
                maxp = k;//最大元列的下标
                for (int p = k + 1; p < n; p++)
                {
                    if (Math.Abs(a[p, k]) > max)
                    {
                        max = Math.Abs(a[p, k]);
                        maxp = p;
                    }
                }
                if (maxp != k)
                {
                    //需要交换两行
                    double[] tmp = new double[n];
                    for (int i = 0; i < n; i++)
                    {
                        tmp[i] = a[maxp, i];
                        a[maxp, i] = a[k, i];
                        a[k, i] = tmp[i];
                    }
                    double tmpp;
                    tmpp = b[k];
                    b[k] = b[maxp];
                    b[maxp] = tmpp;
                }
                for (int i = k + 1; i < n; i++)
                {
                    for (int j = k + 1; j < n; j++)
                    {
                        a[i, j] -= a[k, j] * a[i, k] / a[k, k];
                    }
                    b[i] -= b[k] * a[i, k] / a[k, k];
                }
            }
            x[n - 1] = b[n - 1] / a[n - 1, n - 1];
            for (int k = n - 2; k > -1; k--)
            {
                double sum1 = 0;
                for (int j = k + 1; j < n; j++)
                {
                    sum1 += a[k, j] * x[j];
                }
                x[k] = b[k] - sum1;
                x[k] /= a[k, k];
            }
            //x即为方程的解
           

至此,求解信源熵的两大关键部分都已经实现,最后直接计算即可完成。

四、实验测试

图2 总体测试

从图2中可以看出:

在输入姓名后点击登录按钮将会显示欢迎,在输入概率后可以点击按钮查看它的对数或者自信息量,也可以输入多个概率并且求取信息熵,这些通过验证,结果均为正确。对于马尔可夫信源的测试,我使用的是课本上例

图3 例子

将图2中所求结果与图3中结果对比后可以看出结果正确,可以与例题中的结果一一对应上

改变数据继续验证:

图4

图5

通过图4,图5的多次验证,可以保证其与手动计算结果基本保持一致,误差可以忽略不计,实验成功。

3. 总结

按照模块分别进行设计难度不大,但是在最后实现马尔可夫信源时需要使用C#对矩阵进行处理以及运算,需要大家掌握一定的数学知识,本文的思想就是利用求解线性方程的相关算法以及高斯迭代求解方程的方法去实现。完整项目后续会上传至资源中

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

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

相关文章

计算机网络-差错控制(纠错编码 海明码 纠错方法)

文章目录 纠错编码-海明码海明距离1.确定校验码位数r2.确定校验码和数据的位置3.求出校验码的值4.检错并纠错纠错方法1纠错方法2 小结 纠错编码-海明码 奇偶校验码&#xff1a;只能发现错误不能找到错误位置和纠正错误 海明距离 如果找到码距为1&#xff0c;那肯定为1了&…

鸿蒙开发-UI-组件导航-Tabs

鸿蒙开发-UI-组件 鸿蒙开发-UI-组件2 鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 文章目录 一、基本概念 二、导航 1.底部导航 2.顶部导航 3.侧边导航 4.导航栏限制滑动 三、导航栏 1.固定导航栏 2.滚动导航栏 3…

莉莉与神奇花朵的冒险

现在&#xff0c;我将根据这些步骤编写一个对话形式的童话故事。 在很久很久以前的一个小村庄里&#xff0c;有一个勤劳善良的小女孩叫莉莉。她住在一间小茅屋里&#xff0c;和她的奶奶一起生活。奶奶年纪大了&#xff0c;行动不便&#xff0c;所以莉莉每天都要照顾她。 一天&a…

【多模态大模型】跨越视觉-语言界限:BLIP的多任务精细处理策略

BLIP 核心思想MED架构和CapFilt方法效果 总结CLIP模型 VS BLIP模型CLIP模型BLIP模型 核心思想 论文&#xff1a;https://proceedings.mlr.press/v162/li22n/li22n.pdf 代码&#xff1a;https://github.com/salesforce/BLIP BLIP&#xff08;Bootstrapping Language-Image Pre…

win11安装MySql5.7

1、下载 打开下载链接&#xff1a;MySQL :: Download MySQL Installer 2、安装 2.1、安装界面 2.2、选择自定义安装 2.3、根据自己系统的位数进行选择是X64还是X86 2.4、选择安装路径 2.5、继续下一步 2.6、选择服务器专用&#xff0c;端口是3306 2.7、设置密码 2.8、设置服…

python函数入参、类成员引用支持灵活参数可配

一、背景 python编码时&#xff0c;有可能在不同场景下输入修改的参数&#xff0c;不方便直接写死&#xff0c;因此需要灵活配置这些函数入参&#xff0c;类成员 二、函数入参支持灵活可配 场景&#xff1a;如下场景&#xff0c;对于hello函数&#xff0c;不同场景下想要对不…

async/await使用过程中,要注意的问题

问: const getData async () >{ console.log(触发了getData接口) let resultData await getActivityInfo(activityId); console.log(resultData,resultData) let id resultData.id; let shareImg resultData.shareImg let shareSubtitle resultData.shareSubtit…

T-Sql 也能更新修改查询JSON?

今天看见一个澳洲项目里面使用了 JSON_VALUE 这样的函数解析 JSON 我倍感诧异&#xff0c;我印象当中Sql Server并不支持JOSN的相关操作&#xff0c;他最多只把JSON当成一个字符串来存储&#xff0c;更不要说去解析&#xff0c;查询和更新了 我随后查询了下此函数&#xff0c;…

美颜SDK是什么?探秘直播美颜SDK在视频社交平台中的应用

当今&#xff0c;美颜SDK正扮演着改变用户体验的“角色”&#xff0c;本篇文章&#xff0c;小编将为大家讲述美颜SDK的概念、原理以及在视频社交平台中的广泛应用。 一、什么是美颜SDK&#xff1f; 美颜SDK是一套软件工具包&#xff0c;提供了一系列美颜算法和功能&#xff…

基础面试题整理6之Redis

1.Redis的应用场景 Redis支持类型&#xff1a;String、hash、set、zset、list String类型 hash类型 set类型 zset类型 list类型 一般用作缓存&#xff0c;例如 如何同时操作同一功能 2.redis是单线程 Redis服务端(数据操作)是单线程&#xff0c;所以Redis是并发安全的,因…

页面模块向上渐变显示效果实现

ps: 先祝各位朋友新春快乐 ^o^/ 想要首页不那么枯燥无味吗&#xff1f;还在未首页过于单调而苦恼吧&#xff0c;来试试这个吧&#xff08;大佬请忽略上述语句o&#xff09; 今天要实现一个页面线上渐变显示的效果&#xff0c;用来丰富首页等页面&#xff1a; 这里先随机建立几…

哈希加密Python实现

一、代码 from cryptography.fernet import Fernet import os import bcrypt# 密钥管理和对称加密相关 def save_key_to_file(key: bytes, key_path: str):with open(key_path, wb) as file:file.write(key)def load_key_from_file(key_path: str) -> bytes:if not os.path…

linux服务器如何提高游戏帧率?

在Linux服务器上&#xff0c;由于硬件配置和系统的限制&#xff0c;提高游戏帧率变得更加困难。但是通过一些优化和调整&#xff0c;我们仍然可以提升Linux服务器上的游戏性能。 首先我们需要了解游戏帧率与服务器性能之间的关系。游戏帧率是指游戏每秒渲染的帧数&#xff0c;…

零基础学编程从哪里入手,在学习中可以线上会议答疑解惑

一、前言 零基础学编程可以先从容易学的语言入手&#xff0c;比如中文编程&#xff0c;然后再学其他编程语言则会比较轻松&#xff0c;初步掌握编程思路。很多IT人士一般学2到3种编程语言。 今天给大家分享的中文编程开发语言工具资料如下&#xff1a; 编程入门视频教程链接…

网络防御安全:2-6天笔记

第二章&#xff1a;防火墙 一、什么是防火墙 防火墙的主要职责在于&#xff1a;控制和防护。 防火墙可以根据安全策略来抓取流量之后做出对应的动作。 二、防火墙的发展 区域&#xff1a; Trust 区域&#xff0c;该区域内网络的受信任程度高&#xff0c;通常用来定义内部…

【cmu15445c++入门】(6)c++的迭代器

一、迭代器 C 迭代器是指向容器内元素的对象。它们可用于循环访问该容器的对象。我们知道迭代器的一个示例是指针。指针可用于循环访问 C 样式数组. 二、代码 自己实现一个迭代器 // C iterators are objects that point to an element inside a container. // They can be…

光学PCIe 6.0技术引领AI时代超大规模集群

随着云计算、大数据和人工智能技术的快速发展&#xff0c;超大规模数据中心正经历一场前所未有的变革。传统的集中式架构逐渐转变为解聚式&#xff08;disaggregated&#xff09;架构&#xff0c;这种架构将计算、存储和网络资源从单一的物理服务器中分离出来&#xff0c;形成独…

CSS实践调研,行业流行的CSS代码风格

案例1 Taro中的组件 以下为ScrollView组件的样式&#xff08;更新时间为2024年1月&#xff09;&#xff1a; taro的 image组件&#xff08;更新时间为3年前&#xff09;&#xff1a; 案例2&#xff1a; vantui 的Button组件 案例3&#xff1a;elementui的slider组件 案例4…

十分钟GIS——geoserver+postgis+udig从零开始发布地图服务

1数据库部署 1.1PostgreSql安装 下载到安装文件后&#xff08;postgresql-9.2.19-1-windows-x64.exe&#xff09;&#xff0c;双击安装。 指定安装目录&#xff0c;如下图所示 指定数据库文件存放目录位置&#xff0c;如下图所示 指定数据库访问管理员密码&#xff0c;如下图所…

泛型、Trait 和生命周期(上)

目录 1、提取函数来减少重复 2、在函数定义中使用泛型 3、结构体定义中的泛型 4、枚举定义中的泛型 5、方法定义中的泛型 6、泛型代码的性能 每一门编程语言都有高效处理重复概念的工具。在 Rust 中其工具之一就是 泛型&#xff08;generics&#xff09;。泛型是具体类型…