精华内容
下载资源
问答
  • 信道容量迭代算法

    千次阅读 2020-04-19 19:33:08
    这次的实验对我来说真是太艰难了,一部分因为对信道容量的计算方式本身就不熟,一部分原因是不太看得懂算法流程的意思,另一部分原因就是对MATLAB的矩阵运用不熟练。网上找的代码很多,但是没有什么解析,而且有的太...

    啦啦啦啦,开始菜鸟的第一篇博客。
    这次的实验对我来说真是太艰难了,一部分因为对信道容量的计算方式本身就不熟,一部分原因是不太看得懂算法流程的意思,另一部分原因就是对MATLAB的矩阵运用不熟练。网上找的代码很多,但是没有什么解析,而且有的太繁琐,有的错误比较多。
    信道容量和输入概率分布与信道转移概率有关,本次实验转移概率固定,是要求最佳输入概率分布。求信道容量就是求平均互信息量的最大值。在循环过程中,输入概率分布和信道容量不断迭代。其实至于数学表达式如何转化为算法步骤的,我看了半天还不是很清楚,可能复习完一遍线性代数概率论以后,回过头来看,我能明白点吧。
    那就先尝试把复杂公式用程序实现,直接根据算法步骤转化MATLAB代码:在这里插入图片描述
    一开始看到这些奇怪的式子我真的是头大,\sum {},i,j 这个求和那个求和,MATLAB这列乘以那列乱七八糟都理不出头绪。
    下面是我的代码和一些详细的注释。

    clc;clear;
    %检验矩阵
    %[0.98 0.02;0.05 0.95][0.6 0.4;0.05 0.95][0.8 0.15 0.05;0.05 0.15 0.8]
    %[0.99 0.01 0;0.005 0.99 0.005;0 0.01 0.99]
    Pij=input('请输入信道转移矩阵P')
    [r,s]=size(Pij);%r为信源数 s为信道数
    disp('原始信源分布:');
    Pi=repmat(1/r,1,r);%产生信源Pi
    disp(Pi)
    offset=0.00000001;%误差
    C(1)=-100000;%相当于无穷小
    for k=2:10000
        %计算fai
        %无论j是几,转移矩阵的每一行都要×对应的输入概率,故将输入概率扩展为ij型矩阵后进行点乘
       Pi_copy=repmat(Pi',1,s);
       faizi=Pij.*Pi_copy;
       faimu=sum(faizi,1);%求和为i 则对结果的一列求和
       faimu_copy=repmat(faimu,r,1);%因为每一列除的值都是一样的
       fai=faizi./(faimu_copy);
       
       %计算新信源Pi
       Pizi=exp(sum(Pij.*log(fai+eps),2));%对j求和 行相加 转移概率为0 会出现NaN的数据,要进行特殊处理
       Pimu=sum(Pizi,1);%Pimu经过了两次求和 变成了标量数字
       Pi=Pizi/(Pimu);
       Pi=Pi'%方便下次迭代
       
       %计算信道容量
       C(k)=log(Pimu)/log(2);%注意信道容量以2为底
       if (C(k)-C(k-1))/C(k)<offset
           break;
       end;
    end
    disp('迭代次数:k='),disp(k-1)
    disp('最大信道容量时的信源分布:p='),disp(Pi)
    disp('最大信道容量:C='),disp(C(k))
    
    

    这是运行结果:
    在这里插入图片描述
    遇到的问题:前三组数据通过检验,最后一组出错,并且出现NaN。第四组转移概率出现零。 首先想到的是怎么对零进行特殊处理,可是整体的算法思路看下来,并没有哪里可以更改,不管是不是零都是一样的。于是将0变成非常非常小的数。分母加上eps避免除以零,无效。改变循环次数,发现在第一次循环中迭代Pi时log出错,在工作区判断出是出现了log(0),故加eps。
    总结:
    1.repmat()函数可以扩展矩阵,方便实现点乘,避免了矩阵乘法的繁琐。
    2.sum()作用于方便实现i,j的求和。
    3.ij分不清怎么乘可以尝试固定一个变量看。

    展开全文
  • 综述迭代器对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用...迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以...

    综述迭代器

    对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值)。但对于无法随机访问的数据结构(比如set)而言,迭代器是唯一的访问元素的方式。

    另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件,或是斐波那契数列等等。

    迭代器更大的功劳是提供了一个统一的访问集合的接口,只要定义了iter()方法对象,就可以使用迭代器访问。

    例如:

    List = [1,2,3]

    L = List.__iter__()

    >>> L.next()

    1

    >>> L.next()

    2

    >>> L.next()

    3

    为什么使用迭代器

    for i in range(1000): pass

    for i in xrange(1000): pass

    前一个返回1000个元素的列表,而后一个在每次迭代中返回一个元素,因此可以使用迭代器来解决复用可占空间的问题

    class Fab(object):

    def __init__(self, max):

    self.max = max

    self.n, self.a, self.b = 0, 0, 1

    def __iter__(self):

    return self

    def next(self):

    if self.n < self.max:

    r = self.b

    self.a, self.b = self.b, self.a + self.b

    self.n = self.n + 1

    return r

    raise StopIteration()

    Fab 类通过 next() 不断返回数列的下一个数,内存占用始终为常数

    示例代码2

    def fab(max):

    n, a, b = 0, 0, 1

    while n < max:

    yield b

    a, b = b, a + b

    n = n = 1

    简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!

    在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

    看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

    以上这篇python 字典item与iteritems的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

    展开全文
  • 将一条长语句分多行写!!! 对于新手小白来说,看到 matlab 函数中的多个省略号(…),可能会一脸懵逼,这是啥东西?... ['KSVD迭代次数:',num2str(iterNum),'/',num2str(numIteration),... % 第2行

    将一条长语句分多行写!!!

    对于新手小白来说,看到 matlab 函数中的多个省略号(…),可能会一脸懵逼,这是啥东西?

    原来使用省略号三个点(…)是将一条语句换行。

    str={['OMP计算中:',num2str(floor(k/P*1000)/10),'%'];...                          % 分开后第1行
         ['KSVD迭代次数:',num2str(iterNum),'/',num2str(numIteration),...             % 第2行
         '    计算时间:',num2str(hour),':',num2str(minute),':',num2str(second)]};    % 第3行
    
    
    展开全文
  • 文章目录1、什么是膨胀与腐蚀2、形态学处理——膨胀2.1 更改卷积核大小2.2、更改迭代次数3、形态学处理——腐蚀3.1、更改卷积核大小3.2、更改迭代次数4、开运算和闭运算4.1、开运算4.2、闭运算5、梯度计算6、高帽和...

    OpenCV 膨胀与腐蚀


    1、什么是膨胀与腐蚀

      膨胀与腐蚀属于形态学范围,具体的含义根据字面意思来理解即可。但是更形象的话就是“增肥”与“减肥”。

      它们的用途就是用来处理图形问题上。总结性的来说:

    • 膨胀用来处理缺陷问题;
    • 腐蚀用来处理毛刺问题。

      膨胀就是把缺陷给填补了,腐蚀就是把毛刺给腐蚀掉了。这里其实说的并不严谨,也是为了大家理解方便。下面我们就用实例来进行演示。

    2、形态学处理——膨胀

      我们先引入一张图片进行分析。
    程序实现:

    img = cv2.imread('Pic/corrode.png')
    def cv_show(img):
        cv2.imshow('', img)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    cv_show(img)
    

      图中我们可以看到,这张图片是一个二值图片(只有黑白),而且还增加了一些毛刺。而且还包含字体中还包含一些小的间隙(缺陷)。

      下面我们对这张图片进行膨胀处理。膨胀是如何处理的呢?对于一个像素点,我们需要先指定对每个像素点膨胀的范围。

      这里我们指定范围为33的矩阵,kernel(卷积核核)指定为全为1的33矩阵,卷积计算后,该像素点的值等于以该像素点为中心的3*3范围内的最大值。由于我们是二值图像,所以只要包含周围白的部分,就变为白的。

    总结: 只要原图片3 * 3范围内有白的,该像素点就是白的。
    程序实现:

    kernel = np.ones((3, 3), dtype=np.uint8)
    dilate = cv2.dilate(img, kernel, 1) # 1:迭代次数,也就是执行几次膨胀操作
    cv_show(dilate)
    

    分析: 上图我们可以看出毛刺部分变粗,与此同时字体中的间隙也变小,补了缺陷部分。

    2.1 更改卷积核大小

      如果我们更改核的大小(4 * 4),也就改变了膨胀的程度。 只要4 * 4范围内有白的就变成白的。

    kernel_2 = np.ones((4, 4), dtype=np.uint8) # 卷积核变为4*4
    dilate = cv2.dilate(img, kernel_2, 1)
    cv_show(dilate)
    

    2.2、更改迭代次数

    kernel = np.ones((3, 3), dtype=np.uint8)
    dilate = cv2.dilate(img, kernel, 2) # 更改迭代次数为2
    ss = np.hstack((img, dilate))
    cv_show(ss)
    

    分析: 更改迭代次数将为2,将对图片进行2次的膨胀操作

    3、形态学处理——腐蚀

      腐蚀操作和膨胀操作相反,也就是将毛刺消除,判断方法为:在卷积核大小中对图片进行卷积。取图像中(3 * 3)区域内的最小值。由于我们是二值图像,也就是取0(黑色)。
    总结: 只要原图片3 * 3范围内有黑的,该像素点就是黑的。

    程序实现:

    kernel = np.ones((3, 3), dtype=np.uint8)
    erosion = cv2.erode(img, kernel, iterations=1)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    

    分析: 可以看出来,毛刺部分被清除掉,但与此同时,字体边缘部分也向里凹陷了一部分。

    3.1、更改卷积核大小

    kernel_2 = np.ones((4, 4), dtype=np.uint8)
    erosion = cv2.erode(img, kernel_2, iterations=1)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    

    分析: 卷积核变大后,我们发现他已经腐蚀的部分有点多了,字体原来的部分也被清除。

    3.2、更改迭代次数

    kernel = np.ones((3, 3), dtype=np.uint8)
    erosion = cv2.erode(img, kernel, iterations=2)
    ss = np.hstack((img, erosion))
    cv_show(ss)
    

    分析: 增加迭代次数后,腐蚀变得更加厉害,所以应该选择合适的迭代次数。

    4、开运算和闭运算

    开运算:先腐蚀,在膨胀
    闭运算:先膨胀,在腐蚀

      我们在上面的膨胀和腐蚀的图片中可以看到,图片大小程度上都受到了损失,字体信息缺失或者变粗等等。如果我们不想更改原有信息,即字体粗细。那么我们可以使用上面的两种运算。例如开运算,先对字体进行变细,在对字体进行变粗,整体上字体粗细不会发生变化。毛刺信息在腐蚀的时候就已经消除了,膨胀也不会膨胀出多余信息。

    4.1、开运算

    opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel, 1)
    ss = np.hstack((img, opening))
    cv_show(ss)
    

    分析: 我们发现大部分毛刺已经消除,而且字体信息也没有发生变化,这也就是我们想要的效果。虽然仍然有一部信息没有被清除,我们只需要调整卷积核的大小就可以实现。

    4.2、闭运算

    closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)  ## 有缺陷,填补缺陷
    ss = np.hstack((img, closing))
    cv_show(ss)
    

    分析: 字体不改变的前提下,我们把字体缺陷信息补全。

    5、梯度计算

      梯度计算主要显示的是边缘信息。计算的方法:

    膨胀的图像 - 腐蚀的图像

      我们明显的看出,用大一圈的图像减去小一圈的图像正好就是边缘的信息。

    gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)
    cv_show(gradient)
    

    分析: 我们可以看出来,我们形成了一个空心的字体样式

    6、高帽和黑帽

    高帽计算:原始图像 - 开运算结果
    黑帽计算:闭运算结果 - 原始图像

    6.1、高帽计算

      我们知道开运算的结果就是去除毛刺,我们原始图像减去开运算结果就是我们要消除的毛刺信息。

    top_hat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)
    ss = np.hstack((img, top_hat))
    cv_show(ss)
    

    分析: 可以看出来,所有的毛刺信息我们全部提取了出来。

    6.2、黑帽计算

      高帽操作显示毛刺,那么黑帽就是显示缺陷

    black_hat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel)
    ss = np.hstack((img, black_hat))
    cv_show(ss)
    

    分析: 这里我们看的不是很明显,我们只需要只要黑帽所处理的问题是什么。针对不同的场景应用不用的方法。

    最后

    更多精彩内容,大家可以转到我的主页:曲怪曲怪的主页
    或者关注我的微信公众号:TeaUrn

    展开全文
  • 我们知道,迭代器在Python中是一种非常高效又好用的数据结构,迭代器的特点是可以做到惰性求值**(lazy evaluation的概念)** ,什么意思呢?就是只有当迭代到某个值的时候它才会被计算产生,比如要遍历一个大文件或者...
  • C#开发笔记之02-什么时候使用OnXXX方法,这种命名是什么意思? C#开发笔记之03-为什么选择IsNotXXX方法而不是IsXXX方法? C#开发笔记之04-如何用C#优雅的计算个人所得税? C#开发笔记之05-迭代器中的状态机...
  • 那么分别是什么意思呢? 首先,为什么会用到以上概念,是因为“梯度下降”,也就是寻求曲线的一个最小值。其次,梯度下降是迭代的,它是一个需要多次计算的结果来求得最优解。 1,epoch 一个epoch指代所有的数据送入...
  • 梯度训练算法

    千次阅读 2016-12-12 16:04:22
    1. batch GD 每次迭代的梯度方向计算由所有训练样本共同投票决定, batch GD的损失函数是: ...什么意思呢,batch GD算法是计算损失函数在整个训练集上的梯度方向,沿着该方向搜寻下一个迭代点。”batch
  • 敏捷开发-Scrum.pptx

    2020-05-12 13:26:50
     Scrum是什么意思?  Scrum敏捷方法一分钟扫盲  Scrum敏捷方法丨的工作产品  Scrum敏捷方法丨的觇色  猪不鸡的故亊 Scrum过程 读前预习内容  创建和维护产品待开収项(Product Backlog)  迭代计划会 ...
  • 机械优化设计第一章

    2019-03-02 22:02:03
    2、点距准则判定结束:||X(K)-X(K-1)||小于设定整数(精度)时结束迭代,解释一下|| ||是什么意思,因为X不是一个数,而是一个vector,所以是有很多维的,用两栋的意思是两个X向量对应维度差的和再开根号,例如X(1)...
  • 深度学习

    2017-06-27 03:02:00
    SGD 中 stochastic 什么意思: Mini-Batch。。。 随机梯度下降算法(SGD)是mini-batch GD的一个特殊应用。SGD等价于b=1的mini-batch GD。即,每个mini-batch中只有一个训练样本。full batch GD每一轮迭代需要...
  • 哪里可以测试一下,我到底算不算是一位合格的程序员呢? 这几日,我真的太迷茫了,学习了C#这些年来,小程...昨天偶尔翻阅了之前开始的一本书籍,当看到迭代器等,却发现十分的不解,不知道是什么意思,还需要百度....
  • 拟牛顿法相关疑惑

    2019-10-21 17:40:16
    请问如何根据式(16)、(17)得到式(33),文中说拟牛顿法通过采用(33)被执行,这句是什么意思,最后应该根据式(33)得出控制器输入u,这个u是如何通过式(33)计算出的? 论文中给出了式(28)又给出了(29)...
  • 关于Tensorflow与Pytorch之间可用性、易用性、速度、部署能力的选择之争历来有之,但由于迄今为止深度学习框架已经发展了相当长一段时间,框架各自的缺点在一次次的...那么它们究竟是什么意思呢?在框架中又是如何体..
  • 这次迭代测试突然提出这个需求,而且不知道因为什么未知原因非要这样不可……因为之前用了table标签做表单,而且也没用插件,这下就难了点,找另外一个前端前辈妹子商量了下,她意思是用js来控制,我则是一直觉得js...
  • 迷迷糊糊的,说不清楚吧,还知道大概是什么意思;说清楚吧,具体怎么个计算细节也不了解。 今天以 y=3x+ϵy = 3x +\epsilony=3x+ϵ 曲线的回归作为数据集,这里ϵ\epsilonϵ 表示一个较小的误差。 数据集构造 数据...
  • 2.6.4 如果在计算图像的EDST 前没有消除其均值会发生什么情况? 121 2.7 奇反对称离散正弦变换(ODST) 122 2.7.1 什么是奇反对称离散正弦变换? 122 B2.12 推导1-D 逆奇离散正弦变换 125 2.7.2 2-D 时的逆奇...
  • 没错就是字面意思,两个指针一个快一些,一个慢一些,那它能解决我们什么问题呢? 说类比龟兔赛跑其实并不是很适合,我感觉它更像一个“小孩”在追一个“大人”,两个链表上的指针从同一节点出发,其中一个指针...
  • 纸质书有点沉,天天带在手边很不方便,尤其是上下班坐地铁的时候,都感觉看纸质书不太好意思,电子书不仅携带方便,还能不知不觉。“ 说实话,被很多小伙伴问过这样的问题,于是我下狠心,整理了半个多月的时间,...
  • clear all; I=imread('E:\Desktop\Walking\img\0001.jpg'); figure(1);imshow(I); %%%%%%%%%%%%%%%%%%%%%%%%%%... xw代表什么意思? 另外为什么Y算出来的是偏差值,和meanshift公式不一样啊
  • 主要讲述了计算机系统的开发领域。在每章中的漂亮代码都是来自独特解决方案的发现,而这种发现是来源于作者超越既定边界的远见卓识,并且识别出被多数人...”——我的意思是“Aha!” 33.8 结束语 33.9 进一步阅读 后记
  • 软件设计规范

    2015-03-11 11:57:50
    计算方法本身早已经被发现了(也就是怎么自动计算,或者说什么是可计算的),剩下的问题只是应用问题。把应用问题的解决纳入软件计算模式。自动计算技术在汇编指令集合那里得到了说明。所谓软件设计是把这种计算方式...
  • 第220题(2020-05-25):flex: 0 1 auto 表示什么意思?(拼多多) 讨论与参考答案:第220题 javaScript 第1题(2019-07-22) 以下代码会输出什么? 讨论与参考答案:第1题 第2题(2019-07-23):a在什么情况下,控制台...
  • excel的使用

    2012-11-25 17:06:01
    如果用得到,你还可以利用EXCEL来完成行列式、矩阵的各种计算,进行简单的积分运算,利用迭代求函数值(如x^2=x^7+4,可用迭代方法求x值),等等,凡是涉及计算方面的事,找EXCEL来帮忙,它一定会给你一个满意的答案...
  • 所以对于建模的同学来说,并不要求你 的数学功底有多么的好,但是需要你在培训或者自学期间,多涉猎一些模型(不 求计算或者推导,只求能有一定的印象,只要这个模型应该用在什么地方即可。) 这样,到了真正比赛的...

空空如也

空空如也

1 2 3
收藏数 57
精华内容 22
关键字:

迭代计算什么意思