当前位置: 首页 > news >正文

matlab使用教程(16)—图论中图的定义与修改

1.修改现有图的节点和边

        此示例演示如何使用 addedge rmedge addnode rmnode findedge findnode subgraph 函数访问和修改 graph digraph 对象中的节点和/或边。

1.1 添加节点

        创建一个包含四个节点和四条边的图。s t 中的对应元素用于指定每条图边的结束节点。
s = [1 1 1 2];
t = [2 3 4 3];
G = graph(s,t)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [4x0 table]
        查看图的边列表。
G.Edges
ans=4×1 table
EndNodes
________
1 2
1 3
1 4
2 3
        使用 addnode 向图中添加五个节点。该命令将添加五个节点 ID 分别为 5 6 7 8 9 的不相连节点。
G = addnode(G,5)
G =
graph with properties:
Edges: [4x1 table]
Nodes: [9x0 table]

1.2 删除节点

        使用 rmnode 从图中删除节点 3、5 和 6。与其中一个已删除节点相连的所有边也会被删除。对图中剩余的六个节点重新进行编号,以反映新的节点数量。
G = rmnode(G,[3 5 6])
G =
graph with properties:
Edges: [2x1 table]
Nodes: [6x0 table]

1.3 添加边

        使用 addedge G 添加两条边。第一条边位于节点 1 和节点 5 之间,第二条边位于节点 2 和节点 5 之间。该命令将向 G.Edges 添加两个新行。
G = addedge(G,[1 2],[5 5])
G =
graph with properties:
Edges: [4x1 table]
Nodes: [6x0 table]

1.4 删除边

        使用 rmedge 删除节点 1 和节点 3 之间的边。该命令将从 G.Edges 中删除一个行。
G = rmedge(G,1,3)
G =
graph with properties:
Edges: [3x1 table]
Nodes: [6x0 table]

1.5 确定边索引

        确定节点 1 和 5 之间的边的边索引。边索引 ei G.Edges 中的行号。
ei = findedge(G,1,5)
ei = 2

1.6 确定节点索引

        在图中添加节点名称,然后确定节点 'd' 的节点索引。数值节点索引 ni G.Nodes 中的行号。使用其他图函数(例如 shortestpath )时,可以同时使用 ni 和节点名称 'd' 来表示节点。
G.Nodes.Name = { 'a' 'b' 'c' 'd' 'e' 'f' }';
ni = findnode(G, 'd' )
ni = 4

1.7 提取子图

        使用 subgraph 提取仅包含两个节点的图部分。
H = subgraph(G,[1 2])
H =
graph with properties:
Edges: [1x1 table]
Nodes: [2x1 table]
        查看子图的边列表。

H.Edges
ans=table
EndNodes
______________
{'a'} {'b'}

1.8 通过变量编辑器修改节点和边表格

        图对象的节点和边信息包含在 Nodes Edges 这两个属性中。这两个属性都是包含变量的表,用于说明图中的节点和边的特性。由于 Nodes Edges 都是表,因此您可以使用变量编辑器以交互方式查看或编辑这些表。您不能使用变量编辑器添加或删除节点或边,也不能编辑 Edges 表的 EndNodes 属性。变量编辑器适用于管理 Nodes Edges 表中的额外节点和边属性。

2.添加图节点名称、边权重和其他属性

        此示例演示如何向使用 graph digraph 创建的图中的节点和边添加属性。当您最初调用 graphdigraph 来创建图时,可以指定节点名称或边权重。但是,此示例演示了如何在创建图后向图添加属性。

2.1 创建图

        创建一个有向图。s t 中的对应元素用于定义图中每条边的源节点和目标节点。
s = [1 1 2 2 3];
t = [2 4 3 4 4];
G = digraph(s,t)
G =
digraph with properties:
Edges: [5x1 table]
Nodes: [4x0 table]

2.2 添加节点名称

        通过将变量 Name 添加到 G.Nodes 表中来向图中添加节点名称。 Name 变量必须指定为 N × 1 字符向量元胞数组或字符串数组,其中 N = numnodes(G) 。添加节点名称时请务必使用 Name 变量,因为该变量名称会被一些图函数进行特殊处理。
G.Nodes.Name = { 'First' 'Second' 'Third' 'Fourth' }';
        查看新的 Nodes 表。
G.Nodes
ans=4×1 table
Name
__________
{'First' }
{'Second'}
{'Third' }
{'Fourth'}
        使用表索引查看节点 1 和 4 的名称。
G.Nodes.Name([1 4])
ans = 2x1 cell
{'First' }
{'Fourth'}

2.3 添加边权重

        通过将变量 Weight 添加到 G.Edges 表中来向图添加边权重。 Weight 变量必须是 M×1 数值向量,其中 M = numedges(G) 。添加边权重时请务必使用 Weight 变量,因为该变量名称会被一些图函数进行特殊处理。
G.Edges.Weight = [10 20 30 40 50]';
        查看新的 Edges 表。
G.Edges
ans=5×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'First' } {'Fourth'} 20
{'Second'} {'Third' } 30
{'Second'} {'Fourth'} 40
{'Third' } {'Fourth'} 50
        使用表索引查看 G.Edges 的第一行和第三行。
G.Edges([1 3],:)
ans=2×2 table
EndNodes Weight
________________________ ______
{'First' } {'Second'} 10
{'Second'} {'Third' } 30

2.4 添加自定义属性

        原则上,您可以将任何变量添加到 G.Nodes G.Edges 中,来定义图节点或边的属性。添加自定义属性很有用,因为 subgraph reordernodes 之类的函数可以保留图属性。例如,可以向 G.Edges 添加名为 Power 的变量,来指示每条边是 'on' 还是 'off'G.Edges.Power = { 'on' 'on' 'on' 'off' 'off' }';
G.Edges
ans=5×3 table
EndNodes Weight Power
________________________ ______ _______
{'First' } {'Second'} 10 {'on' }
{'First' } {'Fourth'} 20 {'on' }
{'Second'} {'Third' } 30 {'on' }
{'Second'} {'Fourth'} 40 {'off'}
{'Third' } {'Fourth'} 50 {'off'}
        向 G.Nodes 添加名为 Size 的变量,来指示每个节点的实际大小。
G.Nodes.Size = [10 20 10 30]';
G.Nodes
ans=4×2 table
Name Size
__________ ____
{'First' } 10
{'Second'} 20
{'Third' } 10
{'Fourth'} 30

2.5 为图论图的节点和边添加标签

        绘制图时,您可以使用 G.Nodes G.Edges 中的变量为图节点和边添加标签。这种做法很方便,因为已经确保这些变量具有正确数量的元素。
        绘制图,并使用 G.Edges 中的 Power 变量为边添加标签。使用 G.Nodes 中的 Size 变量为节点添加标签。
p = plot(G, 'EdgeLabel' ,G.Edges.Power, 'NodeLabel' ,G.Nodes.Size)
p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {'10' '20' '10' '30'}
EdgeLabel: {'on' 'on' 'on' 'off' 'off'}
XData: [2 1.5000 1 2]
YData: [4 3 2 1]
ZData: [0 0 0 0]
Show all properties

3.图的绘制和自定义

        此示例演示如何绘制图,然后自定义显示内容以向图节点和边添加标签或高亮显示。

3.1 绘图对象

        使用 plot 函数绘制 graph digraph 对象。默认情况下, plot 会检查图的大小和类型,以确定要使用的布局。生成的图窗窗口不包含轴刻度线。但是,如果使用 XData YData ZData 名称-值对组指定节点的 (x,y) 坐标,图窗将包含轴刻度线。
        节点数不超过 100 的图会自动包含节点标签。节点标签使用节点名称(如果可用);否则标签为数值节点索引。
        例如,使用巴基球邻接矩阵创建一个图,然后使用所有的默认选项绘制该图。如果您调用 plot 并指定输出参数,则此函数将返回 GraphPlot 对象的句柄。随后,您可以使用该对象调整绘图的属性。例如,可以更改边的颜色或样式、节点的大小和颜色等。
G = graph(bucky);
p = plot(G)

p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {1x60 cell}
EdgeLabel: {}
XData: [0.1033 1.3374 2.2460 1.3509 0.0019 -1.0591 -2.2901 -2.8275 -1.9881 -0.8836 1.5240 0.4128 0.6749 1.9866 2.5705 3.3263 3.5310 3.9022 3.8191 3.5570 1.5481 2.6091 1.7355 0.4849 0.2159 -1.3293 -1.2235 -2.3934 -3.3302 -2.4370 2.4601 ... ]
YData: [-1.8039 -1.2709 -2.0484 -3.0776 -2.9916 -0.9642 -1.2170 0.0739 1.0849 0.3856 0.1564 0.9579 2.2450 2.1623 0.8879 -1.2600 0.0757 0.8580 -0.4702 -1.8545 -3.7775 -2.9634 -2.4820 -3.0334 -3.9854 -3.2572 -3.8936 -3.1331 -2.2357 -2.4880 ... ]
ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Show all properties
        获得 GraphPlot 对象的句柄后,便可以使用点索引访问或更改属性值。有关您可以调整的属性的完整列表,请参阅 GraphPlot 属性。将 NodeColor 的值更改为 'red'
p.NodeColor = 'red' ;

        确定边的线宽。
p.LineWidth
ans = 0.5000

3.2 创建并绘制图

        创建并绘制一个表示 L 形膜的图,L 形膜是基于一侧有 12 个节点的方形网格构建的。使用 plot 指定输出参数以返回 GraphPlot 对象的句柄。
n = 12;
A = delsq(numgrid( 'L' ,n));
G = graph(A, 'omitselfloops' )
G =
graph with properties:
Edges: [130x2 table]
Nodes: [75x0 table]
p = plot(G)
p =
GraphPlot with properties:
NodeColor: [0 0.4470 0.7410]
MarkerSize: 4
Marker: 'o'
EdgeColor: [0 0.4470 0.7410]
LineWidth: 0.5000
LineStyle: '-'
NodeLabel: {1x75 cell}
EdgeLabel: {}
XData: [-2.5225 -2.1251 -1.6498 -1.1759 -0.7827 -2.5017 -2.0929 -1.6027 -1.1131 -0.7069 -2.4678 -2.0495 -1.5430 -1.0351 -0.6142 -2.4152 -1.9850 -1.4576 -0.9223 -0.4717 -2.3401 -1.8927 -1.3355 -0.7509 -0.2292 -2.2479 -1.7828 -1.1871 -0.5239 ... ]
YData: [-3.5040 -3.5417 -3.5684 -3.5799 -3.5791 -3.0286 -3.0574 -3.0811 -3.0940 -3.0997 -2.4191 -2.4414 -2.4623 -2.4757 -2.4811 -1.7384 -1.7570 -1.7762 -1.7860 -1.7781 -1.0225 -1.0384 -1.0553 -1.0568 -1.0144 -0.2977 -0.3097 -0.3229 -0.3152 ... ]
ZData: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
Show all properties

3.3 更改图节点的布局

        使用 layout 函数更改绘图中的图节点的布局。不同的布局选项会自动计算绘图的节点坐标。或者,可以使用 GraphPlot 对象的 XData YData ZData 属性来指定您自己的节点坐标。不使用默认的二维布局方法,而是使用 layout 来指定 'force3' 布局(三维力导向图布局)。
layout(p, 'force3' )
view(3)

3.4 按比例对节点着色

        根据图节点的出入度为它们着色。在该图中,所有内部节点都具有最大度数 4,沿图边的节点的度数为 3,角节点具有最小度数 2。将该节点着色数据存储为 G.Nodes 中的变量 NodeColors
G.Nodes.NodeColors = degree(G);
p.NodeCData = G.Nodes.NodeColors;
colorbar

3.5 按权重列出的边线宽度

        向图边添加一些随机整数权重,然后绘制这些边,使它们的线宽与权重成比例。由于约大于 7 的边线宽度开始变得很复杂,因此缩放线宽,使权重最大的边的线宽为 7。将该边宽数据存储为 G.Edges 中的变量LWidths
G.Edges.Weight = randi([10 250],130,1);
G.Edges.LWidths = 7*G.Edges.Weight/max(G.Edges.Weight);
p.LineWidth = G.Edges.LWidths;

3.6 提取子图

        提取 G 的右上角并将其作为子图绘制,以更便于读取图上的详细信息。新图 H G 继承 NodeColors LWidths 变量,因此最直接的方式就是重新创建之前的绘图自定义项。但是,系统会对 H 中的节点重新进行编号,以将图中的新节点编号考虑在内。
H = subgraph(G,[1:31 36:41]);
p1 = plot(H, 'NodeCData' ,H.Nodes.NodeColors, 'LineWidth' ,H.Edges.LWidths);
colorbar

3.7 为节点和边添加标签

        使用 labeledge 对宽度大于 6 的边添加标签 'Large' labelnode 函数以相似的方式为节点添加标签。
labeledge(p1,find(H.Edges.LWidths > 6), 'Large' )

3.8 突出显示最短路径

        查找子图 H 中节点 11 与节点 37 之间的最短路径。以红色高亮显示沿此路径的边,并增大路径的结束节点的大小。
path = shortestpath(H,11,37)
path = 1×10
11 12 17 18 19 24 25 30 36 37
highlight(p1,[11 37])
highlight(p1,path, 'EdgeColor' , 'r' )
        删除节点标签和颜色栏,并使所有节点都变成黑色。
p1.NodeLabel = {};
colorbar off
p1.NodeColor = 'black' ;

        查找忽略边权重的其他最短路径。以绿色突出显示此路径。
path2 = shortestpath(H,11,37, 'Method' , 'unweighted' )
path2 = 1×10
11 12 13 14 15 20 25 30 31 37
highlight(p1,path2, 'EdgeColor' , 'g' )

3.9 绘制大图

        创建包含数十万个甚至数百万个节点和/或边的图是很常见的。为此,plot 处理大图会略有不同,以保持可读性和性能。处理节点超过 100 个的图时, plot 函数会进行以下调整:
1 默认的图布局方法始终为 'subspace'
2 不会再自动为这些节点添加标签。
3 MarkerSize 属性设置为 2 。(较小的图的标记大小为 4 )。
4 有向图的 ArrowSize 属性设置为 4 。(较小的有向图使用的箭头大小为 7 )。

 

 

相关文章:

matlab使用教程(16)—图论中图的定义与修改

1.修改现有图的节点和边 此示例演示如何使用 addedge 、 rmedge 、 addnode 、 rmnode 、 findedge 、 findnode 及 subgraph 函数访问和修改 graph 或 digraph 对象中的节点和/或边。 1.1 添加节点 创建一个包含四个节点和四条边的图。s 和 t 中的对应元素用于指定每条…...

【C++面向对象】--- 继承 的奥秘(下篇)

个人主页:平行线也会相交💪 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【C之路】💌 本专栏旨在记录C的学习路线,望对大家有所帮助🙇‍ 希望我们一起努力、成长&…...

Android 面试笔记整理-Binder机制

作者:浪人笔记 面试可能会问到的问题 从IPC的方式问到Binder的优势为什么zygote跟其他服务进程的通讯不使用BinderBinder线程池和Binder机制 等等这些问题都是基于你对Binder的理解还有对其他IPC通讯的理解 IPC方式有多少种 传统的IPC方式有Socket、共享内存、管道…...

编程小白的自学笔记十三(python办公自动化读写文件)

系列文章目录 编程小白的自学笔记十二(python爬虫入门四Selenium的使用实例二) 编程小白的自学笔记十一(python爬虫入门三Selenium的使用实例详解) 编程小白的自学笔记十(python爬虫入门二实例代码详解)…...

【Mariadb高可用MHA】

目录 一、概述 1.概念 2.组成 3.特点 4.工作原理 二、案例介绍 1.192.168.42.3 2.192.168.42.4 3.192.168.42.5 4.192.168.42.6 三、实际构建MHA 1.ssh免密登录 1.1 所有节点配置hosts 1.2 192.168.42.3 1.3 192.168.42.4 1.4 192.168.42.5 1.5 192.168.42.6 …...

网络五层协议

应用层(http,https),传输层(udp,tcp),网络层(ip),数据链路层,物理层 什么是http?http 与https 的区别_日晞的博客-CSDN博客 TCP 与UDP 区别_互联网业务udp小包传输_日晞的博客-CSDN博客...

零售行业供应链管理核心KPI指标(一) – 能力、速度、效率和成本

有关零售行业供应链管理KPI指标的综合性分享,涉及到供应链能力、速度、效率和成本总共九大指标,是一个大框架,比较核心也比较综合。 衡量消费品零售企业供应链管理效率和水平的核心KPI通常有哪些? 图片来源-派可数据(…...

MySQL面试题二

1、关系型和非关系型数据库的区别? 关系型数据库的优点 容易理解,因为它采用了关系模型来组织数据。 可以保持数据的一致性。 数据更新的开销比较小。 支持复杂查询(带 where 子句的查询) 非关系型数据库(NOSQL&#x…...

码银送书第五期《互联网广告系统:架构、算法与智能化》

广告平台的建设和完善是一项长期工程。例如,谷歌早于2003年通过收购Applied Semantics开展Google AdSense 项目,而直到20年后的今天,谷歌展示广告平台仍在持续创新和提升。广告平台是负有营收责任的复杂在线平台,对其进行任何改动…...

分布式理论

CAP和BASE CAP C一致性(Consistency) 在分布式环境下,一致性是指数据在多个副本之间能否保持一致性的特征。在一致性的需求下,当一个系统在数据一致的状态下执行更新操作后,应该保证系统的数据仍然处于一致性的状态…...

Excel设置某列或者某行不某行不可以编辑,只读属性

设置单元格只读的三种方式: 1、通过单元格只读按钮,设置为只为 设置行或者列的只读属性,可以设置整行或者整列只读 2、设置单元格编辑控件为标签控件(标签控件不可编辑) 3、通过锁定行,锁定行的修改。锁定的行与只读行的区别在于锁定的行不…...

vue elementui v-for 循环el-table-column 第一列数据变到最后一个

这个动态渲染table表格时发现el-table-column 第一列数据变到最后一个 序号被排到后面 代码 修改后 <el-table:data"tableData"tooltip-effect"dark"style"width: 100%"height"500"><template v-for"(item, index) i…...

宝塔部署阿里云盘webdav

安装Docker 我的系统是CentOS8&#xff0c;如果直接安装会出错&#xff0c;可以看这篇文章&#xff1a;Failed to download metadata for repo ‘appstream‘ docker 国内镜像&#xff1a; http://hub-mirror.c.163.com/下载镜像 宝塔安装docker管理器&#xff0c;然后搜索…...

Ceph分布式存储系统优化分析

Ceph支持多种存储访问接口&#xff0c;现有的多种性能测试工具都可用于Ceph的性能测试&#xff0c;如测试块接口性能的fio&#xff0c;iometer等&#xff1b;测试CephFS接口的filebench&#xff0c;fio等;测试对象接口的cosbench等。Ceph有专用的基准测试集CBT&#xff0c;其包…...

supOS APP开发者课程练习册创建服务(命名:getPropertiesHistory)

创建服务&#xff08;命名&#xff1a;getPropertiesHistory&#xff09;,调用getPropertiesHistory()服务&#xff0c;获取“催化裂化一车间”对象的“重质馏分油_进”最近5分钟内的历史值&#xff0c;每一分钟取一个值&#xff0c;开始时间和结束时间需要调用时间格式化功能集…...

认识excel篇3之数据的有效性(数据验证)

数据有效性不仅能够对单元格的输入数据进行条件限制&#xff0c;还可以在单元格中创建下拉列表菜单方便用户选择输入。如果没有做数据验证&#xff0c;单元格内默认可以输入任意类型的数据。数据验证就是限制单元格输入数据&#xff08;必须输入符合要求的才能输入&#xff09;…...

adb 命令行执行单元测试

文章目录 1、配置 adb 环境变量2、adb 执行测试3、官方文档解读 adb 使用&#xff08;1&#xff09;第一条执行测试的adb命令&#xff08;2&#xff09;am instrument 参数&#xff08;3&#xff09;-e 参数 的 key-value键值对&#xff08;4&#xff09;用法用例 4、存在问题 …...

Ceph入门到精通-Linux下Ceph源码编译和GDB调试

Ceph版本&#xff1a;14.2.22 Linux版本&#xff1a;ubuntu-server 18.04 第一部分 下载Ceph源码 1.1 配置Ceph源码镜像源 Ceph源码是托管在Github上&#xff0c;由于某些原因&#xff0c;国内访问Github网站很慢&#xff0c;所以需要从其他途径加速获取源码。Github官方给出…...

【c语言】动态内存管理(超详细)

他治愈了身边所有人&#xff0c;唯独没有治愈他自己—超脱 csdn上的朋友你们好呀&#xff01;&#xff01;今天给大家分享的是动态内存管理 &#x1f440;为什么存在动态内存分配 我们定义的局部变量在栈区创建 int n 4;//在栈上开辟4个字节大小int arr[10] { 0 };//在栈上开…...

Linux/centos上如何配置管理NFS服务器?

Linux/centos上如何配置管理NFS服务器&#xff1f; 1 NFS基础了解1.1 NFS概述1.2 NFS工作流程 2 安装和启动NFS服务2.1 安装NFS服务器2.2 启动NFS服务 3 配置NFS服务器和客户端3.1 配置NFS服务器3.2 配置NFS客户端 4 实际示例4.1 基本要求4.2 案例实现 1 NFS基础了解 NFS&…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...