通信系统仿真

崔春雷

目录

  • 1 第一单元: MATLAB基础
    • 1.1 课程说明与资料
      • 1.1.1 作业参考答案
      • 1.1.2 移动22级作业答案
    • 1.2 MATLAB安装与运行环境
      • 1.2.1 MATLAB介绍
    • 1.3 基本数据类型:数值类型
    • 1.4 基本数据类型:字符类型
    • 1.5 数据类型转换与输出
    • 1.6 数组与矩阵基础
      • 1.6.1 矩阵运算进阶
    • 1.7 数组与矩阵常用函数
    • 1.8 matlab中的逻辑运算
    • 1.9 实验: MATLAB常用数学函数
      • 1.9.1 实验 作业答案
    • 1.10 元胞数组
    • 1.11 结构体数组
      • 1.11.1 结构体进阶
      • 1.11.2 元胞数组与结构体数组对比
      • 1.11.3 map 容器
    • 1.12 附录:MATLAB常用基础命令
    • 1.13 拓展内容:实时脚本
      • 1.13.1 实时脚本示例
    • 1.14 课程作业与答案
      • 1.14.1 《通信系统仿真》期末考试
  • 2 第二单元:Matlab 程序设计
    • 2.1 顺序结构程序
    • 2.2 分支结构—— if语句
    • 2.3 分支结构—— switch语句
    • 2.4 循环结构—— while语句
    • 2.5 循环结构—— for语句
    • 2.6 图像处理基础
    • 2.7 Matlab的函数
      • 2.7.1 函数内容的课外扩展
    • 2.8 本章实验:for循环的应用
      • 2.8.1 素数问题
        • 2.8.1.1 素数的螺旋线排列
      • 2.8.2 3X+1猜想
      • 2.8.3 7 行代码计算 π
    • 2.9 排序算法
      • 2.9.1 冒泡排序
      • 2.9.2 选择排序
      • 2.9.3 插入排序
      • 2.9.4 快速排序
      • 2.9.5 基数排序
      • 2.9.6 计数排序
      • 2.9.7 堆排序
    • 2.10 动态规划算法
      • 2.10.1 动态规划编程实例
      • 2.10.2 动态规划:01背包问题
      • 2.10.3 动态规划常见题目分析
      • 2.10.4 动态规划题目分析2
    • 2.11 常用算法简介
      • 2.11.1 剪枝算法
      • 2.11.2 二分查找
      • 2.11.3 递归算法
      • 2.11.4 回溯算法
        • 2.11.4.1 Leetcode回溯题目合集
        • 2.11.4.2 回溯算法总结
        • 2.11.4.3 回溯法解数独问题
        • 2.11.4.4 DFS与BFS
          • 2.11.4.4.1 DFS/BFS原理
          • 2.11.4.4.2 BFS的应用:Dijkstra算法
      • 2.11.5 n 皇后问题专题
      • 2.11.6 双指针算法
      • 2.11.7 数组模拟链表(约瑟夫环)
      • 2.11.8 Hash(哈希表)
      • 2.11.9 图论与路径规划
        • 2.11.9.1 迪杰斯特拉算法
        • 2.11.9.2 A*算法
          • 2.11.9.2.1 A*算法的MATLAB实现
        • 2.11.9.3 RRT路径规划算法
          • 2.11.9.3.1 RRT算法 MATLAB代码
          • 2.11.9.3.2 参考资料
      • 2.11.10 数据结构
        • 2.11.10.1 数据结构例题
      • 2.11.11 前缀和 差分 双指针
      • 2.11.12 位运算
      • 2.11.13 常用算法代码模板
    • 2.12 练习题库
    • 2.13 code
      • 2.13.1 简易计算器gui代码
      • 2.13.2 五子棋
      • 2.13.3 连连看小游戏
      • 2.13.4 递归算法与汉诺塔
      • 2.13.5 有理数的小数循环节
    • 2.14 MATLAB编程风格
      • 2.14.1 向量化编程专题
  • 3 第三单元:Matlab 图形图像处理
    • 3.1 二维图形绘图基础
    • 3.2 二维图形绘图进阶
    • 3.3 三维图形绘图
      • 3.3.1 MATLAB绘图小结
        • 3.3.1.1 用matlab绘制好看图像
    • 3.4 MATLAB高级绘图
    • 3.5 文件操作
    • 3.6 Matlab图像处理进阶
      • 3.6.1 补充:Matlab图像处理常用函数
      • 3.6.2 RGB/HSV/HSI颜色模型
      • 3.6.3 图片切换动画效果
      • 3.6.4 图像连通域标记
      • 3.6.5 图像旋转与插值
      • 3.6.6 图像的形态学
      • 3.6.7 空间滤波
        • 3.6.7.1 图像中常见的噪声类型与滤波方法
        • 3.6.7.2 matlab中的滤波函数
        • 3.6.7.3 BM3D 去噪算法
        • 3.6.7.4 双边滤波
      • 3.6.8 图像的频域处理
    • 3.7 本章总结
    • 3.8 实验 : matlab 绘图练习1
    • 3.9 实验: matlab 绘图练习2
    • 3.10 实验 :数学函数图像绘制
    • 3.11 实验:绘图综合练习
    • 3.12 实验:曲线拟合
    • 3.13 实验:牛顿法求解方程的根
    • 3.14 实验:信号的傅里叶变换
      • 3.14.1 傅里叶变换、小波变换、希尔伯特变换
      • 3.14.2 新建目录
    • 3.15 课外补充:图像处理基础1
    • 3.16 课外补充:图像处理基础2
    • 3.17 课外补充:图像处理基础3
    • 3.18 课外补充:PYTHON基础
  • 4 第五单元:MATLAB通信仿真
    • 4.1 现代通信系统的介绍
    • 4.2 模拟通信系统的仿真原理
    • 4.3 HDB3编解码的仿真实现
    • 4.4 SIMULINK和其模块简介
    • 4.5 数字通信系统的仿真原理
    • 4.6 模拟通信系统Simulink仿真
    • 4.7 数字通信系统Simulink仿真
    • 4.8 音频信号测处理与仿真
    • 4.9 图像数字水印技术
      • 4.9.1 三角函数到傅里叶变换再到语音识别与数字水印
    • 4.10 信息系统与算法
      • 4.10.1 递归算法
        • 4.10.1.1 递归与堆栈的关系
      • 4.10.2 哈希表
      • 4.10.3 双指针算法
        • 4.10.3.1 双指针算法实战
        • 4.10.3.2 双指针进阶:滑动窗口算法
      • 4.10.4 字符串匹配 KMP算法
        • 4.10.4.1 字符串匹配B-M算法
      • 4.10.5 快速傅里叶变换
      • 4.10.6 回溯算法
      • 4.10.7 动态规划
      • 4.10.8 分治算法
      • 4.10.9 Dijkstra算法
  • 5 第六单元: systemview通信仿真
    • 5.1 SystemView概述
    • 5.2 模拟通信系统 数字系统的仿真分析
    • 5.3 SystemView通信系统仿真进阶
    • 5.4 新建课程目录
  • 6 第四单元:MATLAB高级应用
    • 6.1 符号运算基础
      • 6.1.1 利用Matlab自动推导公式
    • 6.2 Matlab中的数值计算
      • 6.2.1 积分的计算
      • 6.2.2 龙格库塔:常微分方程的数值解法
      • 6.2.3 fmincon函数与非线性方程最小值
    • 6.3 统计、拟合、插值
      • 6.3.1 协方差与相关系数
    • 6.4 GUI设计初步
    • 6.5 matlab GUI界面编程
      • 6.5.1 gui实例
      • 6.5.2 gui编程中常用函数
      • 6.5.3 App Designer入门
    • 6.6 实验:GUI设计图像空间变换系统
    • 6.7 作业:利用GUI设计 计算器、信号发生器等
    • 6.8 MTALB数据导入方法
    • 6.9 课外补充:MATLAB的App会取代GUI吗?
    • 6.10 模拟退火算法matlab实现
    • 6.11 遗传算法的Matlab实现
      • 6.11.1 进化算法(Evolutionary Algorithm)及相关函数介绍
    • 6.12 粒子群算法 matlab实现
      • 6.12.1 粒子群算法及MATLAB实例仿真
    • 6.13 BP网络的应用
    • 6.14 matlab 结构体
    • 6.15 群智能算法合集
  • 7 拓展知识
    • 7.1 什么是算法的时间复杂度?
    • 7.2 Notepad++使用教程
    • 7.3 MATLAB常用函数总结
    • 7.4 MATLAB常用知识点总结
    • 7.5 MATLAB命令大全
    • 7.6 视频:MATLAB官方基础教程
    • 7.7 经典书籍:Matlab2012经典超强教程
    • 7.8 经典书籍:MATLAB揭秘(自学宝典)
    • 7.9 经典资料:MATLAB N个实用技巧
    • 7.10 Matlab编程小技巧
    • 7.11 寻优算法
      • 7.11.1 Dijkstra算法python实现
    • 7.12 PYTHON基础教程
      • 7.12.1 Python进阶
      • 7.12.2 Python小技巧
      • 7.12.3 Python总结
        • 7.12.3.1 Python循环语句总结
        • 7.12.3.2 24个顶级Python库
        • 7.12.3.3 魔法函数
      • 7.12.4 廖雪峰python
      • 7.12.5 正则表达式基础
      • 7.12.6 numpy
        • 7.12.6.1 101道Numpy习题
        • 7.12.6.2 Numpy简要语法教程
        • 7.12.6.3 Numpy实现全连接神经网络 (手写数字识别)
        • 7.12.6.4 图解NumPy
      • 7.12.7 matplotlib
        • 7.12.7.1 matplotlib练习50题
        • 7.12.7.2 Matplotlib速查表
        • 7.12.7.3 Matplotlib 实操指南
      • 7.12.8 Python3 模块 import
      • 7.12.9 Python 小项目
    • 7.13 参考资源:数据结构与算法
      • 7.13.1 十大经典排序算法总结
    • 7.14 机器学习概述
      • 7.14.1 反向传播算法
        • 7.14.1.1 反向传播的数学原理
      • 7.14.2 极大似然估计
        • 7.14.2.1 极大似然估计与最小二乘法
      • 7.14.3 Batch Normalization
        • 7.14.3.1 Batch Normalization&Dropout浅析
        • 7.14.3.2 ​BN层的梯度反向传播计算
        • 7.14.3.3 Batch Size的大小与神经网络的性能
        • 7.14.3.4 标准化和归一化
      • 7.14.4 主成分分析PCA与SVD奇异值分解
        • 7.14.4.1 岭回归 与 PCA
        • 7.14.4.2 PCA原理推导
        • 7.14.4.3 PCA原理新解
        • 7.14.4.4 svd
        • 7.14.4.5 PCA数学原理
      • 7.14.5 正则化
        • 7.14.5.1 L1、L2正则化和过拟合 总结
        • 7.14.5.2 L1 和 L2 正则化的直观解释
      • 7.14.6 SVM
        • 7.14.6.1 从零推导支持向量机(SVM)
        • 7.14.6.2 支持向量机(SVM)介绍
        • 7.14.6.3 SVM推导与实战
        • 7.14.6.4 支持向量机的直观理解
        • 7.14.6.5 浅显易懂的支持向量机SVM
      • 7.14.7 线性回归
      • 7.14.8 逻辑回归
      • 7.14.9 BP算法
        • 7.14.9.1 万能逼近——神经网络拟合任意函数原理
      • 7.14.10 激活与池化
        • 7.14.10.1 激活函数与损失函数 小结
      • 7.14.11 深度学习简述
        • 7.14.11.1 MATLAB2020深度学习实例
      • 7.14.12 损失函数与误差反向传播
        • 7.14.12.1 梯度下降与损失函数
      • 7.14.13 深度学习优化问题
      • 7.14.14 梯度下降法
        • 7.14.14.1 各类梯度下降算法的Python实现
        • 7.14.14.2 梯度下降的直观理解
        • 7.14.14.3 动量、RMSProp、Adam
      • 7.14.15 卷积的概念
        • 7.14.15.1 卷积的矩阵化算法
      • 7.14.16 局部连接
      • 7.14.17 RNN
      • 7.14.18 LSTM
      • 7.14.19 CNN-四大经典CNN技术浅析
      • 7.14.20 熵(Entropy)与交叉熵
      • 7.14.21 softmax函数详解
      • 7.14.22 自编码算法详细理解与代码实现
      • 7.14.23 pytorch
        • 7.14.23.1 ​PyTorch简介
          • 7.14.23.1.1 Pytorch快速入门资料
        • 7.14.23.2 CNN的PyTorch实现
        • 7.14.23.3 pytorch总结
        • 7.14.23.4 PyTorch trick 集锦
        • 7.14.23.5 在PyTorch上加载自定义数据集
        • 7.14.23.6 实战:Pytorch识别验证码
        • 7.14.23.7 实战:Transformer的最简洁pytorch实现
        • 7.14.23.8 使用PyTorch实现神经网络分类
      • 7.14.24 卷积神经网络CNN概述
        • 7.14.24.1 CNN 简易原理
        • 7.14.24.2 卷积神经网络CNN原理详解
        • 7.14.24.3 自己手写一个卷积神经网络
        • 7.14.24.4 CNN反向传播算法
        • 7.14.24.5 卷积计算、作用与思想
        • 7.14.24.6 用卷积神经网络CNN识别手写数字集
        • 7.14.24.7 卷积 池化 参数的计算
        • 7.14.24.8 im2col方法实现卷积算法
        • 7.14.24.9 卷积核的梯度计算
        • 7.14.24.10 卷积层反向传播推导及实现
        • 7.14.24.11 反向传输算法
          • 7.14.24.11.1 resnet残差网络
        • 7.14.24.12 CNN反向传播的MATLAB实现
      • 7.14.25 神经网络的调参技巧
      • 7.14.26 BP神经网络
        • 7.14.26.1 零开始搭建bp神经网络
        • 7.14.26.2 MATLAB自带的bp工具箱
        • 7.14.26.3 神经网络中偏置(bias)的作用
      • 7.14.27 聚类分析 k-means
        • 7.14.27.1 matlab做聚类分析(k-means)
        • 7.14.27.2 聚类模型探讨综述
        • 7.14.27.3 5种经典聚类算法
      • 7.14.28 深度学习的一些概念
      • 7.14.29 人工智能简述:AI的过去和现在
      • 7.14.30 k-NN(k近邻算法)
      • 7.14.31 神经网络中的优化器:BGD、SGD、MBGD、Momentum
      • 7.14.32 卷积神经网络的经典网络总结
        • 7.14.32.1 卷积神经网络中十大拍案叫绝的操作
      • 7.14.33 GAN 对抗样本攻击
      • 7.14.34 蒙特卡洛模拟
      • 7.14.35 dropout与随机部分连接
      • 7.14.36 Jupyter 等 IDE概览
      • 7.14.37 分类算法常用评价指标
      • 7.14.38 Inception 网络与不变性
      • 7.14.39 卷积神经网络的可视化
      • 7.14.40 隐马尔可夫模型HMM
        • 7.14.40.1 马尔科夫链
    • 7.15 MATLAB音频处理
      • 7.15.1 python处理音频信号
    • 7.16 图像处理
      • 7.16.1 图像处理中的指标
    • 7.17 代码集
    • 7.18 论文写作与阅读方法
      • 7.18.1 期刊投稿攻略
      • 7.18.2 论文排版教程
      • 7.18.3 SCI-HUB论文下载技巧
      • 7.18.4 几种论文写作神器,提高写作效率
      • 7.18.5 latex入门
      • 7.18.6 LaTeX教程
    • 7.19 机器学习常用的网站以及资源
      • 7.19.1 很详细的ML&DL学习博客
    • 7.20 SymPy 符号计算基本教程
  • 8 程序设计数学基础
    • 8.1 编程数学基础
      • 8.1.1 概率的历史
      • 8.1.2 概率
        • 8.1.2.1 常见概率分布
          • 8.1.2.1.1 二维正态分布
        • 8.1.2.2 蒙特卡罗方法
        • 8.1.2.3 置信区间
        • 8.1.2.4 协方差与相关系数
      • 8.1.3 矩阵 向量求导法则
      • 8.1.4 雅可比矩阵 海森矩阵
      • 8.1.5 矩阵的几种分解方式
      • 8.1.6 行列式和代数余子式
      • 8.1.7 向量
      • 8.1.8 矩阵的基本运算
      • 8.1.9 矩阵分析
      • 8.1.10 矩阵的LU分解
      • 8.1.11 矩阵奇异值分解(SVD)
        • 8.1.11.1 SVD分解2
        • 8.1.11.2 SVD分解逐步推导
        • 8.1.11.3 奇异值与特征值的意义
      • 8.1.12 随机向量
        • 8.1.12.1 随机过程简述
      • 8.1.13 投影矩阵和最小二乘
      • 8.1.14 知乎数学精选集
        • 8.1.14.1 高数问题集
      • 8.1.15 小波变换
      • 8.1.16 程序设计数学基础1:高等数学
      • 8.1.17 程序设计数学基础2:线性代数
      • 8.1.18 程序设计数学基础3:概率论和数理统计
      • 8.1.19 向量的距离与相似度计算
      • 8.1.20 复数
      • 8.1.21 高等数学——幂级数
      • 8.1.22 无穷小的本质
      • 8.1.23 数列极限和收敛性
      • 8.1.24 不定积分技巧总结
    • 8.2 有趣的数学题目
    • 8.3 高等数学
      • 8.3.1 泰勒级数
  • 9 路径规划与智能算法
    • 9.1 常见路径规划算法简介
    • 9.2 Dijkstra算法详细
  • 10 教学文档
    • 10.1 授课计划
    • 10.2 课程标准
本章实验:for循环的应用


1.编程,求圆周率Pi中前100万位里,是否出现你的生日(六位生日,如1999312日,则认为生日为 990312),如果出现则具体出现了多少次,分别出现是小数点后的多少位?

clc

str1='990312'         %要找的字符串

n=length(str1);      %测量这个字符串的长度


pi_str=char(vpa(pi,100000));   %把pi显示100000位后,再转换为字符串

M=length(pi_str);                   % 测量这个字符串的长度


count=0;                 %计数器,用来记录找到了多少次符合条件的情况


for i=3:M-n              %从字符串第三位开始寻找,因为前两位为: 3. 

      if  pi_str( i : (i+n-1) )==str1

           count=count+1;       %若if成立,则说明找到了符合要求的。计数器加1

           fprintf('第%d次找到符合条件,其在小数点后%d 位 \n' ,count , (i-2) )  

      end

end


fprintf(' \n 所搜索的字符串在pi里共出现了%d次 \n' ,count )  




=================================

还可以用findstr函数,查找字符串中的子串。

例:

>>str='ancdr'

>>findstr (str,'dr')


ans =


     4




strcat函数的作用:连接两个字符串。

例:

s1='I'     ;s2=', '    ;s3='L'     ;s4='o'    ;s5='v';

s6='e'    ;s7=', '    ;s8='y'     ;s9='o'    ;s10='u';

s=strcat(s1,s2,s3,s4,s5,s6,s7,s8,s9,s10)



练习:将一个大于等于3的数分成三个正整数(大于0)相加有多少种分法?


%完全没有任何优化

M=30

total=0

tic

for k1=1:M

    for k2=k1:M

        for k3=k2:M

            

            if  M==k1+k2+k3               

                 fprintf('%d + %d + %d = %d \n',k1,k2,k3,M)  %注释掉该行,可看出优化与否的差异 

                  total=total+1;          

            end

            

        end

    end

end

toc

fprintf(' 数字%d 的解有%d组  \n',M,total)


==========================================


%优化后的算法

M=30

total=0

tic

for k1=1:fix(M/3)                %K1最多分三分之一

    for k2=k1:fix((M-k1)/2)   %K2下限是k1,上限最多分剩余的2分之一

        

         k3=M-k1-k2;           

         fprintf('%d + %d + %d = %d \n',k1,k2,k3,M)  %注释掉该行,可看出优化与否的差异    

         total=total+1;

 

    end

end

toc

fprintf(' 数字%d 的解有%d组  \n',M,total)


===================================================


%函数化

function [A,total] = M_3(M)

A=[];         %用矩阵A来装发现的解,每一行存一组解

total=0;


for k1=1:fix(M/3)

    for k2=k1:fix((M-k1)/2)

        

        k3=M-k1-k2;

        total=total+1;            %计数器total,可以代表矩阵A的行数

        A(total,:)=[k1,k2,k3];   %把k1,k2,k3水平方向拼接成一个数组给A的第total行


    end

end


end





2.图像的中间值滤波。

 所谓中央值滤波器,就是将滤波器范围内的像素的灰度值,进行排序,选出中央值作为这个像素的灰度值。同理可解释最大值滤波器与最小值滤波器。


      

再举个例子,下面是一副图像中的一个点及其邻域上的点,上面的值代表其灰度值。首先将这9个像素值从小到大排列,依次是:90,110,120,150,165,200,210,230,255,中值为165,最大值是255,最小值是90。原本该点的灰度值应该是150,如果采用中值滤波器的话,则会用165来取代150,即该点的灰度值变成了165;如果是最小值滤波器的话,则该点的灰度值变成90;如果是最大值滤波器的话,则该点的灰度值变成255。

                                

我们将一幅图像添加椒盐噪声,然后尝试着用中央值滤波器去除。


从直方图中,可以看出,中央值滤波器对于椒盐噪声,有很好的去噪作用。

%给图像加噪声

>> i=imread('E:\科研\数字图像处理\bird1.jpg');

>> j1=imnoise(i,'salt & pepper',0.02);

>> imshow(j1)

>> imwrite(j1,'E:\科研\数字图像处理\bird1_saltpepper.png')




2.某个数的三次方是4位数,四次方是6位数,且其三次方和四次方这两个数正好把0-910个数字用完,不多不少,求这个数是多少

分析:

(1)4位数区间为:1000-9999,开3次方为:10-21.5436,取10-21

(2)6位数区间为:100000-999999,开4次方为:17.7828-31.6228,取18-31

 由上可知:这个数位于18-21之间


clc

 for i=18:21

      x=num2str(i^3)    %把数字转为字符串

      y=num2str(i^4)    %把数字转为字符串

      z=strcat(x,y)          %通过strcat函数合并两个字符串

      z=sort(z)                %对这个字符串从小到大排序

      if  z=='0123456789' 

          fprintf('找到符合条件的I=%d, 其3次方为%d,4次方为%d \n' , i , i^3 ,i^4 )

          break

      end

 end



3求两个整数X1,X2的最大公约数:

x1=input('x1=')

x2=input('x2=')


if  x1<=x2

    smaller=x1;

else

    smaller=x2;

end


for  i=1:smaller

      if  (rem(x1,i)==0)&(rem(x2,i)==0)

           gys=i;

      end

end

fprintf('%d  和 %d 的最大公约数为%d \n' , x1 , x2 ,gys )



作业1:百钱买白鸡问题

1,问题描述:

公鸡每只5元,母鸡每只3元,三只小鸡1元,用100元买100只鸡,问公鸡、母鸡、小鸡各多少只?

2,算法分析:

利用枚举法解决该问题,以三种鸡的个数为枚举对象,分别设为mj,gj和xj,用三种鸡的总数 (mj+gj+xj=100)和买鸡钱的总数(1/3*xj+mj*3+gj*5=100)作为判定条件,穷举各种鸡的个数。

%原始代码:

for  m=0:20

     for  n=0:33

         for  k=0:3:300

             if  (m*5+3*n+(k/3)==100)&(m+n+k==100)

                  fprintf('公鸡%d个,母鸡%d个,小鸡%d个\n',m,n,k)

             end

         end

     end

end



%改进后:

for m=0:20

        for k=0:3:99

            n=100-m-k;

            if  (m*5+3*n+(k/3)==100)&(n>=0)

                 fprintf('公鸡%d个,母鸡%d个,小鸡%d个\n',m,n,k)

            end

        end 

end






作业2:给一个无限长的自然数构成的字符串

S: 12345678910 111213141516171819 202122232425….....,

它是由所有自然数从小到大依次排列起来的,任意给一个数字串STR1(如751),编程求出它第一次出现在S中的位置。


clc

str1='751'             %要找的字符串

n=length(str1);      %测量这个字符串的长度


S=[];                     %S用来存储即将生成的S序列

K=1;                    %设k为数组S的位置索引变量,如k=11时,S(11)=0

S=char(S);            %把S字符化

for i=1:1000         %生成这个字符串,相当于从1写到1000

      L=length(num2str(i));  %测量I是几位数,如i=231时,L=3;

........补齐代码,完成数组S的建立

end


M=length(S)      %测量数组s的长度

for i=1:M-n+1    %开始匹配要找的字符串str1位于S中的第几位?

       if      

........补齐代码,如果符合条件,则打印输出,说明在第几位找到了

       end

 end




效果:






作业3反转字符串 

给定一个字符串句子,反转句子中每一个单词的所有字母,同时保持空格和最初的单词顺序。字符串中,每一个单词都是由空格隔开,字符串中不会有多余的空格。

样例

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"


      

作业4:最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例:

输入: [-2,1,-3,4,-1,2,1,-5,4],

输出: 6

解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。

很多人对这道题最开始都会有一个误区,就是 只要将连续的正数相加就肯定是最大的,这种思想当然是有问题的 最简单的例子 1, 2, 3, -99, 100000 如果用刚才那样想法求出的最大和是6,但是答案肯定是不对的,应该是最后一项数

所以这就引出了一种思想:

如果当前和大于0,则加上下一个数(当前和是正的 对后面的求和“有益处”)

如果当前和小于或等于0,则将下一个数赋给当前和

最后比较当前和与存储最大值的变量 取最大值

% str=[-2,1,-3,4,-1,2,1,-5,4,3,-1,2,-5,2,-3,4];

str=randi([-30,30],[1,100])

s_temp=0;

s_all=0;


for  k=str

      if   s_temp>0  

%如果过去为正资产,则保留过去,同时拥抱未来。哪怕未来是负的,只要这个负不是很严重到可以把过去的正全部抵消,则一直保留过去,拥抱未来。

           s_temp=s_temp+k;

      else   

%如果之前的s_temp位负资产,则舍弃过去,拥抱未来(哪怕未来也是负的,未来一个负总比过去的负加上未来的负强,如果未来是正的,更要拥抱)

           s_temp=k;

     end

     s_all=max(s_all,s_temp); 

       %不断在当前的最大值s_temp和历史上的最大值s_all中选择其中最大的,作为新的史上最大的值。

end


s_all





==================================


课外小知识:


              无理数与无理数还不一样--超越数简谈






但现在我把数字换成 [公式] 会如何?找一个方程,它有一个解 [公式] ,但是方程本身不能出现 [公式] ?你是不是一下子傻了?你不能说 [公式] 这种方程,因为我规定方程里不能有 [公式] 。这里面你就能看出,一个 [公式] 与 [公式] 的本质区别, [公式] 不能用若干根号的加减乘除组合表示出来的,所以它不能成为我们 课堂上所学的那种代数方程的根。

代数方程就是我们在学校里学的一元二次方程的扩展为一元n次方程。这里面n是自然数,且方程的系数都是有理数。

而显然 [公式] 和 [公式] 都不能用若干根号表示出来,否则我们很可能就不用引入 [公式] 和 [公式] 这两个符号了对不对?因此数学家定义了,那种可以是代数方程根的数为“代数数”,这其中包括了所有有理数和那种可以用若干根号组合表示出来的无理数。而不可以的成为代数方程根的数,就叫做“超越数”。

那你可能又有问题了,区分代数数和超越数有意义吗?没有意义的话,就不应该引入对不对?你这个思路非常对,那么数学家既然定义了超越数,那必然有用。

首先数学家发现,“几乎”所有的实数都是超越数。哇,这是不是很吃惊?首先,这里的“几乎”这次词是数学用语,如果你不知道“几乎”的含义,那你可以搜索我之前的一期题为“我几乎懂了”的节目。

“几乎”所有的实数都是超越数这句话告诉我们:实数里超越数是占主要部分的,代数数与超越数相比是可以忽略不计的。对这个结论,了解一点无穷基数理论的听众可以这样理解:我们知道有理数是可数集,也就是我们有一个方法可以把所有有理数一个一个写下来,写成一个序列,这个序列包含所有有理数。这样感觉它们就可以数数一样,所以称为“可数”集。

然后数学家还发现如果把有理数扩展到代数数,仍然是可数的,代数数仍然是可以排队排出来的。那我们已经知道实数是不可数,那么结论就只有超越数是真正不可数的,所以说“几乎所有实数都是超越数”。这是很反直觉的对不对?所以定义超越数就太有必要了,原来我们一直讨论的实数,其实基本都是超越数啊。

但是,虽然我们知道“几乎所有实数都是超越数”,证明一个数字是超越数却非常难。比如你要证明 [公式] 不能用若干根号表示出来,你怎么证明呢?其实到1768年,才第一次证明 [公式] 是无理数,而证明 [公式] 是超越数又过了100多年,要迟到1882年。也正因为证明了 [公式] 是超越数,人类才彻底解决了古希腊三大几何难题中最难的一个“化圆为方”问题。

其原因在于我们已经证明尺规作图只能作出特定形状的一些代数数长度的线段,超越数长度的线段是不可能作出来的。所以证明pi为超越数,就证明“化圆为方”问题无解。

除了 [公式] ,数学家也证明了比如 [公式] , [公式] , [公式] ,这些数都是超越数。但是目前已经被被证明是超越数的数非常少,倒是很多感觉上必须是超越数的数,我们都还不能证明:比如 [公式] , [公式] , [公式] , [公式] , [公式] , [公式] 等等,这些数是否是超越数,都未能证明。再比如以前节目中提到过的欧拉-马斯刻若尼常数,虽然猜想是超越数,但现在都没能证明这个数字是无理数。

由此可见,超越数虽然多,但是却很神秘。

以上我们说明了无理数跟无理数还不一样,那有没有办法更精细的对无理数分类的,比一比无理数中谁的“无理”程度“更高”呢?还真有人真么做了。1932年,荷兰数学家库尔特·马勒就提出了一个实数的“无理性”度量,就是度量一个实数到底“无理”到什么程度,取值范围从0到无穷大的整数。对有理数来说,这个度量值就是0,因为它有理,一点不无理。对根号2来说就是1,这就是无理数里面“无理”程度最小的。而超越数的无理数度量最小是2,比如现在知道 [公式] 的无理性度量上限是2.5等等。


维基百科上关于马勒的对实数的无理性度量


好了,以上就是简单介绍了一下超越数概念。

总结:不能满足整系数方程a1+a2x+a3x^2+……+a(n+1)x^n=0的数都是超越数。超越数远远比代数数多,代数数只有阿列夫零个,超越数有阿列夫一个。我们乱写一个无理数,100%都是超越数。超越数有a^b(a为非0,1代数数,b为无理代数数),π,e等。对数算不出的都是超越数。还有像0.1010010001……和0.12345678910……等有规律但不循环的数都是超越数。还有刘维尔数。


===================================