哥花了一点小小时间写的,望各位不吝赐教!

//===============================================
//made by : 何盛昌
//number  : 496592219

//===============================================
#include <stdlib.h>
#include <iostream.h>
#include <math.h>

void main()
{
//===============================================
//确定输入及输出符号的个数
//因为一般先验概率是取等概率,所以为1/num_in
//===============================================
 int num_in,num_out;
 int i,j;
 cout<<"输入符号的个数为:"<<endl;
 cin>>num_in;
 cout<<"输出符号的个数为:"<<endl;
 cin>>num_out;
 cout<<"输入概率为:"<<endl;
 float *P_in;
 P_in=new float[num_in];   //输入的符号的概率
 float *P_out;
 P_out=new float[num_out];  //输出的符号的概率
 for (i=0;i<num_in;i++)
 {
  P_in[i]=1.0/(float)num_in;
  cout<<P_in[i]<<" ";
 }
 cout<<endl;
//================================================
//再输入信道转移概率矩阵
//注意进行判断,某行如果总概率大于1,则出现错误应从新输入
//================================================
 cout<<"输入转移概率:"<<endl;
 float **p_ji;                   //转移条件概率
 p_ji=new float *[num_in];
 for (i=0;i<num_in;i++)
 {
  p_ji[i]=new float[num_out];
 }
 
 for (i=0;i<num_in;i++)
 {
  for (j=0;j<num_out;j++)
  {
   cin>>p_ji[i][j];
  }
 }
 for (i=0;i<num_in;i++)
 {
  float validate=0.0;
  for (j=0;j<num_out;j++)
  {
   validate+=p_ji[i][j];
  }
  if (validate>1.000001||validate<0.999999)
  {
   cout<<"输入数据有误,请检查后再次输入。"<<endl;
   exit(-1);
  }
 }
 
 float **p_ij;     //反条件概率
 p_ij=new float *[num_in];
 for (i=0;i<num_in;i++)
 {
  p_ij[i]=new float[num_out];
 }
 float C_Pre,C;     //当前信道容量和前一次循环信道容量
 C=10.0;
 double Pe=0.000001;     //两次信道容量相差的阈值
 int r=0;      //迭代次数
 float *p_up;     //计算第r+1次循环输入分布p_in分子
 p_up=new float[num_in];
 float p_down;     //计算第r+1次循环输入分布p_in分母
 do
 {
  r++;
//================================================
//求第r次循环反条件概率p_ij
//================================================
  for (j=0;j<num_out;j++)
  {
   P_out[j]=0.0;
   for (i=0;i<num_in;i++)
   {
    P_out[j]+=p_ji[i][j]*P_in[i];     //
   }
   if (P_out[j]>=0.000001)
   {
    for (i=0;i<num_in;i++)
    {
     p_ij[i][j]=P_in[i]*p_ji[i][j]/P_out[j];
    }
   }
   else
   {
    for (i=0;i<num_in;i++)
    {
     p_ij[i][j]=0.0;
    }
   }
  }
//================================================
//求第r+1次循环输入分布p_in
//================================================
  p_down=0.0;
  for (i=0;i<num_in;i++)
  {
   p_up[i]=0.0;
   for (j=0;j<num_out;j++)
   {
    if (p_ij[i][j]>=0.000001)
    {
     p_up[i]+=p_ji[i][j]*log(p_ij[i][j])/log(2.0);
    }
   }
   p_up[i]=pow(2.0,p_up[i]);
   p_down+=p_up[i];
  }
  for (i=0;i<num_in;i++)
  {
   P_in[i]=p_up[i]/p_down;
  }
//================================================
//求C(r+1)
//================================================
  C_Pre=C;
  C=log(p_down)/log(2.0);
  cout<<"第"<<r<<"次的容量为:"<<C<<endl;
 }
 while (fabs(C-C_Pre)/C>Pe);
 cout<<"迭代的次数为:"<<r<<endl;
}

离散信道容量迭代算法相关推荐

  1. dmc matlab程序,DMC信道容量迭代算法(Matalab实现)

    一些公式没法粘贴,以后再补上 一.用了matlab实现DMC容量迭代的算法如下: 设信道输入和输出符号集大小分别为r,s. 1.初始化信源分布:这里选deta=0.000001. 2.. 3. . 4 ...

  2. [信息论]信道容量迭代算法程序设计(基于C++Matlab实现)

    算法分析 迭代法计算信道容量 CCC 的步骤如下: 首先,记 p(yj∣xi)=pijp(y_j|x_i) = p_{ij}p(yj​∣xi​)=pij​ , p(xi)=pip(x_i)=p_ip( ...

  3. 一般信道容量迭代算法c语言,离散信道容量的迭代算法

    摘要: Introducing an notion of information-capacity-distance, this paper gives a increment for- mula o ...

  4. 离散蚁群算法实例(求解旅行商问题)

    蚁群算法 蚁群算法原理 万字长文带你了解蚁群算法及求解复杂约束问题[源码实现] 上面这篇博文的蚁群算法是实数编码.今天讲解下离散编码的蚁群算法.      算法原理不再解释,直接上算例. 旅行商问题 ...

  5. 自动化仓库订单调度的改进型离散帝国主义竞争算法

    原文 Improved discrete imperialist competition algorithm for order scheduling of automated warehouses发 ...

  6. 差分进化算法 (differential evolution,DE)与离散差分进化算法(discrete DE, DDE)

    目录 概述 初始化 变异操作 交叉操作 选择操作 参数分析 优点 缺点 离散差分进化算法 概述 差分进化算法是一种用于解决全局优化问题的随机搜索算法.与遗传算法. 粒子群优化算法.蚁群算法.人工蜂群算 ...

  7. 统计学习方法第二十一章作业:PageRank迭代算法、幂法、代数算法 代码实现

    PageRank迭代算法.幂法.代数算法 import numpy as npclass PageRank:def __init__(self,M,D=0.85):self.M = np.array( ...

  8. 递归算法和迭代算法_Java中没有递归的二进制搜索–迭代算法

    递归算法和迭代算法 这周的任务是用Java实现二进制搜索 ,您需要编写迭代和递归二进制搜索算法 . 在计算机科学中,二进制搜索或半间隔搜索是一种分而治之的算法,用于在排序数组中定位项目的位置. 二进制 ...

  9. BCH码和m序列参数估计(梅西迭代算法求多项式的MATLAB实现)

    关注公众号[逆向通信猿]试读更多内容!!! 伯利坎普迭代算法解决了BCH码译码中求错位多项式 σ ( x ) \sigma (x) σ(x)的问题,即用迭代算法求解方程组,极大地加快了译码速度.求最短 ...

最新文章

  1. Java小程序—录屏小程序(上半场)
  2. 十月cms_微软十月更新失败使整个PC行业陷入困境
  3. leetcode404. 左叶子之和
  4. AtCoder Beginner Contest 176总结
  5. 探索比特币源码8-哈希2
  6. (pytorch-深度学习系列)pytorch构造深度学习模型-学习笔记
  7. nanshan 钥匙在您那儿的
  8. java 静态方法_自学JAVA每日记录(11)-欢迎指点欢迎共勉
  9. Codeforces Education Round 11
  10. 使用A4纸张黑白打印双面打印多少钱一张
  11. easychm生成帮助文件时出现的目录导航乱码问题
  12. 68个Python内置函数详解,进阶必备!
  13. 单片机PWM舵机控制原理
  14. Android应用 开机自启动
  15. 配置Jinjia2模板引擎
  16. 七年级上计算机课教学记录,【备课参考】(川教版)七年级信息技术上册第9课《计算机操作系统》教学设计...
  17. React Firebase 计账软件 Serverless 项目实战视频教程
  18. ElementUI表格吸顶(sticky)
  19. Unity Input 通过蓝牙手柄控制游戏
  20. window8 添加美式键盘

热门文章

  1. 美国华盛顿州立大学计算机排名,华盛顿州立大学计算机科学computer science专业排名第251~300名(2020THE泰晤士高等教育世界大学排名)...
  2. 通过2-3-4树理解红黑树
  3. cst matlab,CST与Matlab连接设置
  4. KDD 2022时空数据挖掘领域论文汇总
  5. RESTFUL概念,什么是RESTFUL
  6. 【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系
  7. M-LAG—跨设备链路聚合组
  8. PathInfo模式的支持
  9. ElasticSearch实现搜索和关键字高亮显示
  10. lumaQQ移植到Android之消息篇