张量分解--CP、Tucker分解

news2024/9/25 11:12:24

目录

符号和准备工作

张量

实例

Fiber

Slice

norm

张量内积

秩一张量

回顾一下SVD分解

对角张量

张量的矩阵化与向量化

Kolda水平展开

 具体例子

mode-n product

CP分解

张量CP分解的定义

向量的外积

CP秩

张量CP分解的理解

Tucker分解

线性变化改变向量维度例子


这两种张量分解算法可以被看做是张量奇异值分解的高阶扩展:CP分解将张量分解为秩一张量之和,Tucker分解是主成成分分析(PCA)的高阶形式。

符号和准备工作

张量

张量可以理解为高阶矩阵

实例

在网络测量领域,如果我们想要测量 n 个网络设备之间的延迟,那么,很自然地,在具体的某一时刻,我们会将这 n 个网络设备两两之间通信的延迟表示为一个 n×n 矩阵。接下来,如果我们收集了许多不同时刻的数据,比方说 n3 个时刻,我们将这些数据排列起来,这样就构成了一个 n×n×n3 张量,如下图所示

Fiber

Fiber在张量分解中指的是张量的一维切片。在三维张量中,Fiber可以是沿着某一特定方向的线段,类似于矩阵的行或列。它是张量结构的一个重要组成部分。

Slice

在张量分解中,"slice"指的是张量的二维切片。对于三维张量,一个slice可以看作是沿着特定方向的一个平面切片,就像三维立方体的一面。每个slice都是一个矩阵,张量可以看作是这些矩阵的堆叠。

正面切片也就对应这上文提到的网络延迟的样子。

我们可以对比一下Fiber以及切片的符号表示,可以看出来,Fiber是固定三阶张量的两个维度,切片是固定三阶张量的一个维度。如果扩展到更 n 阶的张量,那么Fiber是固定张量的 n−1 个维度,切片是固定张量的 n−2 个维度

norm

norm"是一个数学术语,用于衡量向量或矩阵的大小。对于向量,norm通常表示向量的长度,对于矩阵,norm可以表示矩阵的某种“大小”或“长度”。

常见的norm包括:

  • L1范数:向量元素的绝对值之和。
  • L2范数:向量元素的平方和的平方根,也称为欧几里得范数。
  • 无穷范数:向量元素的最大绝对值。
  • Frobenius范数:矩阵元素的平方和的平方根。

假设现在有张量 \chi \in R^{I_{1}\times I_{2}\times \cdots I_{N}} ,张量的范数定义为张量的各个元素\chi _{ijk}的平方和开根号,用公式表示如下:

$\|\boldsymbol{X}\|=\sqrt{\sum_{i_{1}=1}^{I_{1}} \sum_{i_{2}=1}^{I_{2}} \cdots \sum_{i_{N}}^{I_{N}} x_{i_{1} i_{2} \cdots i_{N}}^{2}}$

张量内积

向量的内积就是两个向量对应元素乘积之和,结果是个标量,两个向量外积结果是一个矩阵,三个向量外积是一个三阶张量。

此处张量内积的定义和向量内积是类似的,即张量对应元素乘积之和:

\langle\boldsymbol{x}, \boldsymbol{y}\rangle=\sum_{i_{1}=1}^{I_{1}} \sum_{i_{2}=1}^{I_{2}} \cdots \sum_{i_{N}=1}^{I_{N}} x_{i_{1} i_{2} \cdots i_{N}} y_{i_{1} i_{2} \cdots i_{N}}

秩一张量

秩一张量的定义是:如果一个张量可以被表示为一组向量的外积,那么这个张量就被称为秩一张量。具体来说,如果张量 $\mathcal{A} \in R^{n_{1} \times \ldots \times n_{d}}$ 可以被写成 $d$ 个向量的外积,即$\mathcal{A} = \mathbf{v}_{1} \otimes \mathbf{v}_{2} \otimes \ldots \otimes \mathbf{v}_{d}$,那么我们就说张量$\mathcal{A}$ 是秩一的。这里的 $\otimes$ 表示外积运算。

回顾一下SVD分解

一个矩阵可以分解为左右奇异向量矩阵以及一个奇异值矩阵的乘积形式我们现在不妨以另外一种角度来看待矩阵的SVD分解:

我们如果拿出第一个左奇异向量以及第一个右奇异向量,这两个向量做外积,我们就可以得到一个矩阵,同时这两个奇异向量对应同一个奇异值,我们尝试将奇异值理解为这两个向量外积得到的这个矩阵的在原始矩阵中所占的权重,以此类推我们就可以得到所有奇异值对应的左右奇异向量外积的结果矩阵,然后将这些矩阵加起来就得到了原始矩阵。

矩阵SVD分解就是将矩阵分解为许多因子矩阵之和

1.奇异值分解(SVD): 给定一个矩阵M,SVD分解将其分解为三个部分:左奇异向量(U)、奇异值对角矩阵(Σ)和右奇异向量的转置V^T。数学上表示为:
                                                               M = U \cdot \Sigma \cdot V^T

2. 左右奇异向量的外积: 左奇异向量和右奇异向量可以看作矩阵空间的一组基。外积所得的矩阵可以看作这些基的线性组合。

3. 带有权重的因子矩阵: 奇异值对角矩阵Σ包含了矩阵的奇异值,这些值可以看作权重。将权重与左右奇异向量的外积相乘,得到的就是所谓的因子矩阵

4. 因子矩阵之和: 将所有的因子矩阵相加,就可以重构原始矩阵。这就是说,原始矩阵可以看作许多因子矩阵之和。

矩阵做SVD分解以后,奇异值矩阵中第一个奇异值为1,剩下的奇异值都为0。因此,奇异值为1对应的左右奇异向量的外积所得到的矩阵就是原始矩阵。

对角张量

张量的矩阵化与向量化

在张量的分析与计算中,经常希望用一个矩阵代表一个三阶张量。此时,就需要有一种运算,能够将一个三阶张量(三路阵列)经过重新组织或者排列,变成一个矩阵(二路阵列)。将一个三路或N路阵列重新组织成一个矩阵形式的变换称为张量的矩阵化。张量的矩阵化有时也称张量的展开或张量的扁平化。
除了高阶张量的唯一矩阵表示外,一个高阶张量的唯一向量表示也是很多场合感兴趣的。高阶向量的向量化是一种将张量排列成唯一一个向量的变换。

在张量的矩阵化过程中,首先可以分为水平展开与纵向展开,然后可以进一步细分为Kiers展开、LMV展开、Kolda展开。在此,我们仅介绍Kolda水平展开

Kolda水平展开

Kolda于2006年提出该方法,将 $N$阶张量元素$a_{i_{1}, i_{2}, \cdots, i_{N}}$ 映射为模式-n矩阵 $A_{(n)}$ 的元素 $a_{i_{n}, j}^{I_{n} \times I_{1} \cdots I_{n-1} I_{n+1} \cdots I_{N}}$ ,其中

j=1+\sum_{\substack{k=1 \\ k \neq n}}^{N}\left(i_{k}-1\right) J_{k} \quad$ with $\quad J_{k}=\prod_{\substack{m=1 \\ \text { c. }}}^{k-1} I_{m}

 具体例子

$\mathbf{X}_{1}=\left[\begin{array}{llll}1 & 4 & 7 & 10 \\ 2 & 5 & 8 & 11 \\ 3 & 6 & 9 & 12\end{array}\right], \quad \mathbf{X}_{2}=\left[\begin{array}{llll}13 & 16 & 19 & 22 \\ 14 & 17 & 20 & 23 \\ 15 & 18 & 21 & 24\end{array}\right]$

X_{1}X_{2} 代表张量 $\chi$ 的两个正面切片矩阵。该张量的模式-n展开如下所示:

                     $\begin{array}{c}\mathbf{X}_{(1)}=\left[\begin{array}{llllllll}1 & 4 & 7 & 10 & 13 & 16 & 19 & 22 \\ 2 & 5 & 8 & 11 & 14 & 17 & 20 & 23 \\ 3 & 6 & 9 & 12 & 15 & 18 & 21 & 24\end{array}\right] \\ \mathbf{X}_{(2)}=\left[\begin{array}{ccccccc}1 & 2 & 3 & 13 & 14 & 15 \\ 4 & 5 & 6 & 16 & 17 & 18 \\ 7 & 8 & 9 & 19 & 20 & 21 \\ 10 & 11 & 12 & 22 & 23 & 24\end{array}\right] \\ \mathbf{X}_{(3)}=\left[\begin{array}{cccccccccc}1 & 2 & 3 & 4 & 5 & \cdots & 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 & 17 & \cdots & 21 & 22 & 23\end{array}\right]\end{array}$
对于该张量的向量化形式,因为很好理解,因此直接给出该例的向量化结果:

$\operatorname{vec}(\boldsymbol{X})=\left[\begin{array}{c}1 \\ 2 \\ \vdots \\ 24\end{array}\right]$

mode-n product

mode-n product(模式n乘积)是张量与矩阵之间的一种特殊乘积操作。给定一个张量A和一个矩阵 U,mode-n product表示在张量的第n个模式(或维度)上与矩阵相乘。

数学上,mode-n product可以表示为:

(A \times_n U)_{i_1, \ldots, i_{n-1}, j, i_{n+1}, \ldots, i_d} = \sum_{i_n} A_{i_1, \ldots, i_d} \cdot U_{j, i_n}

其中A \times_n U是新的张量,A是原始张量,U是与张量的第n个模式相乘的矩阵。

假设有一个三维张量,可以想象成一个立方体,由许多小立方体组成。每个方向(长度、宽度、高度)都是一个模式。

现在,你想在其中一个方向(例如高度)上与一个矩阵相乘。你可以将立方体切成许多层(每一层都是一个矩阵),然后用给定的矩阵与每一层相乘。

  • 如果你在第一个模式(长度方向)上乘以矩阵,就像将每一行压缩或拉伸。
  • 如果在第二个模式(宽度方向)上乘以矩阵,就像将每一列压缩或拉伸。
  • 如果在第三个模式(高度方向)上乘以矩阵,就像将每一层压缩或拉伸。

这个操作改变了张量的形状,并且可以用于提取信息、降维或其他数学任务。

考虑三阶张量与矩阵的乘积,由于该方法是Tucker定义的,现在常称为Tucker积。

三阶张量的Tucker积: 考虑三阶张量 $\chi \in K^{I_{1} \times I_{2} \times I_{3}}$ 和矩阵 A \in K^{J_{1} \times I_{1}}B \in K^{J_{2} \times I_{2}}$C \in K^{J_{3} \times I_{3}}$的乘积。三阶张量的Tucker模式-1积 $\chi \times_{1} A$ ,模式-2积 $\chi \times_{2} B$ ,模式-3积 $\chi \times{ }_{3} C$分别定义为:

\left(\mathcal{X} \times{ }_{1} A\right)_{j_{1} i_{2} i_{3}}=\sum_{i_{1}=1}^{I_{1}} x_{i_{1} i_{2} i_{3}} a_{j_{1} i_{1}}, \forall j_{1}, i_{2}, i_{3} \\ \left(\mathcal{X} \times{ }_{2} B\right)_{i_{1} j_{2} i_{3}}=\sum_{i_{2}=1}^{I_{2}} x_{i_{1} i_{2} i_{3}} b_{j_{2} i_{2}}, \forall i_{1}, j_{2}, i_{3} \\ \left(\mathcal{X} \times{ }_{3} C\right)_{i_{1} i_{2} j_{3}}=\sum_{i_{3}=1}^{I_{3}} x_{i_{1} i_{2} i_{3}} c_{j_{3} i_{3}}, \forall i_{1}, i_{2}, j_{3} \\

我们先将 $\chi$进行模式-1展开,所得矩阵的维度为 $I_{1} \times I_{2} I_{3}$
我们将张量展开成了一个矩阵,那么模式-n乘积也就变成了两个矩阵相乘,这个大家肯定都不陌生。这两个矩阵的维度分别是 I_{1} \times I_{2} I_{3} 以及 $A \in J_{1} \times I_{1}$,因此,很明显的一点是,如果按照原来的顺序,这两个矩阵是无法直接相乘的,因此我们需要把 $A$放到张量展开矩阵的左边。所得结果是一个 $J_{1} \times I_{2} I_{3}$ 的矩阵,注意,此处我们还需要将这个矩阵还原成张量,所以最终的结果是一个 $J_{1} \times I_{2} \times I_{3}$ 的张量。


CP分解

CP分解是将张量分解为一系列的秩一张量之和。

张量CP分解的定义

对于一个 $\chi \in R^{I \times J \times K}$ ,其CP分解公式如下:

                                                       \boldsymbol{X} \approx \sum_{r=1}^{R} \mathbf{a}_{r} \circ \mathbf{b}_{r} \circ \mathbf{c}_{r}
注意 $a_{r}, b_{r}, c_{r}$的维度分别是 a_{r} \in R^{I}, b_{r} \in R^{J}, c_{r} \in R^{K}R 就是我们所说的 CP秩。更直观的理解看下图:

向量的外积

若向量 $a \in R^{n_{1}}, b \in R^{n_{2}}$ ,则两个向量的外积
\left(a \circ b=a b^{T}\right)_{n_{1} \times n_{2}}
生成一个矩阵。其中符号 “。”表示外积运算。因此两个向量的外积运算从一维向量变为二维矩 阵,增加了一个维度
举例说明,若
                                                        x=\left[\begin{array}{l} 0 \\ 1 \end{array}\right],

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        y=\left[\begin{array}{l} 1 \\ 0 \end{array}\right]

        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        x \circ y=x y^{T}=\left[\begin{array}{ll} 0 & 0 \\ 1 & 0 \end{array}\right]
若向量 $a \in R^{n_{1}}, b \in R^{n_{2}}, c \in R^{n_{3}}$ ,则三个向量的外积
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        a \circ b \circ c=\left(c *\left(a b^{T}\right)\right)_{n_{1} \times n_{2} \times n_{3}}
是一个三阶张量。这里的 “$*$ ” 运算为 $c$ 中第一个元素与矩阵$\left(a b^{T}\right)_{n_{1} \times n_{2}}$ 相乘生成张量的第一 个frontal slice,中第一个元素与矩阵\left(a b^{T}\right)_{n_{1} \times n_{2}} 相乘生成张量的最后一个frontal slice。三个 向量的外积的 3 维的张量,因此每做一次外积运算维度都增加1。

CP秩

对于一个给定的张量,其CP秩是能够精确表示该张量的最小秩一张量的数量。

张量CP分解的理解

$\chi_{111}$ 元素就是张量左上角的元素,我们知道,这个元素一定是各个因子张量左上角的元素之和组 成的。我们不妨来考虑一下上图的第一个因子张量。
在此之前,我们先定义一些新的符号,在上图中 $a_{1}, b_{1}, c_{1}$ 代表三个向量,现在定义$a_{1 i}, b_{1 j}, c_{1 k}$代表这三个向量中不同位置的标量值。为了书写方便,我们将第一个下标1去掉,现 在就变成了 $a_{i}, b_{j}, c_{k}$ 。假设 $I=J=K=3$ ,那么 $a \circ b \circ c$ 如下图所示:

\begin{array}{l} a=\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right] \quad b=\left[\begin{array}{l} b_{1} \\ b_{2} \\ b_{3} \end{array}\right] \quad c=\left[\begin{array}{l} c_{1} \\ c_{2} \\ c_{3} \end{array}\right] \\ a \circ b=\left[\begin{array}{l} a_{1} \\ a_{2} \\ a_{3} \end{array}\right] \times\left[\begin{array}{lll} b_{1} & b_{2} & b_{3} \end{array}\right]=\left[\begin{array}{lll} a_{1} b_{1} & a_{1} b_{2} & a_{1} b_{3} \\ a_{2} b_{1} & a_{2} b_{2} & a_{2} b_{3} \\ a_{3} b_{1} & a_{3} b_{2} & a_{3} b_{3} \end{array}\right] \\ \end{array}

a \circ b \circ c为一个张量

设张量的第一个正面切片为:

$\left[\begin{array}{lll}a_{1} b_{1} c_{1} & a_{1} b_{2} c_{1} & a_{1} b_{3} c_{1} \\ a_{2} b_{1} c_{1} & a_{2} b_{2} c_{1} & a_{2} b_{3} c_{1} \\ a_{3} b_{1} c_{1} & a_{3} b_{2} c_{1} & a_{3} b_{3} c_{1}\end{array}\right]$

张量的第二个正面切片为:

$\left[\begin{array}{ccc}a_{1} b_{1} c_{2} & a_{1} b_{2} c_{2} & a_{1} b_{3} c_{2} \\ a_{2} b_{1} c_{2} & a_{2} b_{2} c_{2} & a_{2} b_{3} c_{2} \\ a_{3} b_{1} c_{2} & a_{3} b_{2} c_{2} & a_{3} b_{3} c_{2}\end{array}\right]$

张量的第三个正面切片为:
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​     $\left[\begin{array}{lll}a_{1} b_{1} c_{3} & a_{1} b_{2} c_{3} & a_{1} b_{3} c_{3} \\ a_{2} b_{1} c_{3} & a_{2} b_{2} c_{3} & a_{2} b_{3} c_{3} \\ a_{3} b_{1} c_{3} & a_{3} b_{2}c_{3}&a_{3}b_{3}c_{3} \end{array}\right]$

也就是说,第一个因子张量的左上角位置元素为 $a_{11} b_{11} c_{11}$ ,第二个因子张量左上角位置元素为 $a_{21} b_{21} c_{21}$ ,以此类推,我们就可以知道 $\chi_{111}=\sum_{R}^{r} a_{r 1} b_{r 1} c_{r 1}$ ,张量 $\chi$其他位置的元素也可 以用同样的方法推导。


        ​​​​​​​        x_{i j k} \approx \sum_{r=1}^{R} a_{i r} b_{j r} c_{k r} \text { for } i=1, \ldots, I, j=1, \ldots, J, k=1, \ldots, K

我们将CP分解中最小的单元看作了不同的向量,向量的外积组成了不同的张量,因子张量之和就是原始张量。

Tucker分解

通常我们认为,CP分解是张量Tucker分解的一种特殊情况。

Tucker分解是主成成分分析(PCA)的高阶形式

通俗来讲,PCA的目的就是用 个主分量概括表达统计相关的 n 个特征,因此PCA算法是一种降维方法。那么,我们之前说Tucker分解是PCA的高阶形式,我们应该也可以尝试用这种降维的思想去理解Tucker分解。

首先,我们需要确立一种思维,我们知道一个矩阵可以理解为一种线性变换,那么对于 $A \times B$, 我们可以理解为在矩阵$A$ 上施加一种线性变换,如果同时考虑矩阵维数变化的话, $A \in R^{I_{1} \times I_{2}}, B \in R^{I_{2} \times I_{3}}$ ,那么 $(A \times B) \in R^{I_{1} \times I_{3}}$我们尝试这样去理解: $A \times B$ 相当 于沿着矩阵的第二个维度施加了线性变化,使得第二个维度由 $I_{2}$ 变成了$I_{3}$

线性变化改变向量维度例子

线性变换 T: V \rightarrow W 可以将一个 n-维向量空间V 映射到一个 m-维向量空间W

这种类型的线性变换通常用m \times n矩阵 A来表示。给定一个n-维向量 \mathbf{x},应用线性变换后,我们得到一个 m-维向量 \mathbf{y},即:

\mathbf{y} = A\mathbf{x}

例如,考虑以下 3 \times 2矩阵 A

A = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix}

这个矩阵可以将一个 2-维向量 \mathbf{x} = \begin{bmatrix} x_1 \\ x_2 \end{bmatrix}映射到一个 3-维向量\mathbf{y},即:

\mathbf{y} = A\mathbf{x} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \\ 5 & 6 \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \end{bmatrix} = \begin{bmatrix} x_1 + 2x_2 \\ 3x_1 + 4x_2 \\ 5x_1 + 6x_2 \end{bmatrix}

这样,我们就通过线性变换将一个 2-维向量映射到了一个 3-维向量。

我们现在来考虑$\chi \times_{1} A$ ,其中张量 $\chi \in R^{I_{1} \times I_{2} \times I_{3}}$ ,矩阵 $A \in R^{J_{1} \times I_{1}}$ ,我们知道这个模式- 1 积的结果是一个 $J_{1} \times I_{2} \times I_{3}$ 的张量,那么我们不妨认为 模式-1积是沿着张量 $\chi$ 的第一个维度施加了线性变换,使得第一个维度从 $I_{1}$ 变化到了 $J_{1}$ 。如果 $J_{1}<I_{1}$ 的话,就相当于沿着张量的第一维度进行了一种降维操作。

现在,我们给出Tucker分解的定义,对于张量 $\chi \in R^{I \times J \times K}$,其Tucker分解形式如下:
        ​​​​​​​        \boldsymbol{X} \approx \mathcal{G} \times{ }_{1} \mathbf{A} \times{ }_{2} \mathbf{B} \times{ }_{3} \mathbf{C}=\sum_{p=1}^{P} \sum_{q=1}^{Q} \sum_{r=1}^{R} g_{p q r} \mathbf{a}_{p} \circ \mathbf{b}_{q} \circ \mathbf{c}= [[\mathcal{G} ;A,B,C]]
其中, $A \in R^{I \times P}, B \in R^{J \times Q}, C \in R^{K \times R}$ 是Tucker分解得到的因子矩阵,
        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        \mathcal{G} \in \mathbb{R}^{P \times Q \times R}

代表核心张量,它的元素代表不同因子矩阵之间相互作用的水平。Tucker分解示意图如下:

 

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

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

相关文章

再见 Xshell替代工具Tabby

替代Xshell 之前经常使用Xshell来操作Linux虚拟机&#xff0c;基本上是够用了。但是Xshell免费使用只供非商业用途&#xff0c;而且如果你想用FTP来进行文件传输的话&#xff0c;还需单独下载Xftp。 无意中发现了另一款开源的终端工具Tabby&#xff0c;它直接集成了SFTP功能&…

一个简单的web应用程序的创建

一个简单的web应用程序的创建 1、数据库设计与创建1.1、数据库系统1.2、Navicat Premium1.3、Power Designer2、使用maven创建SpringBoot项目2.1、配置maven2.2、安装idea2.3、使用idea创建maven项目2.4、根据需要配置pom.xml文件、配置项目启动相关的文件2.5、写SpringBoot项目…

Redis之stream类型解读

目录 基本介绍 数据结构 消息 消费组 消费者 基本使用命令 概述 xadd 命令 xtrim 命令 xdel 命令 xlen 命令 xrange 命令 xread 命令 xgroup 命令 xreadgroup 命令 xack 命令 基本介绍 Redis stream&#xff08;流&#xff09;是一种数据结构&#xff0c;其…

【dasctf】easy_log

base解码可得压缩包密码 二分法盲注 import urllib.parse,re with open(raccess.log,r) as f:logf.readlines() dict1{} count0 #判断逻辑&#xff0c;最后一个fasle则取自身&#xff1b;最后一个为true则加1&#xff1b; for each in log:resre.findall(rflag\),(\d),1\)\)…

CEdit 选中文字实时更新到另一个控件中

有时候&#xff0c;我们会遇到需求&#xff0c;软件中需要让选中一个CEdit控件中的文字实时更新到另一个控件中&#xff0c;实现效果如下所示&#xff1a; 代码如下&#xff1a; BOOL CEditDemoDlg::PreTranslateMessage(MSG* pMsg) { CEdit* pOldEdit (CEdit*)GetDlgIte…

Linux驱动开发一、RK3568把hello编译到Linux内核中运行。‘rk_vendor_read’未定义的引用

1、在字符设备目录下建立hello目录 ~/Linux/rk356x_linux/kernel/drivers/char/hello 2、进入hello目录&#xff0c;新建hello.c、Makefile、Kconfig三个文件 3、Kconfig是打开make menuconfig配置界面是后的选项&#xff0c;这Kconfig是在字符设备下的。 config HELLOtrist…

哪些测试仪器可以用于检测静电中和设备的性能

静电设备性能测试通常需要使用一些专门的仪器来进行。以下是一些常见的静电设备性能测试仪器&#xff1a; 1. 静电电压测试仪&#xff1a;用于测量物体表面的静电电压。它通常可以测量正负电压&#xff0c;并具有高精度和快速响应的特点。 2. 静电电荷仪&#xff1a;用于测量物…

探讨uniapp的页面问题

1 新建页面 uni-app中的页面&#xff0c;默认保存在工程根目录下的pages目录下。 每次新建页面&#xff0c;均需在pages.json中配置pages列表&#xff1b; 未在pages.json -> pages 中注册的页面&#xff0c;uni-app会在编译阶段进行忽略。pages.json的完整配置参考&am…

新能源发电变流关键技术开发

新能源发电变流技术开发 文章目录 新能源发电变流技术开发前言新能源并网电力质量控制电能储存风能、光伏等行业新能源汽车新型城区的能源建设因此,可以说,新能源发电变流技术在电力系统与现代新能源行业中具有重要的应用地位,它对提高新能源发电的可靠性、电力质量、储能等…

基于Java+SpringBoot+Vue前后端分离常规应急物资管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

理解图傅里叶变换和图卷积

图神经网络&#xff08;GNN&#xff09;代表了一类强大的深度神经网络架构。在一个日益互联的世界里&#xff0c;因为信息的联通性&#xff0c;大部分的信息可以被建模为图。例如&#xff0c;化合物中的原子是节点&#xff0c;它们之间的键是边。 图神经网络的美妙之处在于它们…

CSS 属性值计算过程

目录 例子1&#xff0c;确定声明值2&#xff0c;层叠冲突2.1&#xff0c;比较源重要性2.2&#xff0c;比较优先级2.3&#xff0c;比较源次序 3&#xff0c;使用继承4&#xff0c;使用默认值其他 例子 我们来举例说明<h1> 标签最终的样式&#xff1a; <div><h1…

Hugo·Stack主题·杂记

运行环境 hugo版本&#xff1a;v0.117.0&#xff08;扩展版&#xff09; go&#xff1a;1.21.0 PowerShell 7&#xff08;x64&#xff09; Windows10 添加主题 git submodule add https://github.com/CaiJimmy/hugo-theme-stack/ themes/hugo-theme-stack修改配置文件 m…

C语言入门 Day_10 判断的进阶

目录 前言 1.多重判断 2.代码块 3.条件运算符 3.易错点 4.思维导图 前言 if和else能够处理两种不同的情况&#xff0c;如果&#xff08;if&#xff09;满足条件&#xff0c;我们就执行这几行代码&#xff1b;否则&#xff08;else&#xff09;的话&#xff0c;我们就执行…

快速排序三种思路详解!

一、快速排序的介绍 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;…

电脑excel文件误删怎么恢复?分享6种有效方法

在日常办公中&#xff0c;电脑中存储的Excel文件可能会遭遇误删的意外情况&#xff0c;如何快速恢复误删的Excel文件成为许多人关注的热点。本文将介绍几种有效的方法&#xff0c;希望能够帮助您恢复误删的Excel文件。 方法1、从回收站恢复 检查电脑的回收站&#xff0c;如果E…

数字孪生是什么?工厂数字孪生实例分析

数字孪生是建筑物或城市等物理实体的 3D 模型&#xff0c;数字孪生具有实时、连续的数据&#xff0c;可实时更新其功能和流程&#xff0c;从而为工程师提供分析和优化生产流程的数据支撑。简单来说&#xff0c;数字孪生是物理实体的 3D 模型&#xff0c;3D 模型的动画由真实实体…

行业冠军NANK南卡再添新高度,打造百元级开放式蓝牙耳机新标杆!

​最近&#xff0c;国内最受欢迎的开放式耳机品牌NANK南卡推出了一款名为OE CC的产品&#xff0c;它以0感0压为卖点。不断根据用户的反馈进行优化&#xff0c;现如今这款耳机正式在各大平台上架销售。它采用了先进的技术&#xff0c;重新定义了百元级别开放式耳机的三个标准。这…

GD32-舵机的原理

GD32-舵机的原理 舵机的现一脉宽与舵机转动角度 旋转编码器的原理 顺时针&#xff1a;A的下降沿时&#xff0c;B处于高电平&#xff1b; 逆时针&#xff1a;A的下降沿时&#xff0c;B处于低电平&#xff1b; #ifndef _ENCODER_DRIVE_H #define _ENCODER_DRIVE_H#include &quo…

Matlab图像处理运算方法-非线性点运算

常见的非线性灰度变换为对数变换和幂次变换。 对数变换 对数变换的一般表达式为&#xff1a; tclog(1s) 其中c为尺度比例常数&#xff0c;s为输入图像灰度值&#xff0c;t为变换后的输出图像灰度值。在如下图所示的对数曲线上&#xff0c;函数…