【复旦邱锡鹏教授《神经网络与深度学习公开课》笔记】梯度的反向传播算法

矩阵微积分(Matrix Calculus)

在开始之前,需要先了解矩阵微积分的一些计算规则。
首先,对于矩阵微积分的表示,通常由两种符号约定:

  • 分母布局

    • 标量关于向量的导数为列向量

    • 向量关于标量的导数为行向量

    • N维向量对M维向量的导数为M*N维矩阵(雅可比矩阵的转置)
      在这里插入图片描述

    • 标量对M维向量的二阶偏导数为M*M维矩阵(Hessian矩阵,也写作 ▽ 2 f ( x ) \triangledown^2f(x) 2f(x),第m行第n个元素为 ∂ 2 y ∂ x m ∂ x n \frac{\partial^2y}{\partial x_m\partial x_n} xmxn2y
      在这里插入图片描述

  • 分子布局

    • 标量关于向量的导数为行向量
    • 向量关于标量的导数为列向量
    • N维向量对于M维向量的导数为N*M维矩阵(雅可比矩阵)

∂ f ( x ) ∂ x = [ ∂ y 1 ∂ x 1 ⋯ ∂ y 1 ∂ x M ⋮ ⋱ ⋮ ∂ y N ∂ x 1 ⋯ ∂ y N ∂ x M ] ∈ R N × M \begin{aligned} \frac{\partial f(x)}{\partial x}= \begin{bmatrix} \frac{\partial y_1}{\partial x_1}&\cdots&\frac{\partial y_1}{\partial x_M}\\ \vdots&\ddots&\vdots\\ \frac{\partial y_N}{\partial x_1}&\cdots&\frac{\partial y_N}{\partial x_M} \end{bmatrix}\in\mathbb{R}^{N\times M} \end{aligned} xf(x)= x1y1x1yNxMy1xMyN RN×M

- 标量对M维向量的二阶偏导数为M*M维矩阵(Hessian矩阵的转置)
∂ 2 y ∂ x 2 = ∂ ∂ x ∂ y ∂ x = ∂ ∂ x [ ∂ y ∂ x 1 ⋯ ∂ y ∂ x M ] = [ ∂ 2 y ∂ x 1 2 ⋯ ∂ 2 y ∂ x M ∂ x 1 ⋮ ⋱ ⋮ ∂ 2 y ∂ x 1 ∂ x M ⋯ ∂ 2 y ∂ x M 2 ] ∈ R M × M \begin{aligned} \frac{\partial^2y}{\partial x^2} &=\frac{\partial}{\partial x}\frac{\partial y}{\partial x}\\ &=\frac{\partial}{\partial x} \begin{bmatrix} \frac{\partial y}{\partial x_1}&\cdots&\frac{\partial y}{\partial x_M} \end{bmatrix}\\ &=\begin{bmatrix} \frac{\partial^2 y}{\partial x_1^2}&\cdots&\frac{\partial^2 y}{\partial x_M\partial x_1}\\ \vdots&\ddots&\vdots\\ \frac{\partial^2 y}{\partial x_1\partial x_M}&\cdots&\frac{\partial^2 y}{\partial x_M^2} \end{bmatrix} \in\mathbb{R}^{M\times M} \end{aligned} x22y=xxy=x[x1yxMy]= x122yx1xM2yxMx12yxM22y RM×M
分子布局和分母布局之间是转置的关系。本系列所有内容默认都以分母布局进行计算和解释。
矩阵微积分也遵从链式法则(分母布局)
在这里插入图片描述

梯度计算

前馈神经网络的结构化风险函数:
R ( W , b ) = 1 N ∑ n = 1 N L ( y ( n ) , y ^ ( n ) ) + 1 2 λ ∥ W ∥ F 2 \mathcal{R}(W,b)=\frac{1}{N}\sum_{n=1}^N\mathcal{L}(y^{(n)},\hat{y}^{(n)})+\frac{1}{2}\lambda\|W\|_F^2 R(W,b)=N1n=1NL(y(n),y^(n))+21λWF2
先分别计算网络中的某一层的损失函数 L \mathcal{L} L对参数的导数(分母布局),利用链式法则
∂ L ( y , y ^ ) ∂ w i j ( l ) = ∂ L ( y , y ^ ) ∂ z ( l ) ∂ z ( l ) ∂ w i j ( l ) ∂ L ( y , y ^ ) ∂ b ( l ) = ∂ L ( y , y ^ ) ∂ z ( l ) ∂ z ( l ) ∂ b ( l ) \begin{aligned} \frac{\partial \mathcal{L}(y,\hat{y})}{\partial w_{ij}^{(l)}} &=\frac{\partial \mathcal{L}(y,\hat{y})}{\partial z^{(l)}}\frac{\partial z^{(l)}}{\partial w_{ij}^{(l)}}\\ \frac{\partial \mathcal{L}(y,\hat{y})}{\partial b^{(l)}} &=\frac{\partial \mathcal{L}(y,\hat{y})}{\partial z^{(l)}}\frac{\partial z^{(l)}}{\partial b^{(l)}}\\ \end{aligned} wij(l)L(y,y^)b(l)L(y,y^)=z(l)L(y,y^)wij(l)z(l)=z(l)L(y,y^)b(l)z(l)
其中 z ( l ) = W ( l ) a ( l − 1 ) + b ( l ) z^{(l)}=W^{(l)}a^{(l-1)}+b^{(l)} z(l)=W(l)a(l1)+b(l)是一个向量,根据分母布局的规则,向量对于标量求导为行向量,因此 ∂ z ( l ) ∂ w i j ( l ) \frac{\partial z^{(l)}}{\partial w_{ij}^{(l)}} wij(l)z(l)为行向量
∂ z ( l ) ∂ w i j ( l ) = [ ∂ z 1 ( l ) ∂ w i j ( l ) ⋯ ∂ z i ( l ) ∂ w i j ( l ) ⋯ ∂ z M l ( l ) ∂ w i j ( l ) ] = [ ∂ ( w 1 j ( l ) a ( l − 1 ) + b i ( l ) ) ∂ w i j ( l ) ⋯ ∂ ( w i j ( l ) a ( l − 1 ) + b i ( l ) ) ∂ w i j ( l ) ⋯ ∂ ( w M i j ( l ) a ( l − 1 ) + b i ( l ) ) ∂ w i j ( l ) ] = [ 0 ⋯ a j ( l − 1 ) ⋯ 0 ] ≜ l i ( a j ( l − 1 ) ) ∈ R 1 × M l \begin{aligned} \frac{\partial z^{(l)}}{\partial w_{ij}^{(l)}} &=\begin{bmatrix} \frac{\partial z_1^{(l)}}{\partial w_{ij}^{(l)}}& \cdots& \frac{\partial z_i^{(l)}}{\partial w_{ij}^{(l)}}& \cdots& \frac{\partial z_{M_l}^{(l)}}{\partial w_{ij}^{(l)}} \end{bmatrix}\\ &=\begin{bmatrix} \frac{\partial (w_{1j}^{(l)}a^{(l-1)}+b_i^{(l)})}{\partial w_{ij}^{(l)}}& \cdots& \frac{\partial (w_{ij}^{(l)}a^{(l-1)}+b_i^{(l)})}{\partial w_{ij}^{(l)}}& \cdots& \frac{\partial (w_{M_ij}^{(l)}a^{(l-1)}+b_i^{(l)})}{\partial w_{ij}^{(l)}} \end{bmatrix}\\ &=\begin{bmatrix} 0&\cdots&a_j^{(l-1)}&\cdots&0 \end{bmatrix}\\ &\triangleq\mathbb{l}_i(a_j^{(l-1)})\in\mathbb{R}^{1\times M_l} \end{aligned} wij(l)z(l)=[wij(l)z1(l)wij(l)zi(l)wij(l)zMl(l)]=[wij(l)(w1j(l)a(l1)+bi(l))wij(l)(wij(l)a(l1)+bi(l))wij(l)(wMij(l)a(l1)+bi(l))]=[0aj(l1)0]li(aj(l1))R1×Ml
同样,向量 z ( l ) z^{(l)} z(l)对向量 b ( l ) b^{(l)} b(l)的导数为
∂ z ( l ) ∂ b ( l ) = [ ∂ ( w 1 j ( l ) a ( l − 1 ) + b 1 ( l ) ) ∂ b 1 ( l ) ⋯ ∂ ( w M i j ( l ) a ( l − 1 ) + b i ( l ) ) ∂ b 1 ( l ) ⋮ ⋱ ⋮ ∂ ( w 1 j ( l ) a ( l − 1 ) + b 1 ( l ) ) ∂ b M i ( l ) ⋯ ∂ ( w M i j ( l ) a ( l − 1 ) + b i ( l ) ) ∂ b M i ( l ) ] = [ 1 ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ 1 ] = I M i ∈ R M l × M l \begin{aligned} \frac{\partial z^{(l)}}{\partial b^{(l)}} &=\begin{bmatrix} \frac{\partial(w_{1j}^{(l)}a^{(l-1)}+b_1^{(l)})}{\partial b_1^{(l)}}&\cdots&\frac{\partial(w_{M_ij}^{(l)}a^{(l-1)}+b_i^{(l)})}{\partial b_1^{(l)}}\\ \vdots&\ddots&\vdots\\ \frac{\partial(w_{1j}^{(l)}a^{(l-1)}+b_1^{(l)})}{\partial b_{M_i}^{(l)}}&\cdots&\frac{\partial(w_{M_ij}^{(l)}a^{(l-1)}+b_i^{(l)})}{\partial b_{M_i}^{(l)}} \end{bmatrix}\\ &=\begin{bmatrix} 1&\cdots&0\\ \vdots&\ddots&\vdots\\ 0&\cdots&1 \end{bmatrix}\\ &=I_{M_i}\in\mathbb{R}^{M_l\times M_l} \end{aligned} b(l)z(l)= b1(l)(w1j(l)a(l1)+b1(l))bMi(l)(w1j(l)a(l1)+b1(l))b1(l)(wMij(l)a(l1)+bi(l))bMi(l)(wMij(l)a(l1)+bi(l)) = 1001 =IMiRMl×Ml
除了上面计算的计算部分外,还剩下关键的一项 ∂ R ( y , y ^ ) ∂ z ( l ) \frac{\partial\mathcal{R}(y,\hat{y})}{\partial z^{(l)}} z(l)R(y,y^),这一项叫第 l l l层的误差项 δ ( l ) \delta^{(l)} δ(l),同样,再次应用链式法则进行计算
δ ( l ) ≜ ∂ L ( y , y ^ ) ∂ z ( l ) = ∂ L ( y , y ^ ) ∂ z ( l + 1 ) ∂ z ( l + 1 ) ∂ a ( l ) ∂ a ( l ) ∂ z ( l ) \begin{aligned} \delta^{(l)}&\triangleq\frac{\partial \mathcal{L}(y,\hat{y})}{\partial z^{(l)}}\\ &=\frac{\partial\mathcal{L}(y,\hat{y})}{\partial z^{(l+1)}}\frac{\partial z^{(l+1)}}{\partial a^{(l)}}\frac{\partial a^{(l)}}{\partial z^{(l)}}\\ \end{aligned} δ(l)z(l)L(y,y^)=z(l+1)L(y,y^)a(l)z(l+1)z(l)a(l)
其中可直接得到
∂ L ( y , y ^ ) ∂ z ( l + 1 ) = δ ( l + 1 ) ∂ z ( l + 1 ) ∂ a ( l ) = ( W ( l + 1 ) ) T \begin{aligned} &\frac{\partial\mathcal{L}(y,\hat{y})}{\partial z^{(l+1)}}=\delta^{(l+1)}\\ &\frac{\partial z^{(l+1)}}{\partial a^{(l)}}=(W^{(l+1)})^T \end{aligned} z(l+1)L(y,y^)=δ(l+1)a(l)z(l+1)=(W(l+1))T
剩下一项计算计算如下
∂ a ( l ) ∂ z ( l ) = ∂ f l ( z ( l ) ) ∂ z ( l ) = [ ∂ f l ( z 1 ( l ) ) ∂ z 1 ( l ) ⋯ ∂ f l ( z M l ( l ) ) ∂ z 1 ( l ) ⋮ ⋱ ⋮ ∂ f l ( z 1 ( l ) ) ∂ z M l ( l ) ⋯ ∂ f l ( z M l ( l ) ) ∂ z M l ( l ) ] = [ f l ′ ( z 1 ( l ) ) ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ f l ′ ( z M l ( l ) ) ] = d i a g ( f l ′ ( z ( l ) ) ) \begin{aligned} \frac{\partial a^{(l)}}{\partial z^{(l)}}&=\frac{\partial f_l(z^{(l)})}{\partial z^{(l)}}\\ &=\begin{bmatrix} \frac{\partial f_l(z_1^{(l)})}{\partial z_1^{(l)}}&\cdots&\frac{\partial f_l(z_{M_l}^{(l)})}{\partial z_1^{(l)}}\\ \vdots&\ddots&\vdots\\ \frac{\partial f_l(z_1^{(l)})}{\partial z_{M_l}^{(l)}}&\cdots&\frac{\partial f_l(z_{M_l}^{(l)})}{\partial z_{M_l}^{(l)}} \end{bmatrix}\\ &=\begin{bmatrix} f_l^\prime(z_1^{(l)})&\cdots&0\\ \vdots&\ddots&\vdots\\ 0&\cdots&f_l^\prime(z_{M_l}^{(l)}) \end{bmatrix}\\ &=\mathrm{diag}(f_l^\prime(z^{(l)})) \end{aligned} z(l)a(l)=z(l)fl(z(l))= z1(l)fl(z1(l))zMl(l)fl(z1(l))z1(l)fl(zMl(l))zMl(l)fl(zMl(l)) = fl(z1(l))00fl(zMl(l)) =diag(fl(z(l)))
因此
δ ( l ) = δ ( l + 1 ) ( W ( l + 1 ) ) T d i a g ( f l ′ ( z ( l ) ) ) = ( δ ( l + 1 ) ( W ( l + 1 ) ) T ) ⊙ f l ′ ( z ( l ) ) ∈ R M l \begin{aligned} \delta^{(l)} &=\delta^{(l+1)}(W^{(l+1)})^T\mathrm{diag}(f_l^\prime(z^{(l)}))\\ &=(\delta^{(l+1)}(W^{(l+1)})^T)\odot f_l^\prime(z^{(l)})\in\mathbb{R}^{M_l} \end{aligned} δ(l)=δ(l+1)(W(l+1))Tdiag(fl(z(l)))=(δ(l+1)(W(l+1))T)fl(z(l))RMl
符号 ⊙ \odot 表示对应位置元素相乘1。从上式中可以看出,第 l l l层的误差项可以由第 l + 1 l+1 l+1层的误差项乘以对应的权重矩阵的转置再乘以对应项激活函数的导数来得到,这个过程就是所谓的反向传播。也就是说,要计算对任意一个参数的偏导数,要从神经网络最后一层先计算出损失函数对最后一层净活性值的偏导数,即误差项 δ ( L ) = ∂ L ∂ z ( L ) \delta^{(L)}=\frac{\partial \mathcal{L}}{\partial z^{(L)}} δ(L)=z(L)L,然后根据上式一层一层向前计算
再带回之前的式子,得到最终梯度为:
∂ L ( y , y ^ ) ∂ w i j ( l ) = δ ( l ) l i ( a j ( l − 1 ) ) = [ δ 1 ( l ) ⋯ δ i ( l ) ⋯ δ M l ( l ) ] [ 0 ⋯ a j ( l − 1 ) ⋯ 0 ] T = δ i ( l ) a j ( l − 1 ) ⇒ ∂ L ( y , y ^ ) ∂ W ( l ) = δ ( l ) ( a ( l − 1 ) ) T ∈ R M l × M l − 1 \begin{aligned} \frac{\partial\mathcal{L}(y,\hat{y})}{\partial w_{ij}^{(l)}} &=\delta^{(l)}\mathbb{l}_i(a_j^{(l-1)})\\ &=\begin{bmatrix}\delta_1^{(l)}&\cdots&\delta_i^{(l)}&\cdots&\delta_{M_l}^{(l)}\end{bmatrix}\begin{bmatrix}0&\cdots&a_j^{(l-1)}&\cdots&0\end{bmatrix}^T\\ &=\delta_i^{(l)}a_j^{(l-1)}\\ \Rightarrow\frac{\partial\mathcal{L}(y,\hat{y})}{\partial W^{(l)}} &=\delta^{(l)}(a^{(l-1)})^T\in\mathbb{R}^{M_l\times M_{l-1}} \end{aligned} wij(l)L(y,y^)W(l)L(y,y^)=δ(l)li(aj(l1))=[δ1(l)δi(l)δMl(l)][0aj(l1)0]T=δi(l)aj(l1)=δ(l)(a(l1))TRMl×Ml1
∂ L ( y , y ^ ) ∂ b ( l ) = δ ( l ) ∈ R M l \frac{\partial \mathcal{L}(y,\hat{y})}{\partial b^{(l)}}=\delta^{(l)}\in\mathbb{R}^{M_l} b(l)L(y,y^)=δ(l)RMl

反向传播算法的伪代码描述
在这里插入图片描述


  1. 计算机视觉领域(CV)论文中“圈加”、“圈乘”和“点乘”的解释以及代码示例(⊕、⊙、⊗、广播、广播机制、element-wise、矩阵、乘法、矩阵乘法、向量)_圈×-CSDN博客 ↩︎

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

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

相关文章

【LeetCode:2786. 访问数组中的位置使分数最大 + 递归 + 记忆化缓存 + dp】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

Real3D:利用真实世界图像扩展3D重建模型

原理: 在3D重建领域,单视图重建任务由于其固有的不确定性而充满挑战。为了克服这一难题,研究者们一直在探索如何利用大型数据集训练模型以学习形状和纹理的通用先验知识。然而,现有训练方法依赖于合成数据或多视图捕获&#xff0c…

U-Mail国产信创邮件系统,让企业通信更加安全可控

信息技术应用创新产业,即信创产业,是信息化建设的核心,它涵盖了从硬件到软件的一系列关键技术。信创产业的目标是通过自主研发,减少对外部技术的依赖,增强信息安全,并提升国内产业的全球竞争力。该产业主要…

java打印99乘法表

public class NineNineMulTable{public static void main(String[] args){for(int i 1; i < 9; i ){for(int j 1; j < i; j ){System.out.print(j " * " i " " i * j "\t");//再次先输出j在输出i是打印出来是1*2&#xff0c;2*2}S…

Allegro X PCB设计小诀窍--如何在Allegro X中快速设置快捷键

背景介绍&#xff1a;我们在进行PCB设计时&#xff0c;经常会用到一些高频次操作&#xff0c;例如移动、复制、删除、旋转、绘制走线、铺铜等&#xff0c;这些操作在软件中通常需要点击对应命令菜单来实现。为了点击这些菜单&#xff0c;设计人员需要通过鼠标频繁的在设计界面进…

积木搭建游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第83讲。 积木搭建游戏&…

三款有3D效果的js图表库

1、G2简洁的渐进式可视化语法。https://g2.antv.antgroup.com/manual/extra-topics/3d-charts 2、 https://www.highcharts.com/https://www.highcharts.com/ 3、https://www.fusioncharts.com/charts/pie-doughnut-charts/donut-chart-in-3d?frameworkjavascripthttps://www…

30V转5V3.5A大电流芯片 30降压12V3.5A DCDC低功耗恒压IC-H4012-车充芯片

H4012芯片是一款同步降压型DC-DC转换器&#xff0c;为高效率和大电流应用设计。它内置了30V耐压的MOS&#xff0c;并支持3.5A的持续输出电流&#xff0c;使得它在需要高功率输出的应用中表现出色。此外&#xff0c;H4012的输出电压可调&#xff0c;可支持100%占空比&#xff0c…

el-cascader 支持多层级,多选(可自定义限制数量),保留最后一级

多功能的 el-cascader 序言&#xff1a;最近遇到一个需求关于级联的&#xff0c;有点东西&#xff0c;这里是要获取某个产品类型下的产品&#xff0c;会存在产品类型和产品在同一级的情况&#xff0c;但是产品类型不能勾选&#xff1b; 情况1&#xff08;二级菜单是产品&…

深度学习笔记: 最详尽估算送达时间系统设计

欢迎收藏Star我的Machine Learning Blog:https://github.com/purepisces/Wenqing-Machine_Learning_Blog。如果收藏star, 有问题可以随时与我交流, 谢谢大家&#xff01; 估算送达时间 1. 问题陈述 构建一个模型来估算在给定订单详情、市场条件和交通状况下的总送达时间。 为…

python-jupyter notebook安装教程

&#x1f308;所属专栏&#xff1a;【python】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的…

Java内存模型,堆、栈和方法区的区别

Java内存管理是Java虚拟机&#xff08;JVM&#xff09;技术的核心之一。了解Java内存管理对于提高程序性能、解决内存泄漏和优化资源利用至关重要。 一、Java内存模型&#xff08;Java Memory Model, JMM&#xff09; Java内存模型描述了Java程序中变量&#xff08;包括实例字…

5.1 Python 函数的参数类型

1. 实参与形参 形参: 函数定义阶段, 括号内定义的参数名(变量名), 形参的表现形式只有一种就是参数命. 实参: 函数调用阶段, 括号内传入的参数值(变量值), 实参的表现形式有很多种(核心: 可以引用到值).两者之间的关系: 函数调用阶段 --> 实参的值绑定给形参名. 函数调用完…

GraphQL(9):Spring Boot集成Graphql简单实例

1 安装插件 我这边使用的是IDEA&#xff0c;需要先按照Graphql插件&#xff0c;步骤如下&#xff1a; &#xff08;1&#xff09;打开插件管理 在IDEA中&#xff0c;打开主菜单&#xff0c;选择 "File" -> "Settings" (或者使用快捷键 Ctrl Alt S …

什么是快乐?

什么是快乐&#xff1f; What is Happiness? 1. 快乐不是追求外在的物质&#xff0c;而是内心的平静与满足。当我们学会感恩&#xff0c;懂得珍惜眼前的一切&#xff0c;心中自然会充满喜悦。快乐并非来自拥有更多&#xff0c;而是感受到已经拥有的足够。每一天都怀抱感激之情…

最新情侣飞行棋高阶羞羞版,解锁私密版情侣小游戏,文末有福利!

今天要跟大家聊聊一种特别有意思的游戏——情侣飞行棋羞羞版。别急着脸红&#xff0c;这可是专为情侣设计的游戏&#xff0c;让你们在轻松愉快的氛围中&#xff0c;增进了解&#xff0c;加深感情。 谈恋爱&#xff0c;不就是两个人在一起&#xff0c;做些有趣的事情吗&#xf…

【INTEL(ALTERA)】Quartus® 软件 Pin Planner 中 Agilex™ 5 FPGA的 HSIO 库可以选择 1.8V VCCIO?

目录 说明 解决方法 说明 由于 Quartus Prime Pro Edition 软件版本 24.1 存在一个问题&#xff0c;Quartus 软件 Pin Planner 中的 I/O 组属性 GUI 允许用户选择 1.8V 作为 HSIO 银行位置的 VCCIO。HSIO bank 支持的有效 VCCIO 电压仅为 1.0V、1.05V、1.1V、1.2V 和 1.3V。…

【SpringBoot + Vue 尚庭公寓实战】地区信息管理接口实现(九)

【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09; 文章目录 【SpringBoot Vue 尚庭公寓实战】地区信息管理接口实现&#xff08;九&#xff09;1、业务说明2、数据逻辑模型3、接口实现3.1、查询省份信息列表3.2、根据省份ID查询城市信息列表3…

Http协议JSON格式

1. 计算机网络 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统。 思考:计算机网络…

基于matlab提取一维数组中非nan的数据

一、使用逻辑索引 使用逻辑索引来选择数组中所有非NaN的元素。逻辑索引是与原数组同型的逻辑数组&#xff0c;true对应的位置将会被选中。 % 假设a是一维数组 a [1, 2, NaN, 4, NaN, 6];% 使用逻辑索引提取非NaN元素 non_nan_elements a(~isnan(a)); 二、使用isnan函数和fi…