【深度学习】详解矩阵乘法、点积,内积,外积、哈达玛积极其应用|tensor系列02

news2025/4/22 9:54:14

在这里插入图片描述

  • 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
  • 博主主页: @Yaoyao2024
  • 往期回顾:【深度学习】你真的理解张量了吗?|标量、向量、矩阵、张量的秩|01
  • 每日一言🌼: “脑袋想不明白的,就用脚想”——《走吧,张小砚》🌺

0、前言

在张量的操作的时候,有下面几个概念总容易弄混:

  • 点积
  • 内积
  • 外积
  • 哈达玛积(Hadamard Product
  • 矩阵乘法

这篇博客,我将结合这三种操作在深度学习中的运用,来讲解一下这三种操作的区别。

1、点积(Dot Product)

点积定义和计算:

点积是两个向量的之间的二元运算,结果为标量。数学意义上:取两个相等长度的数字序列(通常是坐标向量,也就是坐标点),并返回一个数字。

对于向量(一阶张量) u = [ u 1 , u 2 , ⋯   , u n ] \mathbf{u} = [u_1, u_2, \cdots, u_n] u=[u1,u2,,un] v = [ v 1 , v 2 , ⋯   , v n ] \mathbf{v} = [v_1, v_2, \cdots, v_n] v=[v1,v2,,vn] u , v ∈ R n \mathbf{u},\mathbf{v}\in\mathbb{R}^n u,vRn,点积的定义为: 逐元素相乘,再相加

u ⋅ v = ∑ i = 1 n u i v i \mathbf{u}\cdot\mathbf{v}=\sum_{i=1}^nu_iv_i uv=i=1nuivi

在欧几里得空间中,点积也可表示为:
u ⋅ v = ∥ u ∥ ∥ v ∥ cos ⁡ θ  ( θ  为夹角)  \mathbf{u}\cdot\mathbf{v}=\|\mathbf{u}\|\|\mathbf{v}\|\cos\theta\text{ (}\theta\text{ 为夹角) } uv=u∥∥vcosθ (θ 为夹角

示例:
[ 1 2 ] ⋅ [ 3 4 ] = 1 × 3 + 2 × 4 = 11 \begin{bmatrix}1\\2\end{bmatrix}\cdot\begin{bmatrix}3\\4\end{bmatrix}=1\times3+2\times4=11 [12][34]=1×3+2×4=11

特点:

  • 仅适用于向量(一阶张量)。
  • 满足交换律 u ⋅ v = v ⋅ u \mathbf{u}\cdot\mathbf{v}=\mathbf{v}\cdot\mathbf{u} uv=vu
  • 是内积在欧几里得空间中的特例(当内积空间为 R n \mathbb{R}^n Rn且权重矩阵为单位矩阵时)

在深度学习中的应用

首先代码是:

# 点积(向量)
u = torch.tensor([1, 2, 3])
v = torch.tensor([4, 5, 6])
# NumPy
dot_product = np.dot(u, v)  # 或 u @ v,一维矩阵相乘=向量点乘

# PyTorch
dot_product = torch.dot(u, v)  # 一维张量
  1. 余弦相似度(Cosine Similarity):
    归一化点积用于衡量向量相似性:
    cos ⁡ ( θ ) = u ⋅ v ∥ u ∥ ∥ v ∥ = ∑ i = 1 n u i v i ∑ i = 1 n u i 2 ∑ i = 1 n v i 2 \cos(\theta)=\frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\| \|\mathbf{v}\|} = \frac{\sum_{i=1}^{n} u_i v_i}{\sqrt{\sum_{i=1}^{n} u_i^2} \sqrt{\sum_{i=1}^{n} v_i^2}} cos(θ)=u∥∥vuv=i=1nui2 i=1nvi2 i=1nuivi

    其中:

    • u ⋅ v \mathbf{u} \cdot \mathbf{v} uv 表示向量 u \mathbf{u} u v \mathbf{v} v 的点积,即 ∑ i = 1 n u i v i \sum_{i=1}^{n} u_i v_i i=1nuivi

    • ∥ u ∥ \|\mathbf{u}\| u ∥ v ∥ \|\mathbf{v}\| v 分别表示向量 u \mathbf{u} u v \mathbf{v} v L 2 L_2 L2 范数(也称为欧几里得范数),计算公式分别为 ∑ i = 1 n u i 2 \sqrt{\sum_{i=1}^{n} u_i^2} i=1nui2 ∑ i = 1 n v i 2 \sqrt{\sum_{i=1}^{n} v_i^2} i=1nvi2

    • 余弦相似度常用于对比学习(Contrastive Learning)或推荐系统。

    # 计算两个特征向量的余弦相似度
    def cosine_similarity(u, v, eps=1e-8):
        dot_product = torch.dot(u, v)
        norm_u = torch.norm(u)
        norm_v = torch.norm(v)
        return dot_product / (norm_u * norm_v + eps) 
    
    # 用于对比损失(如InfoNCE Loss)
    positive_sim = cosine_similarity(anchor, positive)  # 增大
    negative_sim = cosine_similarity(anchor, negative)  # 减小
    

2、内积(Inner Product)——点积的推广

定义和计算:

内积是点积的推广,适用于更一般的向量空间(如函数空间、矩阵空间)。对于向量或高阶张量,内积通常指在特定空间中的一种双线性运算,结果为标量

在工科的讨论范围内,内积和点积会混在一起说。这是无可厚非的,毕竟点积是内积的一种特殊形式

  • R n \mathbb{R}^n Rn空间中,内积与点积相同(一阶张量,n维向量,n个元素相乘再相加)。

  • 在矩阵空间(二阶张量)中,Frobenius内积定义为:即两个形状相同的矩阵对应位置的元素相乘后求和,结果是一个标量。
    ⟨ A , B ⟩ F = ∑ i , j A i j B i j = t r ( A T B ) \langle\mathbf{A},\mathbf{B}\rangle_F=\sum_{i,j}A_{ij}B_{ij}=\mathrm{tr}(\mathbf{A}^T\mathbf{B}) A,BF=i,jAijBij=tr(ATB)

    其中 tr ⁡ ( ⋅ ) \operatorname{tr}(\cdot) tr()代表求矩阵的迹(trace): tr ⁡ ( A T B ) = ∑ i = 1 n ( A T B ) i i = ∑ i = 1 n ∑ k = 1 m A k i B k i \operatorname{tr}(\mathbf{A}^T\mathbf{B})=\sum_{i=1}^n(\mathbf{A}^T\mathbf{B})_{ii}=\sum_{i=1}^n\sum_{k=1}^mA_{ki}B_{ki} tr(ATB)=i=1n(ATB)ii=i=1nk=1mAkiBki

特点:

  • 广义性:内积可以定义在函数、矩阵等对象上(如 ⟨ f , g ⟩ = ∫ f ( x ) g ( x ) d x ) \langle f,g\rangle=\int f(x)g(x)dx) f,g=f(x)g(x)dx)
  • 需满足正定性、对称性和线性性(在复空间中为共轭对称性)。
  • 点积是内积在有限维实数空间中的特例

示例:

矩阵内积:
⟨ [ 1 2 3 4 ] , [ 5 6 7 8 ] ⟩ F = 1 × 5 + 2 × 6 + 3 × 7 + 4 × 8 = 70 。 \left\langle\begin{bmatrix}1&2\\3&4\end{bmatrix},\begin{bmatrix}5&6\\7&8\end{bmatrix}\right\rangle_F=1\times5+2\times6+3\times7+4\times8=70。 [1324],[5768]F=1×5+2×6+3×7+4×8=70

与内积的联系:内积 = 哈达玛积的所有元素之和。

内积的计算可以分解为两步:

  1. 先计算哈达玛积:对输入矩阵/向量逐元素相乘。
  2. 再求和:将哈达玛积的所有元素相加,得到标量。
运算定义输入要求输出
哈达玛积 A ∘ B ,逐元素相乘: C i j = A i j B i j \mathbf{A}\circ\mathbf{B}\text{,逐元素相乘:}C_{ij}=A_{ij}B_{ij} AB,逐元素相乘:Cij=AijBij同形状矩阵/张量同形状矩阵
内积 向量: ⟨ u , v ⟩ = ∑ i u i v i 矩阵: ⟨ A , B ⟩ F = ∑ i , j A i j B i j \begin{aligned}&\text{向量:}\langle\mathbf{u},\mathbf{v}\rangle=\sum_iu_iv_i\\&\text{矩阵:}\langle\mathbf{A},\mathbf{B}\rangle_F=\sum_{i,j}A_{ij}B_{ij}\end{aligned} 向量:u,v=iuivi矩阵:A,BF=i,jAijBij向量同维或矩阵同形标量

在深度学习中的应用(PyTorch代码实现

(1) 向量内积(就是点积,可以参考上面点积的应用)

import torch

u = torch.tensor([1.0, 2.0, 3.0])  # [3]
v = torch.tensor([4.0, 5.0, 6.0])  # [3]

# 方法1:直接点积
dot_product = torch.dot(u, v)  # 输出: 1*4 + 2*5 + 3*6 = 32.0

# 方法2:等价于求和逐元素乘积
dot_product_alt = torch.sum(u * v)  # 同上

(2) 矩阵内积(Frobenius内积)

A = torch.tensor([[1.0, 2.0], [3.0, 4.0]])  # [2, 2]
B = torch.tensor([[5.0, 6.0], [7.0, 8.0]])  # [2, 2]

# 方法1:逐元素乘后求和
frobenius_inner = torch.sum(A * B)  # 1*5 + 2*6 + 3*7 + 4*8 = 70.0

# 方法2:迹运算
frobenius_inner_alt = torch.trace(A.T @ B)  # 同上

深度学习中的应用:
(1) 正则化(Regularization)

  • L2 正则化(权重衰减)可以看作权重矩阵与自身的内积
    ∥ W ∥ F 2 = ⟨ W , W ⟩ F \|\mathbf{W}\|_F^2=\langle\mathbf{W},\mathbf{W}\rangle_F WF2=W,WF这样做是为了避免在求导时出现平方根运算,简化计算,避免过拟合。

  • 应用场景:L2权重衰减(权重矩阵的Frobenius范数)。在 L2 权重衰减中,正则化项通常使用 L2 范数的平方

  • 代码:

    weight = torch.randn(100, 50, requires_grad=True)
    l2_reg = torch.sum(weight ** 2)  # 等价于 Frobenius 内积 <weight, weight>
    loss = model_loss + 0.01 * l2_reg  # 添加到总损失
    

(2) 核方法(Kernel Methods)

  • 在支持向量机(SVM)或高斯过程中,内积用于计算数据在高维空间的相似性: K ( x , y ) = ⟨ ϕ ( x ) , ϕ ( y ) ⟩ K(\mathbf{x},\mathbf{y})=\langle\phi(\mathbf{x}),\phi(\mathbf{y})\rangle K(x,y)=ϕ(x),ϕ(y)⟩其中 ϕ \phi ϕ 是特征映射。

  • 核函数的核心思想是:直接计算高维空间中的内积 ⟨ ϕ ( x ) , ϕ ( y ) ⟩ \langle\phi(\mathbf{x}),\phi(\mathbf{y})\rangle ϕ(x),ϕ(y)⟩而无需显式构造到高维 ϕ ( x ) \phi(\mathbf{x}) ϕ(x)。对于高斯核,可以证明它对应一个无限维的特征映射(这里没有深究原理,但确实有数学公式可以证明)。

  • 手动实现的高斯核

    import numpy as np
    
    def rbf_kernel(x, y, sigma=1.0):
        """手动实现高斯核(内积形式)"""
        distance = np.linalg.norm(x - y) ** 2  # ||x - y||^2
        return np.exp(-distance / (2 * sigma ** 2))  # K(x,y) = <φ(x), φ(y)>
    
    # 示例计算
    x = np.array([1.0, 2.0])
    y = np.array([3.0, 4.0])
    print("手动计算高斯核:", rbf_kernel(x, y))
    

(3)自注意力机制中的Query-Key评分

  • 虽然Transformer中的 Q K T QK^T QKT 是矩阵乘法,但每个评分 Q i ⋅ K j Q_i\cdot K_j QiKj是向量点积(内积)

    Q = torch.randn(10, 64)  # [seq_len, d_k]
    K = torch.randn(10, 64)  # [seq_len, d_k]
    scores = Q @ K.T  # [10, 10], 每个元素是内积
    

3、外积(Outer Product)

定义和计算:
在线性代数中,两个坐标向量的外积(Outer product)是一个矩阵。如果这两个向量的维数分别为n和m,那么它们的外积是一个n×m矩阵。(相当于n×1的矩阵核1×m的矩阵相乘)

外积是两个向量的张量积,结果为高阶张量。对于向量 u ∈ R m \mathbf{u}\in\mathbb{R}^m uRm v ∈ R n \mathbf{v}\in\mathbb{R}^n vRn,外积生成一个矩阵(二阶张量):

u ⊗ v = u v T = [ u 1 v 1 ⋯ u 1 v n ⋮ ⋱ ⋮ u m v 1 ⋯ u m v n ] \mathbf{u}\otimes\mathbf{v}=\mathbf{u}\mathbf{v}^T=\begin{bmatrix}u_1v_1&\cdots&u_1v_n\\\vdots&\ddots&\vdots\\u_mv_1&\cdots&u_mv_n\end{bmatrix} uv=uvT= u1v1umv1u1vnumvn
对于高阶张量,外积将它们的阶数相加(如 m m m阶张量和 n n n阶张量,计算外积,结果是 m + n m+n m+n阶张量。

特点:

  • 不满足交换律 ( u ⊗ v ≠ v ⊗ u (\mathbf{u}\otimes\mathbf{v}\neq\mathbf{v}\otimes\mathbf{u} (uv=vu
  • 用于构造高阶张量(如矩阵、三阶张量等)。
  • 与叉积(Cross Product)不同(叉积仅适用于三维向量,结果为向量)。

示例:

[ 1 2 ] ⊗ [ 3 4 ] = [ 1 × 3 1 × 4 2 × 3 2 × 4 ] = [ 3 4 6 8 ] \begin{bmatrix}1\\2\end{bmatrix}\otimes\begin{bmatrix}3&4\end{bmatrix}=\begin{bmatrix}1\times3&1\times4\\2\times3&2\times4\end{bmatrix}=\begin{bmatrix}3&4\\6&8\end{bmatrix} [12][34]=[1×32×31×42×4]=[3648]

在深度学习中的应用(PyTorch代码实现

import torch

# 定义两个向量
u = torch.tensor([1, 2, 3])
v = torch.tensor([4, 5, 6])


# 计算外积
outer_product = torch.outer(u, v)
print("外积结果:")
print(outer_product)

# 等价的矩阵乘法

matrix_m = u[:,None] @ v[None,:] 

assert torch.allclose(outer_product ,matrix_m )

4、哈达玛积(Hadamard Product)

是矩阵的逐元素乘积,与点积、外积无关。

哈达玛积(Hadamard Product),也称为 逐元素乘积(Element-wise Product),是一种基本的矩阵/张量运算,广泛应用于深度学习、信号处理和数值计算等领域。它与矩阵乘法完全不同,核心在于 对应位置的元素相乘,而非行列点积

定义和计算:

对于两个形状相同的矩阵 A , B ∈ R m × n \mathbf{A},\mathbf{B}\in\mathbb{R}^{m\times n} A,BRm×n,它们的哈达玛积 C = A ∘ B \mathbf{C}=\mathbf{A}\circ\mathbf{B} C=AB定义为:

C i j = A i j × B i j , ∀ i ∈ { 1 , … , m } , j ∈ { 1 , … , n } C_{ij}=A_{ij}\times B_{ij},\quad\forall i\in\{1,\ldots,m\},j\in\{1,\ldots,n\} Cij=Aij×Bij,i{1,,m},j{1,,n}

符号表示:

  • 哈达玛积常用符号 ∘ \circ ⊙ \odot
  • 在代码中通常用 * 或逐元素乘法函数(如 np.multiplytorch.mul

特点:

  • 输入要求:两个矩阵/张量必须形状完全相同(广播机制除外)
  • 对应位置相乘,输出维度不变

在深度学习中的应用:

首先哈达玛积在python中用*运算符来表示:

A = torch.randn(2, 3)  # [2, 3]
B = torch.randn(2, 3)  # [2, 3]
hadamard = A * B  # 或 torch.mul(A, B)
  1. 门控机制(如LSTM/GRU)
# input_gate: [batch, hidden], candidate: [batch, hidden]
new_state = input_gate * candidate  # 逐元素相乘
  1. 注意力掩码(Transformer)
# scores: [batch, seq_len, seq_len], mask: [seq_len, seq_len]
masked_scores = scores * mask.unsqueeze(0)  # 应用掩码

5、矩阵乘法( matrix multiplication)

矩阵乘法(Matrix Multiplication)是线性代数中的核心运算,也是深度学习中最基本、最重要的操作之一。它用于将两个矩阵(或更高维张量)按照特定规则相乘,生成一个新的矩阵。

定义和计算:

矩阵乘法定义为:对于矩阵 A ∈ R m × n \mathbf{A}\in\mathbb{R}^{m\times n} ARm×n B ∈ R n × p \mathbf{B}\in\mathbb{R}^{n\times p} BRn×p ,它们的乘积 C = A B C = AB C=AB或写成 C = A × B C=A\times B C=A×B ,是一个 m × p m \times p m×p形状的矩阵。其中每个元素 C i j C_{ij} Cij的计算如下:也就是 A \mathbf{A} A 的第 i i i 行向量和 B \mathbf{B} B 的第 j j j 列向量做点积(对应元素相乘再求和)。
C i j = ∑ k = 1 n A i k B k j C_{ij}=\sum_{k=1}^nA_{ik}B_{kj} Cij=k=1nAikBkj

  • 矩阵 A A A行和矩阵 B B B的列必须相同
  • 结果矩阵的 C C C的行数 = A A A的行数,列数 = B B B的列数

在这里插入图片描述

与内积的联系:

  • 首先矩阵乘法的运算规则里面本来就包含了内积的概念,新矩阵的元素本来就由行向量和列向量最点积而来
  • 特殊情况:当矩阵退化为一维向量时,矩阵乘法就等同于内积。例如,对于两个一维向量 a = [ a 1 , a 2 , ⋯   , a n ] \mathbf{a}=[a_1,a_2,\cdots,a_n] a=[a1,a2,,an] b = [ b 1 , b 2 , ⋯   , b n ] \mathbf{b}=[b_1,b_2,\cdots,b_n] b=[b1,b2,,bn],它们的内积 a ⋅ b = ∑ i = 1 n a i b i \mathbf{a}\cdot\mathbf{b}=\sum_{i = 1}^{n}a_ib_i ab=i=1naibi,这可以看作是一个 1 × n 1\times n 1×n 的矩阵和一个 n × 1 n\times 1 n×1 的矩阵相乘。在这里插入图片描述

与外积的关联

  • 矩阵乘法也能和外积联系起来。当一个列向量 a \mathbf{a} a(形状为 m × 1 m\times 1 m×1)和一个行向量 b \mathbf{b} b(形状为 1 × n 1\times n 1×n)相乘时,得到的结果是一个 m × n m\times n m×n 的矩阵,这个过程类似于外积的计算方式。

在这里插入图片描述

🙎🏻‍♀️几何意义

  • 线性变换的组合矩阵本身就可以代表一个线性的变换。在二维平面里,矩阵乘法可实现对二维向量的旋转、缩放、反射等几何变换。对于线性变换 A A A B B B A B AB AB表示先应用 B B B的变换,再应用 A A A的变换
    在这里插入图片描述
    在这里插入图片描述

    图片来源于B站视频:【【从0开始学广义相对论02】嫌矩阵运算难写?看看爱因斯坦怎么做的:Einstein求和约定】 https://www.bilibili.com/video/BV1LF411s7MX/?share_source=copy_web&vd_source=f81ef849101bd49f5953b524b903fdfb

  • 空间映射(空间变换)⭐:将输入空间( R p \mathbb{R}^p Rp)通过 B B B映射到中间空间 ( R n ) (\mathbb{R}^n) (Rn),再通过 A A A映射到输出空间 ( R m ) (\mathbb{R}^m) (Rm)

示例代码

import torch

# 创建两个矩阵
A = torch.tensor([[1, 2], [3, 4]])
B = torch.tensor([[5, 6], [7, 8]])

# 进行矩阵乘法
C = torch.matmul(A, B)
C = torch.mm(A, B)     # [3, 5] 或 A @ B
print(C)

在这个例子中,矩阵 C \mathbf{C} C 的每个元素都是通过 A \mathbf{A} A 的行向量和 B \mathbf{B} B 的列向量做点积得到的。

torch.matmultorch.mm 都可用于执行张量乘法,但它们存在一些区别

  • torch.mm:仅适用于二维张量(即矩阵)。若输入不是二维张量,会抛出错误。
  • torch.matmul:支持更灵活的输入维度,可处理多种维度组合的张量乘法。具体规则如下:
    • 若两个输入都是一维张量,计算的是它们的点积(内积),返回一个标量。
    • 若两个输入都是二维张量,执行的是常规的矩阵乘法,与 torch.mm 效果相同。
    • 若一个输入是一维张量,另一个是二维张量,会自动对一维张量进行维度扩展以完成矩阵乘法,结果为一维张量。
    • 若输入张量的维度超过二维,torch.matmul 会将最后两个维度视为矩阵维度进行乘法,其他维度作为批量维度处理。

总结

对比总结表

运算数学符号代码实现(PyTorch)输入要求输出规则
矩阵乘法 A B \mathbf{A} \mathbf{B} ABA @ Btorch.mm(A, B)前列=后行行列点积求和
点积(内积) u ⋅ v \mathbf{u} \cdot \mathbf{v} uvtorch.dot(u, v)同维向量标量
外积 u ⊗ v \mathbf{u} \otimes \mathbf{v} uvtorch.outer(u, v)任意两向量矩阵(( \mathbf{u} \mathbf{v}^T ))
哈达玛积 A ∘ B \mathbf{A} \circ \mathbf{B} ABA * Btorch.mul(A, B)同形状矩阵/张量逐元素相乘
克罗内克积 A ⊗ B \mathbf{A} \otimes \mathbf{B} ABtorch.kron(A, B)任意两矩阵分块扩展矩阵
逐元素除法 A ⊘ B \mathbf{A} \oslash \mathbf{B} ABA / Btorch.div(A, B)同形状矩阵/张量逐元素相除

关键点

  1. 矩阵乘法是深度学习最核心的运算(如全连接层、注意力机制)。
  2. 哈达玛积用于逐元素操作(如激活函数、掩码)。
  3. 外积克罗内克积在特定场景(如推荐系统、量子计算)中非常有用。
  4. 代码中注意区分 *(哈达玛积)和 @(矩阵乘法),这是常见的错误来源!

参考

  • 点积、内积、外积、叉积、张量积——概念区分
  • 豆包、Deepseek(感谢)

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

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

相关文章

MH2103系列coremark1.0跑分数据和优化,及基于arm2d的优化应用

CoreMark 1.0 介绍 CoreMark 是由 EEMBC&#xff08;Embedded Microprocessor Benchmark Consortium&#xff09;组织于 2009 年推出的一款用于衡量嵌入式系统 CPU 或 MCU 性能的标准基准测试工具。它旨在替代陈旧的 Dhrystone 标准&#xff08;Dhrystone 容易受到各种libc不同…

Flowith AI,解锁下一代「知识交易市场」

前言 最近几周自媒体号都在疯狂推Manus&#xff0c;看了几篇测评后&#xff0c;突然在某个时间节点&#xff0c;在特工的文章下&#xff0c;发现了很小众的Flowith。 被这段评论给心动到&#xff0c;于是先去注册了下账号。一翻探索过后&#xff0c;发现比我想象中要有趣的多&…

SpringBoot企业级开发之【文章分类-新增文章分类】

看一下新增文章的需求&#xff1a; 接口文档&#xff1a; 开发思路&#xff1a; 先在controller下去创建add方法&#xff0c;方法内导入Service类获取add的结果&#xff1b;再在Service接口下去创建add的方法&#xff1b;然后在Service实现类下去实现方法的作用&#xff0c;且导…

【AI News | 20250421】每日AI进展

AI Repos 1、langgraph-mcp-agents 基于LangGraph的AI智能体系统&#xff0c;集成了MCP&#xff0c;使AI助手能访问各种数据源和API。提供了Streamlit网页界面&#xff0c;方便与LangGraph和MCP工具交互。可以通过界面动态添加、删除以及配置MCP工具&#xff0c;无需重启应用&…

牛客 | OJ在线编程常见输入输出练习

1.只有输出 言归正传&#xff0c;本张试卷总共包括18个题目&#xff0c;包括了笔试情况下的各种输入输出。 第一题不需要输入&#xff0c;仅需输出字符串 Hello Nowcoder! 即可通过。 #include <iostream> using namespace std; int main(){string s "Hello Nowco…

python生成动态库在c++中调用

一.Windows下生成动态库.pyd 在setup.py的同目录下使用python setup.py build_ext --inplace 二.在vscode的c中使用.pyd文件&#xff08;动态库&#xff09; 1&#xff09;配置python的环境 python -c "import sys; print(sys.executable)" #确定python安装位置 2…

OpenCV基础函数学习4

【大纲笔记见附件pdf】 目录 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配 一、基于OpenCV的形态学操作 二、基于OpenCV的直方图处理 三、基于OpenCV霍夫变换 四、基于OpenCV模板匹配

Nginx反向代理用自定义Header参数

【啰嗦两句】 也不知道为啥&#xff0c;我仅仅想在Nginx的反向代理中使用自己定义的“x-api-key”做Header参数&#xff0c;却发现会被忽略&#xff0c;网上搜的资料都是说用“proxy_set_header”&#xff0c;却只愿意介绍最基本的几个参数&#xff0c;你懂的&#xff0c;那些资…

详解机器学习各算法的优缺点!!

在机器学习这个 “工具库” 里&#xff0c;算法就像各种各样的工具&#xff0c;每一种都有自己的 “脾气” 和 “特长”。有些算法擅长找规律&#xff0c;有些算法能快速分类&#xff0c;还有些在处理复杂数据时特别厉害。 而且&#xff0c;就像锤子适合敲钉子、螺丝刀适合拧螺…

C++23 让 Lambda 表达式中的 () 更可选:P1102R2 提案深度解析

文章目录 一、背景与动机&#xff1a;Lambda 表达式中的痛点1.1 问题的根源 二、P1102R2 提案&#xff1a;让 () 可选2.1 提案的核心内容2.2 语法调整的细节2.3 提案的合理性 三、编译器支持&#xff1a;主流编译器的跟进四、对 C 编程的影响&#xff1a;简化语法与提升一致性4…

在Qt中验证LDAP账户(Windows平台)

一、前言 原本以为在Qt&#xff08;Windows平台&#xff09;中验证 LDAP 账户很简单&#xff1a;集成Open LDAP的开发库即可。结果临了才发现&#xff0c;Open LDAP压根儿不支持Windows平台。沿着重用的原则&#xff0c;考虑迁移Open LDAP的源代码&#xff0c;却发现工作量不小…

【sylar-webserver】重构日志系统

文章目录 主要工作流程图FiberConditionBufferBufferManagerLogEvent 序列化 & 反序列化LoggerRotatingFileLogAppender 主要工作 实现&#xff0c; LogEvent 序列化和反序列化 &#xff08;使用序列化是为了更标准&#xff0c;如果转成最终的日志格式再存储&#xff08;确…

树莓派超全系列教程文档--(38)config.txt视频配置

config.txt视频配置 视频选项HDMI模式树莓派4-系列的HDMI树莓派5-系列的HDMI 复合视频模式enable_tvout LCD显示器和触摸屏ignore_lcddisable_touchscreen 通用显示选项disable_fw_kms_setup 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 视频选…

线性DP:最短编辑距离

Dp 状态表示 f&#xff08;i&#xff0c;j&#xff09; 集合所有将A[1~i]变成B[1~j]的操作方式属性min 状态计算 &#xff08;划分&#xff09; 增f(i,j)f(i,j-1)1//A[i]元素要增加&#xff0c;说明A前i位置与B前j-1相同删f(i,j)f(i-1,j)1//A[i]元素要删除&#xff0c;说明A前i…

STM32——新建工程并使用寄存器以及库函数进行点灯

本文是根据江协科技提供的教学视频所写&#xff0c;旨在便于日后复习&#xff0c;同时供学习嵌入式的朋友们参考&#xff0c;文中涉及到的所有资料也均来源于江协科技&#xff08;资料下载&#xff09;。 新建工程并使用寄存器以及库函数进行点灯操作 新建工程步骤1.建立工程2.…

java集合框架day1————集合体系介绍

在进入正文之前&#xff0c;我们先来思考一下之前学过的数组有什么缺点&#xff1f; <1>长度开始时必须指定&#xff0c;而且一旦指定&#xff0c;不能更改 <2>保存的必须为同一类型的元素 <3>使用数组进行增加/删除元素的代码比较麻烦 为了方便读者理解&…

百度热力图数据获取,原理,处理及论文应用18

目录 0、数据简介0、示例数据1、百度热力图数据日期如何选择1.1、其他实验数据的时间1.2、看日历天气 2、百度热力图几天够研究&#xff1f;部分文章统计3、数据原理3.1 Bd09mc即百度墨卡托投影坐标系200单位的距离是可以自己设置的吗&#xff1f;3.2 csv文件字段说明3.3 ** 这…

【身份证扫描件识别表格】如何识别大量身份证扫描件将内容导出保存到Excel表格,一次性处理多张身份证图片导出Excel表格,基于WPF和腾讯云的实现方案

基于WPF和腾讯云的身份证扫描件批量处理方案 适用场景 本方案适用于需要批量处理大量身份证扫描件的场景,例如: 企业人事部门批量录入新员工身份信息银行或金融机构办理批量开户业务教育机构收集学生身份信息政府部门进行人口信息统计酒店、医院等需要实名登记的场所这些场景…

基于语义网络表示的不确定性推理

前文我们已经了解了: 1.不确定与非单调推理的基本概念:不确定与非单调推理的基本概念-CSDN博客 2.不确定与非单调推理的概率方法:不确定与非单调推理的概率方法-CSDN博客 3.不确定与非单调推理的可信度方法:不确定与非单调推理的可信度方法-CSDN博客 4.不确定与非单调推…

ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验

▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计&#xff0c;一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…