PyTorch张量拼接方式【附维度拼接/叠加的数学推导】

news2024/12/23 13:39:50

文章目录

🍃作者介绍:双非本科大三网络工程专业在读,阿里云专家博主,专注于Java领域学习,擅长web应用开发、数据结构和算法,初步涉猎人工智能和前端开发。
🦅个人主页:@逐梦苍穹
📕所属专栏:人工智能
🌻gitee地址:xzl的人工智能代码仓库
✈ 您的一键三连,是我创作的最大动力🌹

1、简介

张量拼接是将两个或多个张量沿指定维度连接起来的操作,这是在神经网络搭建过程中是非常常用的方法。
在深度学习和数据处理的过程中,经常需要将多个张量拼接成一个更大的张量。

张量拼接:

  • 定义:张量拼接是将两个或多个张量沿着指定的维度连接起来,形成一个新的张量。
  • 应用:常用于数据预处理、特征组合、模型输出处理等场景。
  • 要求:被拼接的张量在非拼接维度上的形状必须一致。

2、torch.cat

torch.cat 函数可以将两个张量根据指定的维度拼接起来。

# -*- coding: utf-8 -*-
# @Author: CSDN@逐梦苍穹
# @Time: 2024/7/17 1:28
import torch


def test():
    data1 = torch.randint(0, 10, [3, 5, 4])
    data2 = torch.randint(0, 10, [3, 5, 4])
    print(data1)
    print(data2)
    print('-' * 50)
    # 1. 按0维度拼接
    new_data = torch.cat([data1, data2], dim=0)
    print(new_data.shape)
    print('-' * 50)
    # 2. 按1维度拼接
    new_data = torch.cat([data1, data2], dim=1)
    print(new_data.shape)
    # 3. 按2维度拼接
    new_data = torch.cat([data1, data2], dim=2)
    print(new_data)


if __name__ == '__main__':
    test()

运行结果:

E:\anaconda3\python.exe D:\Python\AI\PyTorch\11-张量拼接.py 
tensor([[[0, 7, 4, 8],
         [7, 7, 9, 6],
         [2, 6, 8, 2],
         [7, 1, 0, 3],
         [8, 0, 2, 4]],

        [[0, 1, 0, 9],
         [5, 1, 9, 8],
         [7, 8, 8, 5],
         [0, 6, 0, 0],
         [0, 8, 9, 2]],

        [[4, 2, 2, 3],
         [7, 9, 0, 9],
         [2, 7, 8, 8],
         [6, 9, 8, 5],
         [3, 6, 9, 8]]])
tensor([[[7, 2, 3, 8],
         [3, 1, 6, 3],
         [4, 0, 2, 8],
         [6, 9, 8, 9],
         [1, 1, 5, 2]],

        [[4, 0, 2, 2],
         [0, 0, 7, 4],
         [9, 3, 9, 2],
         [1, 5, 9, 5],
         [7, 5, 7, 6]],

        [[1, 8, 3, 9],
         [4, 2, 6, 4],
         [6, 6, 6, 9],
         [2, 5, 0, 5],
         [9, 0, 1, 2]]])
--------------------------------------------------
torch.Size([6, 5, 4])
--------------------------------------------------
torch.Size([3, 10, 4])
tensor([[[0, 7, 4, 8, 7, 2, 3, 8],
         [7, 7, 9, 6, 3, 1, 6, 3],
         [2, 6, 8, 2, 4, 0, 2, 8],
         [7, 1, 0, 3, 6, 9, 8, 9],
         [8, 0, 2, 4, 1, 1, 5, 2]],

        [[0, 1, 0, 9, 4, 0, 2, 2],
         [5, 1, 9, 8, 0, 0, 7, 4],
         [7, 8, 8, 5, 9, 3, 9, 2],
         [0, 6, 0, 0, 1, 5, 9, 5],
         [0, 8, 9, 2, 7, 5, 7, 6]],

        [[4, 2, 2, 3, 1, 8, 3, 9],
         [7, 9, 0, 9, 4, 2, 6, 4],
         [2, 7, 8, 8, 6, 6, 6, 9],
         [6, 9, 8, 5, 2, 5, 0, 5],
         [3, 6, 9, 8, 9, 0, 1, 2]]])

Process finished with exit code 0

3、torch.stack

torch.stack 函数可以将两个张量根据指定的维度叠加起来.

def test2():
    data1 = torch.randint(0, 10, [2, 3])
    data2 = torch.randint(0, 10, [2, 3])
    print(data1)
    print(data2)

    new_data = torch.stack([data1, data2], dim=0)
    print(new_data)
    print(new_data.shape)

    new_data = torch.stack([data1, data2], dim=1)
    print(new_data)
    print(new_data.shape)

    new_data = torch.stack([data1, data2], dim=2)
    print(new_data)
    print(new_data.shape)

输出:

E:\anaconda3\python.exe D:\Python\AI\PyTorch\11-张量拼接.py 
tensor([[4, 2, 9],
        [5, 2, 2]])
tensor([[8, 4, 7],
        [4, 7, 3]])
tensor([[[4, 2, 9],
         [5, 2, 2]],

        [[8, 4, 7],
         [4, 7, 3]]])
torch.Size([2, 2, 3])
tensor([[[4, 2, 9],
         [8, 4, 7]],

        [[5, 2, 2],
         [4, 7, 3]]])
torch.Size([2, 2, 3])
tensor([[[4, 8],
         [2, 4],
         [9, 7]],

        [[5, 4],
         [2, 7],
         [2, 3]]])
torch.Size([2, 3, 2])

Process finished with exit code 0

4、数学过程

维度拼接和维度叠加的本质区别:

维度拼接不改变矩阵维度
维度叠加会增加矩阵维度

4.1、维度拼接

先说结论:

  1. 维度拼接的本质,就是沿着轴方向进行拼接
  2. 轴的编号定义,由外往内依次为0,1,2,…,n

4.1.1、二维张量

先用简单的二维张量引入

假设有两个二维张量 A 和 B:
[ A = ( 1 2 3 4 ) ] [ A = \begin{pmatrix} 1 & 2 \\ 3 & 4 \end{pmatrix} ] [A=(1324)] [ B = ( 5 6 7 8 ) ] [ B = \begin{pmatrix} 5 & 6 \\ 7 & 8 \end{pmatrix} ] [B=(5768)]
沿着第0维度(行)拼接,会将B的行追加到A的行后面:
[ cat ( A , B , dim = 0 ) = ( 1 2 3 4 5 6 7 8 ) ] [ \text{cat}(A, B, \text{dim} = 0) = \begin{pmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \\ 7 & 8 \end{pmatrix} ] [cat(A,B,dim=0)= 13572468 ]
沿着第1维度(列)拼接,会将B的列追加到A的列后面:
[ cat ( A , B , dim = 1 ) = ( 1 2 5 6 3 4 7 8 ) ] [ \text{cat}(A, B, \text{dim} = 1) = \begin{pmatrix} 1 & 2 & 5 & 6 \\ 3 & 4 & 7 & 8 \end{pmatrix} ] [cat(A,B,dim=1)=(13245768)]

4.1.2、三维张量

假设我们有两个张量 A A A B B B,它们的形状都是 [3,5,4]。
这里我们使用以下符号表示它们的元素:
A = a i j k A=a_{ijk} A=aijk B = b i j k B=b_{ijk} B=bijk
其中 i i i 的范围是 [0,2], j j j 的范围是 [0,4], k k k 的范围是 [0,3]。
按 0 维度拼接
当我们沿着第 0 维度拼接时,新张量 C C C 的形状变为 [6,5,4]。
具体来说,新张量 C C C 的元素定义如下:
[ C i j k = { a i j k if  i < 3 b ( i − 3 ) j k if  i ≥ 3 ] [ C_{ijk} = \begin{cases} a_{ijk} & \text{if } i < 3 \\ b_{(i-3)jk} & \text{if } i \geq 3 \end{cases} ] [Cijk={aijkb(i3)jkif i<3if i3]
这意味着新张量 C C C 的前 3 个切片是 A A A 的所有元素,接下来的 3 个切片是 B B B 的所有元素。
按 1 维度拼接
当我们沿着第 1 维度拼接时,新张量 D D D 的形状变为 [3,10,4]。
具体来说,新张量 D D D 的元素定义如下:
[ D i j k = { a i ( j k ) if  j < 5 b i ( j − 5 ) k if  j ≥ 5 ] [ D_{ijk} = \begin{cases} a_{i(jk)} & \text{if } j < 5 \\ b_{i(j-5)k} & \text{if } j \geq 5 \end{cases} ] [Dijk={ai(jk)bi(j5)kif j<5if j5]
这意味着新张量 D D D 的前 5 列是 A A A 的所有列,接下来的 5 列是 B B B 的所有列。
按 2 维度拼接
当我们沿着第 2 维度拼接时,新张量 E E E 的形状变为 [3,5,8]。
具体来说,新张量 E E E 的元素定义如下:
[ E i j k = { a i j ( k ) if  k < 4 b i j ( k − 4 ) if  k ≥ 4 ] [ E_{ijk} = \begin{cases} a_{ij(k)} & \text{if } k < 4 \\ b_{ij(k-4)} & \text{if } k \geq 4 \end{cases} ] [Eijk={aij(k)bij(k4)if k<4if k4]
这意味着新张量 E E E 的前 4 个深度切片是 A A A的所有深度切片,接下来的 4 个深度切片是 B B B 的所有深度切片。

4.1.3、具体实例

为了更好地理解,我们举个例子。假设:
A = ( ( 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ) ( 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 ) ( 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 ) ) A = \begin{pmatrix} \begin{pmatrix} 1 & 2 & 3 & 4 \\ 5 & 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \\ 17 & 18 & 19 & 20 \end{pmatrix} \\ \begin{pmatrix} 21 & 22 & 23 & 24 \\ 25 & 26 & 27 & 28 \\ 29 & 30 & 31 & 32 \\ 33 & 34 & 35 & 36 \\ 37 & 38 & 39 & 40 \end{pmatrix} \\ \begin{pmatrix} 41 & 42 & 43 & 44 \\ 45 & 46 & 47 & 48 \\ 49 & 50 & 51 & 52 \\ 53 & 54 & 55 & 56 \\ 57 & 58 & 59 & 60 \end{pmatrix} \end{pmatrix} A= 1591317261014183711151948121620 2125293337222630343823273135392428323640 4145495357424650545843475155594448525660 B = ( ( 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 ) ( 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 ) ( 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 ) ) B = \begin{pmatrix} \begin{pmatrix} 101 & 102 & 103 & 104 \\ 105 & 106 & 107 & 108 \\ 109 & 110 & 111 & 112 \\ 113 & 114 & 115 & 116 \\ 117 & 118 & 119 & 120 \end{pmatrix} \\ \begin{pmatrix} 121 & 122 & 123 & 124 \\ 125 & 126 & 127 & 128 \\ 129 & 130 & 131 & 132 \\ 133 & 134 & 135 & 136 \\ 137 & 138 & 139 & 140 \end{pmatrix} \\ \begin{pmatrix} 141 & 142 & 143 & 144 \\ 145 & 146 & 147 & 148 \\ 149 & 150 & 151 & 152 \\ 153 & 154 & 155 & 156 \\ 157 & 158 & 159 & 160 \end{pmatrix} \end{pmatrix} B= 101105109113117102106110114118103107111115119104108112116120 121125129133137122126130134138123127131135139124128132136140 141145149153157142146150154158143147151155159144148152156160

  1. 按 0 维度拼接:

[ C = ( A 1 , : , : A 2 , : , : A 3 , : , : B 1 , : , : B 2 , : , : B 3 , : , : ) ] [ C = \begin{pmatrix} A_{1,:,:} \\ A_{2,:,:} \\ A_{3,:,:} \\ B_{1,:,:} \\ B_{2,:,:} \\ B_{3,:,:} \end{pmatrix} ] [C= A1,:,:A2,:,:A3,:,:B1,:,:B2,:,:B3,:,: ]

  1. 按 1 维度拼接:

[ D = ( A : , 1 , : B : , 1 , : A : , 2 , : B : , 2 , : A : , 3 , : B : , 3 , : A : , 4 , : B : , 4 , : A : , 5 , : B : , 5 , : ) ] [ D = \begin{pmatrix} A_{:,1,:} & B_{:,1,:} \\ A_{:,2,:} & B_{:,2,:} \\ A_{:,3,:} & B_{:,3,:} \\ A_{:,4,:} & B_{:,4,:} \\ A_{:,5,:} & B_{:,5,:} \end{pmatrix} ] [D= A:,1,:A:,2,:A:,3,:A:,4,:A:,5,:B:,1,:B:,2,:B:,3,:B:,4,:B:,5,: ]

  1. 按 2 维度拼接:

[ E = ( A : , : , 1 B : , : , 1 A : , : , 2 B : , : , 2 A : , : , 3 B : , : , 3 A : , : , 4 B : , : , 4 ) ] [ E = \begin{pmatrix} A_{:,:,1} & B_{:,:,1} \\ A_{:,:,2} & B_{:,:,2} \\ A_{:,:,3} & B_{:,:,3} \\ A_{:,:,4} & B_{:,:,4} \end{pmatrix} ] [E= A:,:,1A:,:,2A:,:,3A:,:,4B:,:,1B:,:,2B:,:,3B:,:,4 ]

这么看也许还是有些抽象,下面用画图的形式帮助理解。
三个轴由内到外:
1721156157361.png
零维拼接:
1721156225191.png
一维拼接:
1721156245189.png
二维拼接:
1721156260076.png

4.2、维度叠加

维度叠加中的0维、1维、2维叠加具体描述了在多维张量(tensor)操作中,如何将多个张量沿某个特定维度堆叠成一个新的更高维度的张量。通过例子和相应的 LaTeX 表达式,可以更清晰地理解这些操作。
维度叠加的概念
假设我们有两个形状相同的张量 A 和 B,形状为 [𝑑0,𝑑1,𝑑2][d0,d1,d2]。
维度叠加就是在现有维度基础上增加一个新的维度来合并这些张量。

假设矩阵 A A A B B B 为:
A = ( 1 2 3 4 5 6 ) A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} A=(142536) B = ( 7 8 9 10 11 12 ) B = \begin{pmatrix} 7 & 8 & 9 \\ 10 & 11 & 12 \end{pmatrix} B=(710811912)

4.2.1、0维叠加

0维叠加表示在新增加的第0维度上堆叠多个张量。这会在现有张量的前面增加一个新维度。
操作: C = s t a c k ( A , B , d i m = 0 ) C=stack(A,B,dim=0) C=stack(A,B,dim=0)
结果: C = ( ( 1 2 3 4 5 6 ) ( 7 8 9 10 11 12 ) ) C = \begin{pmatrix} \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} \\ \begin{pmatrix} 7 & 8 & 9 \\ 10 & 11 & 12 \end{pmatrix} \end{pmatrix} C= (142536)(710811912)
新张量形状:[2,2,3]

4.2.2、1维叠加

1维叠加表示在第1维度上堆叠多个张量。这会在现有张量的第二个维度上增加一个新维度。
操作: C = s t a c k ( A , B , d i m = 1 ) C=stack(A,B,dim=1) C=stack(A,B,dim=1)
结果: C = ( ( 1 2 3 ) ( 7 8 9 ) ( 4 5 6 ) ( 10 11 12 ) ) C = \begin{pmatrix} \begin{pmatrix} 1 & 2 & 3 \end{pmatrix} & \begin{pmatrix} 7 & 8 & 9 \end{pmatrix} \\ \begin{pmatrix} 4 & 5 & 6 \end{pmatrix} & \begin{pmatrix} 10 & 11 & 12 \end{pmatrix} \end{pmatrix} C=((123)(456)(789)(101112))
新张量形状:[2,2,3]

4.2.3、2维叠加(非常重要⭐)

2维叠加表示在第2维度上堆叠多个张量。这会在现有张量的第三个维度上增加一个新维度。
操作: C = s t a c k ( A , B , d i m = 2 ) C=stack(A,B,dim=2) C=stack(A,B,dim=2)
结果: C = ( ( 1 7 2 8 3 9 ) ( 4 10 5 11 6 12 ) ) C = \begin{pmatrix} \begin{pmatrix} 1 & 7 \\ 2 & 8 \\ 3 & 9 \end{pmatrix} & \begin{pmatrix} 4 & 10 \\ 5 & 11 \\ 6 & 12 \end{pmatrix} \end{pmatrix} C= 123789 456101112
新张量形状:[2,3,2]

前面的都好理解,不再展开,
下面详解如何二位叠加。

维度叠加中的二维叠加意味着在第三个维度上堆叠张量。
这种叠加方式实际上增加了一个新维度,将两个张量的对应元素组合在一起。
具体来说,对于每个位置 ( i , j ) (i,j) (i,j),新的张量在该位置上包含两个元素,一个来自 A A A,一个来自 B B B

计算步骤:
对于位置 (1,1): A 11 = 1 , B 11 = 7 A_{11}=1,B_{11}=7 A11=1,B11=7
在2维叠加之后,新张量在位置 (1,1) 上的元素为: C 11 = ( 1 7 ) C_{11} = \begin{pmatrix} 1 \\ 7 \end{pmatrix} C11=(17)
对于位置 (1,2): A 12 = 2 , B 12 = 8 A_{12}=2,B_{12}=8 A12=2,B12=8
在2维叠加之后,新张量在位置 (1,2) 上的元素为: C 12 = ( 2 8 ) C_{12}=\begin{pmatrix} 2 \\ 8 \end{pmatrix} C12=(28)
对于位置 (1,3): A 13 = 3 , B 13 = 9 A_{13}=3,B_{13}=9 A13=3,B13=9
在2维叠加之后,新张量在位置 (1,3) 上的元素为: C 13 = ( 3 9 ) C_{13}=\begin{pmatrix} 3 \\ 9 \end{pmatrix} C13=(39)
继续这样处理所有位置,得到新的张量 C C C 的形状为 [2,3,2],每个位置上的元素包含两个来自原始张量的元素。
新张量 C C C 的具体表示: C = ( ( 1 7 2 8 3 9 ) ( 4 10 5 11 6 12 ) ) C = \begin{pmatrix} \begin{pmatrix} 1 & 7 \\ 2 & 8 \\ 3 & 9 \end{pmatrix} \\ \begin{pmatrix} 4 & 10 \\ 5 & 11 \\ 6 & 12 \end{pmatrix} \end{pmatrix} C= 123789 456101112

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

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

相关文章

Android14之调试广播实例(二百二十五)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

Linux的热插拔UDEV机制和守护进程

目录 一、Linux的热插拔UDEV机制 二、守护进程 2.1 守护进程概念和基本特点&#xff1a; 2.2 显示进程信息&#xff1a; 2.3 守护进程和后台进程的区别&#xff1a; 2.4 创建守护进程的步骤和守护进程的特征&#xff1a; 2.4.1 创建守护进程的步骤&#xff1a; 2.4.2 守…

京东Android一面凉经(2024)

京东Android一面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《京东Android一面凉经(2024)》。 面试职位: Android开发工程师 技术一面 面试时长: 50…

Plant simulation 中快速创建相同属性轨道的方法

问题&#xff1a;默认的轨道宽度是0.3m&#xff0c;默认轨道是水平的。如果要创建大量宽度1m&#xff0c;竖着的轨道有没有效率的方法呢&#xff1f;答案肯定是有的&#xff0c;按下面方法操作即可。 1、复制两个轨道模型到用户对象中&#xff0c;命名为水平轨道和竖直轨道。 …

开源免费的一个企业级商城系统

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 系统简介 ShopXO&#xff1a; 是一款企业级免费开源商城系统&#xff0c;具备可视化DIY拖拽装修功能&#xff0…

[240720] X-CMD 发布 v0.4.1:新增 OpenAI GPT-4o mini 模型|优化 df ip dns ...

目录 X-CMD 发布 v0.4.1✨ openai✨ chat✨ df✨ ip✨ kev✨ dns✨ shodan✨ pick✨ theme X-CMD 发布 v0.4.1 ✨ openai 更新 X-CMD 现已支持 OpenAI 最新模型 GPT-4o mini&#xff01; &#x1f389; 用户只需使用 gpt4om 即可直接调用这款强大的模型。gpt 的默认模型由 g…

PyTorch张量数值计算

文章目录 1、张量基本运算2、阿达玛积3、点积运算4、指定运算设备⭐5、解决在GPU运行PyTorch的问题 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&am…

计算机的错误计算(三十二)

摘要 在计算机的错误计算&#xff08;二十八&#xff09;与&#xff08;三十 一&#xff09;中&#xff0c;我们探讨了 Visual Studio 对 6个随机exp(x)函数的计算精度问题。根据网友的反馈&#xff0c;本节将展示 Python 对它们的输出&#xff1a;结果几乎与 Visual Studio …

C# —— CRC16 算法

CRC16:即循环冗余校验码。数据通信当中一种常用的查错校验码 其特征信息字段和校验字段的长度可以是任意选定的&#xff0c;对数据进行指定多项式计算 并且将得到的结果附加在帧的后面&#xff0c;接受的设备也执行类似的算法&#xff0c;以保证数据传输的正确性和完整性 crc…

ELK日志收集

一、什么是ELK ELK 是由 Elasticsearch、Logstash、Kibana 三个开源软件的组成的一个组合体&#xff0c;ELK 是 elastic 公司研发的一套完整的日志收集、分析和展示的企业级解决方案。 ELK 的好处&#xff1a; ELK 组件在大数据运维系统中&#xff0c;主要可解决的问题如下&…

录取查询老师在哪里制作?

随着考试的落幕&#xff0c;家长们焦急等待的心情终于可以稍微缓解&#xff0c;因为录取结果即将揭晓。然而&#xff0c;对于老师来说&#xff0c;这仅仅是另一项繁重工作的开始。他们需要将每一份录取通知单逐一发送给学生家长&#xff0c;这个过程不仅耗时而且容易出错。面对…

基于SSM的高考志愿选择辅助系统

基于SSM的高考志愿选择辅助系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台 前台首页 院校展示 后台 后台首页 学校管理 摘要 随着高考制度的不断完…

数据结构 day4

目录 思维导图&#xff1a; 学习内容&#xff1a; 1. 链表的引入 1.1 顺序表的优缺点 1.1.1 优点 1.1.2 不足 1.1.3 缺点 1.2 链表的概念 1.2.1 链式存储的线性表叫做链表 1.2.2 链表的基础概念 1.3 链表的分类 2. 单向链表 2.1 节点结构体类型 2.2 创建链表 2.…

C语言 ——— 浮点数类型 在 内存中 的 存储模式

目录 浮点数存储规则 单\双精度浮点数 存储 S、M、E 的布局 有效数字M 和 指数位E 的特殊规定 浮点数在内存中是否存储的S、M、E 浮点数存储规则 根据国际标准IEEE754&#xff08;电气和电子工程协会&#xff09;规定&#xff1a;任意一个 浮点数F的二进制 都可以表示成…

19集 两款ESP32开发板如何选择?-《MCU嵌入式AI开发笔记》

19集 两款ESP32开发板我们用哪款&#xff1f;-《MCU嵌入式AI开发笔记》 有两款ESP32的开发板分别是ESP32 S3 和C3的&#xff0c;我们该如何选择&#xff1f; 1、ESP32-S3-BOX-3 在乐鑫官网上&#xff0c;https://www.espressif.com.cn/zh-hans/products/devkits 有ESP32S3 B…

Unity UGUI 之 Canvas画布

本文仅作学习笔记与交流&#xff0c;不作任何商业用途 本文包括但不限于unity官方手册&#xff0c;唐老狮&#xff0c;麦扣教程知识&#xff0c;引用会标记&#xff0c;如有不足还请斧正 1.UGUI是什么 首先官方手册导向了这两个连接&#xff0c;里面是ugui的基本教程 帆布 |U…

【全面升级!短视频运营利器揭秘】短视频矩阵系统

短视频矩阵通常是指一种内容分发策略&#xff0c;它通过构建一个包含多种不同类型、主题或风格短视频的内容平台架构。这个矩阵可能会包括搞笑、教育、音乐、美食、旅游等各种短视频形式&#xff0c;让用户可以根据兴趣选择观看。每个视频可以视为矩阵中的一个节点&#xff0c;…

JVM-垃圾回收与内存分配

目录 垃圾收集器与内存分配策略 引用 对象的访问方式有哪些?&#xff08;句柄和直接指针&#xff09; Java的引用有哪些类型? 如何判断对象是否是垃圾? 请列举一些可作为GC Roots的对象? 对象头了解吗? mark word&#xff08;hashcode、分代、锁标志位&#xff09;、…

Linux 12:多线程2

1. 生产者消费者模型 生产者消费者模型有三种关系&#xff0c;两个角色&#xff0c;一个交易场所。 三种关系&#xff1a; 生产者之间是什么关系?竞争 - 互斥 消费者和消费者之间?竞争 - 互斥 消费者和消费者之间?互斥和同步 两个角色&#xff1a; 生产者和消费者 一个交…

记录|C# winform布局学习

目录 前言一、自适应布局Step1. 添加AutoAdaptWindowsSize类Step2. Form中引用Step3. 创建SizeChanged事件函数Step4. 在Fram.Disiger中添加 更新时间 前言 参考视频&#xff1a; C#5分钟winform快速自适应布局 参考文章&#xff1a; 其他参考&#xff1a; 写这篇文章&#xff…