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

矩阵:消除冗余

矩阵

基本概念

矩阵Matrix)是一个按照行和列排列的元素的二维数组。具体来说,一个 ( m \times n ) 的矩阵有 ( m ) 行和 ( n ) 列,表示为:

A = ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯ a m n ) A = \begin{pmatrix} a_{11} & a_{12} & \cdots & a_{1n} \\ a_{21} & a_{22} & \cdots & a_{2n} \\ \vdots & \vdots & \ddots & \vdots \\ a_{m1} & a_{m2} & \cdots & a_{mn} \end{pmatrix} A= a11a21am1a12a22am2a1na2namn

其中 ( a_{ij} ) 是矩阵 ( A ) 的第 ( i ) 行第 ( j ) 列的元素。

矩阵性质

  1. 零矩阵:所有元素均为零的矩阵。
  2. 转置矩阵:将矩阵 ( A ) 的行列互换得到的矩阵为 ( A^T )。
  3. 对称矩阵::矩形的转置矩阵等于自身,即 ( A = A^T )。
  4. 单位矩阵:对角线元素为 1 其余元素为 0 的方阵。
  5. 逆矩阵:若矩阵 ( A ) 与 ( B ) 满足 ( AB = BA = I ),则 ( B ) 为 ( A ) 的逆矩阵,记作 ( A^{-1} )。

运算规则

  1. 加法:两个相同维数的矩阵相加,对应元素相加。

( A + B ) i j = a i j + b i j (A + B)_{ij} = a_{ij} + b_{ij} (A+B)ij=aij+bij

  1. 标量乘法:矩阵的每个元素和标量 ( k ) 相乘。

( k A ) i j = k ⋅ a i j (kA)_{ij} = k \cdot a_{ij} (kA)ij=kaij

  1. 矩阵乘法:( m \times n ) 矩阵 ( A ) 和 ( n \times p ) 矩阵 ( B ) 乘积为 ( m \times p ) 矩阵 ( C )。

C i j = ∑ k = 1 n a i k ⋅ b k j C_{ij} = \sum_{k=1}^n a_{ik} \cdot b_{kj} Cij=k=1naikbkj

  1. 转置:交换矩阵行和列的位置。

( A T ) i j = a j i (A^T)_{ij} = a_{ji} (AT)ij=aji

  1. 逆矩阵:若矩阵 ( A ) 可逆,则存在矩阵 ( A^{-1} ) 使得 ( AA^{-1} = A^{-1}A = I ).

以下是一些简单的 Python 代码示例,帮助理解矩阵的基本操作:

import numpy as np# 定义矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵加法
C = A + B# 矩阵乘法
D = np.dot(A, B)# 矩阵转置
E = A.T# 矩阵的逆
F = np.linalg.inv(A)print(f"A:\n{A}")
print(f"B:\n{B}")
print(f"A + B:\n{C}")
print(f"A * B:\n{D}")
print(f"A^T:\n{E}")
print(f"A^-1:\n{F}")

特殊矩阵

  1. 方阵:行数与列数相等的矩阵。
  2. 稀疏矩阵:大部分元素为零的矩阵。
  3. 对称矩阵:转置矩阵等于自身。
  4. 对角矩阵:非对角线元素全为零的方阵。
  5. 单位矩阵:对角线元素为 1,其他元素为 0 的方阵。
  6. 对称正定矩阵:所有特征值均为正的对称矩阵。

应用场景

  1. 线性方程组:矩阵可以表示线性方程组,有助于求解和分析。
  2. 图像处理:图像可以看作矩阵,通过矩阵运算实现图像滤波、变换等。
  3. 计算机图形学:通过矩阵运算实现三维图形的旋转、平移和缩放。
  4. 机器学习:数据集通常表示为矩阵,矩阵运算用于计算模型参数和预测。
  5. 物理学和工程学:描述和求解物理系统的状态和变化。

稀疏矩阵:一维三元组表示法

二维矩阵的一维三元组表示法(Triplet Representation)是一种稀疏矩阵的存储方式,专为存储稀疏矩阵而设计。每个非零元素通过一个三元组 (i, j, value) 表示,其中 i 和 j 分别为矩阵元素的行和列索引,value 为元素的值。

基本概念

假设有一个稀疏矩阵:

0 0 3
4 0 0
0 0 5

用三元组表示法可以表示为:

[(0, 2, 3), (1, 0, 4), (2, 2, 5)]

大规模的科学计算、图像处理中的矩阵表示等都适用于稀疏矩阵的存储和计算。

矩阵的压缩存储

矩阵的压缩存储旨在减少存储空间和提高计算效率。常用的压缩存储格式包括:

  1. 压缩稀疏行CSR, Compressed Sparse Row)格式:

    • 值数组values):存储所有非零元素的值。
    • 列索引数组col_indices):存储每个非零元素所在列的索引。
    • 行指针数组row_ptr):存储每一行在值数组values中的起始位置。
  2. 压缩稀疏列CSC, Compressed Sparse Column)格式:

    • 列指针数组(col_ptr),存储每列的非零元素起始位置。
    • 行索引数组(row_indices),存储非零元素在矩阵中的行索引。
    • 值数组(values),存储非零元素值。

CSR 表示

假设矩阵:

0 0 3
4 0 0
0 0 5

CSR 表示为:

values = [3, 4, 5]
col_indices = [2, 0, 2]
row_ptr = [0, 1, 2, 3]

CSR 表示法适用于大规模稀疏矩阵的存储和计算,如科学计算、机器学习中的特征矩阵等。

稀疏矩阵的转置

对于 CSR 格式的矩阵转置,将转换为 CSC 格式,基本步骤包括:

  1. 创建新矩阵的列指针数组:初始所有元素设为零,对原矩阵值进行累加。
  2. 利用行索引和列指针构建新值和行索引数组。
import numpy as np
from scipy.sparse import csr_matrixdef transpose_csr_to_csc(csr):""" 将CSR格式的矩阵转置得到CSC格式 """values = csr.datarow_indices = csr.indicescol_ptr = csr.indptrn_rows = len(col_ptr) - 1n_cols = len(values)row_ptr = np.zeros(n_cols + 1, dtype=int)for idx in row_indices:row_ptr[idx + 1] += 1np.cumsum(row_ptr, out=row_ptr)new_values = np.zeros_like(values)new_col_indices = np.zeros_like(row_indices)for row in range(n_rows):for idx in range(col_ptr[row], col_ptr[row + 1]):col = row_indices[idx]pos = row_ptr[col]new_values[pos] = values[idx]new_col_indices[pos] = rowrow_ptr[col] += 1for col in reversed(range(n_cols)):row_ptr[col + 1] = row_ptr[col]row_ptr[0] = 0return csr_matrix((new_values, new_col_indices, row_ptr), shape=(n_cols, n_rows))# 示例
A = csr_matrix([[0, 0, 3], [4, 0, 0], [0, 0, 5]])
A_t = transpose_csr_to_csc(A)
print(A_t)

这种稀疏矩阵的表示方式适用于图处理、机器学习中的协作过滤等算法要求对高度稀疏矩阵进行频繁转置的场景。

稀疏矩阵的索引

根据压缩格式,执行索引。在 CSR 中,索引位置 (i, j) 时:

  • 查找 row_ptr[i]row_ptr[i + 1] 之间的列索引 col_indices
  • col_indices 中找到等于 j 的索引位置,对应的值数组 values 中索引即为 A(i, j) 的值。
def get_element_csr(csr, i, j):""" 获取CSR矩阵中的元素A(i, j) """for idx in range(csr.indptr[i], csr.indptr[i + 1]):if csr.indices[idx] == j:return csr.data[idx]return 0# 示例
A = csr_matrix([[0, 0, 3], [4, 0, 0], [0, 0, 5]])
value = get_element_csr(A, 1, 0)
print(value)

在需要随机访问稀疏矩阵特定位置元素时,使用压缩存储格式可以进行高效索引。

稀疏矩阵的加法

加法运算要求同样格式,通过合并有效列索引和值数组实现。

def add_csr(csr1, csr2):""" 两个CSR矩阵相加 """return csr1 + csr2# 示例
A = csr_matrix([[0, 0, 3], [4, 0, 0], [0, 0, 5]])
B = csr_matrix([[1, 0, 0], [0, 2, 0], [3, 0, 0]])
C = add_csr(A, B)
print(C)

稀疏矩阵的乘法

乘法复杂些,要对行、列进行遍历:

def multiply_csr(csr1, csr2):""" 两个CSR矩阵相乘 """return csr1.dot(csr2)# 示例
A = csr_matrix([[0, 0, 3], [4, 0, 0], [0, 0, 5]])
B = csr_matrix([[1, 0, 0], [0, 2, 0], [3, 0, 0]])
C = multiply_csr(A, B)
print(C)

稀疏矩阵的乘法可以高效地在稀疏矩阵上进行线性代数操作,如有限元分析、数值模拟中的大规模线性方程组求解等。

稀疏矩阵的压缩存储和运算如 CSR 和 CSC 极大地提高稀疏矩阵应用的效率。通过了解其运算规则和基本实现,能够有效地应用于科学计算、图像处理、机器学习等需要处理大规模稀疏矩阵的领域。

大规模稀疏矩阵

通常在大规模稀疏矩阵的存储和计算中,特别是在需要高效行访问和列访问的场景下,我们需要使用一些混合存储策略,例如“按行存储数据,按列建立索引”,主要用于平衡高效数据访问和节省存储空间。

工程考量

  1. 存储储效率:

    • 通过按行存储,避免存储稀疏矩阵中大量的零元素,从而显著减少存储需求。
    • 按列建立索引,则使得列访问和运算更加高效。
  2. 访问效率:

    • 行存储格式使得行遍历和行级操作更加高效,适合于多种行操作如矩阵-向量乘法。
    • 列索引支持快速的列访问和列级操作,如矩阵转置和列向量提取。
  3. 算法优化:

    • 某些算法需要频繁访问和操作矩阵的行和列,混合存储策略可以提高这些操作的性能。
    • 可以更方便地进行矩阵的分解(如 QR 分解)、求解线性方程组和稀疏矩阵的迭代求解等。
  4. 实现复杂度:

    • 需要设计合理的数据结构和索引机制,以确保高效的访问、插入、删除等操作。
    • 需要处理行数据和列索引间的同步与一致性问题。

模拟实现

这种混合存储的实现通常包括以下数据结构:

  1. 行存储:存储所有非零元素及其对应的列索引。
  2. 列索引:存储每列非零元素在行存储中的位置。

具体实现可以参考以下 Python 模拟代码示例:

import numpy as npclass HybridMatrix:def __init__(self, rows, cols):self.rows = rowsself.cols = colsself.values = []self.col_indices = []self.row_ptr = [0] * (rows + 1)self.col_ptr = [[] for _ in range(cols)]def add_value(self, row, col, value):self.values.append(value)self.col_indices.append(col)self.row_ptr[row + 1] += 1self.col_ptr[col].append((row, len(self.values) - 1))def finalize(self):for i in range(1, self.rows + 1):self.row_ptr[i] += self.row_ptr[i - 1]def get_row(self, row):row_start = self.row_ptr[row]row_end = self.row_ptr[row + 1]return [(self.col_indices[i], self.values[i]) for i in range(row_start, row_end)]def get_col(self, col):return [(row, self.values[idx]) for row, idx in self.col_ptr[col]]# 示例
matrix = HybridMatrix(3, 3)
matrix.add_value(0, 2, 3)
matrix.add_value(1, 0, 4)
matrix.add_value(2, 2, 5)
matrix.finalize()print("Row 1:", matrix.get_row(1))  # Output: Row 1: [(0, 4)]
print("Column 2:", matrix.get_col(2))  # Output: Column 2: [(0, 3), (2, 5)]

应用场景

  1. 科学计算与数值模拟:

    • 适用于有限元分析中的刚度矩阵、质量矩阵等比较稀疏的线性系统。
    • 高效的矩阵-向量乘法、矩阵分解等操作。
  2. 图像与信号处理:

    • 适合处理稀疏代表的图像,如稀疏滤波、压缩感知等。
    • 高效地执行变换和去噪等操作。
  3. 机器学习与数据挖掘:

    • 适用于稀疏输入数据的特征矩阵和参数矩阵,如推荐系统、文本分析等。
    • 高效的矩阵操作加快模型训练和预测过程。

分析

  1. 性能与空间优化:

    • 混合存储能够在减少存储空间的同时,提供高效的行和列访问性能。
    • 特别适用于稀疏矩阵,按行存储有效地压缩了存储需求,按列索引则提供了高效的列访问。
  2. 复杂度:

    • 实现复杂度相对较高,需要开发者设计合理的数据结构,确保行存储和列索引的一致性和高效操作。
    • 需要对插入、删除等操作进行良好的处理,以保证数据结构的完整性。
  3. 灵活性:

    • 能够很好地适应不同的应用需求,如科学计算中的矩阵操作,机器学习中的特征矩阵存储等。
    • 具有较好的扩展性,能够适应来未来的潜在需求和技术发展。

总的来说,“按行存储数据,按列建立索引”是一种平衡存储效率和访问效率的有效策略,特别适用于大规模稀疏矩阵。在科学计算、数据挖掘和机器学习等领域的应用中,能够显著提高算法的效率和处理性能。

邻接矩阵:图的矩阵表示法

邻接矩阵Adjacency Matrix)是一种用于表示Graph)的重要数据结构。无向图和有向图都可以使用邻接矩阵来表示。

基本概念

对于一个有 ( n ) 个顶点的图,邻接矩阵 ( A ) 是一个 ( n \times n ) 的二维矩阵,其元素 ( A[i][j] ) 表示顶点 ( i ) 和顶点 ( j ) 之间的关系:

  • 无向图中, ( A[i][j] = 1 ) 表示顶点 ( i ) 和顶点 ( j ) 之间有边, ( A[i][j] = 0 ) 表示两者之间无边。
  • 有向图中, ( A[i][j] = 1 ) 表示有一条从顶点 ( i ) 指向顶点 ( j ) 的有向边, ( A[i][j] = 0 ) 表示没有这样的边。

假设我们有一个简单的无向图:

A -- B
|  / |
| /  |
C -- D

它对应的邻接矩阵为:

  A B C D
A 0 1 1 0
B 1 0 1 1
C 1 1 0 1
D 0 1 1 0

矩阵与图数据结构的关系

矩阵与图数据结构有紧密的联系,矩阵是表示图的重要方式之一。除了邻接矩阵外,常见的矩阵与图的关系还有:

  1. 邻接矩阵

前面已经介绍了邻接矩阵,它是一种占用空间 ( O(n^2) ) 的表示方法,适用于稠密图。

  1. 邻接表

邻接表(Adjacency List)是另一种常用的图表示方法,它为每个顶点存储一个列表,列出与该顶点相邻的所有顶点。对于稀疏图,邻接表更为高效,占用空间 ( O(n + m) ),其中 ( n ) 是顶点数, ( m ) 是边数。

  1. 度矩阵

度矩阵(Degree Matrix)是一个对角矩阵,用来存储每个顶点的度数。在无向图中,度矩阵中的对角元素 ( D[i][i] ) 就是顶点 ( i ) 的度。

  1. 拉普拉斯矩阵

拉普拉斯矩阵 ( L ) 通过度矩阵 ( D ) 和邻接矩阵 ( A ) 计算得到: ( L = D - A ) 。拉普拉斯矩阵常用于图的谱分析(Spectral Analysis)。

矩阵与图操作

邻接矩阵可以用于高效的图算法和操作,其矩阵运算能够简化并加速图的许多计算,例如路径计算、最短路径、连通性检测等。

图的基本操作:

  1. 构造图:使用邻接矩阵可以轻松构造图的数据结构。
  2. 添加边:添加边对应于设置邻接矩阵中的元素为 1。
  3. 删除边:删除边对应于设置邻接矩阵中的元素为 0。
  4. 遍历图:通过遍历邻接矩阵可以快速获取顶点之间的连接关系。

算法应用:

  1. 邻接矩阵的幂:矩阵的幂可以用于计算顶点之间的路径数。例如,邻接矩阵的 ( k ) 次幂 ( A^k ) 的非零元素 ( (i, j) ) 表示从顶点 ( i ) 到顶点 ( j ) 的长度为 ( k ) 的路径存在。

  2. Dijkstra 算法:可以使用邻接矩阵表示的图来实现 Dijkstra 算法求解最短路径。

  3. Floyd-Warshall 算法:使用邻接矩阵实现对所有顶点对之间的最短路径求解。

模拟实现

使用 Python 模拟实现基本的邻接矩阵操作:

import numpy as npclass Graph:def __init__(self, vertices):self.V = verticesself.graph = np.zeros((vertices, vertices), dtype=int)def add_edge(self, u, v):self.graph[u][v] = 1self.graph[v][u] = 1def remove_edge(self, u, v):self.graph[u][v] = 0self.graph[v][u] = 0def is_connected(self, u, v):return self.graph[u][v] == 1def display(self):for row in self.graph:print(" ".join(map(str, row)))# 示例
g = Graph(4)
g.add_edge(0, 1)
g.add_edge(0, 2)
g.add_edge(1, 2)
g.add_edge(1, 3)
g.add_edge(2, 3)print("邻接矩阵:")
g.display()print("0和3是否连接:", g.is_connected(0, 3))
g.add_edge(0, 3)
print("添加边后0和3是否连接:", g.is_connected(0, 3))

应用场景

  1. 社交网络分析:邻接矩阵可用于表示社交网络中的用户关系,并用以分析网络结构。
  2. 路径规划:算法在地图表示和路线规划中广泛应用,例如导航系统中。
  3. 计算机网络:用于表示网络拓扑结构,进行网络流量优化和路由分析。
  4. 化学与生物网络:用于表示分子结构,各种物种间关系分析等。

邻接矩阵及其相关矩阵(如度矩阵和拉普拉斯矩阵)提供了高效的图表示和操作方法。在许多领域,它们为图算法提供了有效的基础结构,尤其擅长处理稠密图。相较于邻接表,邻接矩阵在图的全局批处理操作上更有优势。

矩阵的应用

科学计算与数值模拟

科学计算中的线性方程组求解、大规模矩阵运算等,广泛使用矩阵相关的技术。

  • 有限元分析:结构工程、流体力学等领域,通过求解矩阵方程来模拟物理现象。
  • 数值线性代数:如矩阵分解(QR、LU 分解等)、特征值问题等。

机器学习与人工智能

机器学习中许多算法涉及大量的矩阵运算。

  • 线性回归:利用矩阵运算求解回归系数。
  • 矩阵分解:如奇异值分解(SVD)、非负矩阵分解(NMF)在降维、推荐系统等中的应用。
  • 深度学习:矩阵乘法用于神经网络层的前向传播与反向传播计算。

图像处理与计算机视觉

图像本质上是矩阵,通过各种矩阵运算实现图像处理功能。

  • 滤波器:卷积操作基于矩阵运算。
  • 图像变换:如傅里叶变换、离散余弦变换(DCT)等。

网络和图分析

图的数据结构(如邻接矩阵、邻接表)用于表示和分析复杂网络。

  • 社交网络分析:计算节点间的最短路径、社区发现等。
  • 计算机网络:用于网络拓扑结构分析和优化。

推荐系统

基于用户行为的矩阵完成、协同过滤算法使用矩阵技术来预测用户偏好。

  • 矩阵分解:ALS、SVD 等技术用于协同过滤。

发展趋势

  1. 高效矩阵运算优化:随着硬件技术的发展,继续优化矩阵运算的高效实现。
  • GPU 加速:深度学习等领域中广泛使用 GPU 进行矩阵运算加速。
  • 分布式计算:对大规模矩阵运算进行分布式处理(如 Hadoop、Spark 等框架)。
  • 专用硬件加速:如 TPU 等专门针对矩阵运算优化的硬件。
  1. 智能矩阵算法:利用机器学习等技术对矩阵算法进行智能优化与改进。
  • 自适应算法:根据具体应用场景动态调整算法参数,优化性能。
  • 机器学习预测:用于矩阵补全、模式识别等。
  1. 丰富数据结构与存储优化:提高对稀疏矩阵、块稀疏矩阵等的高效处理和存储。
  • 压缩格式改进:如块稀疏格式(Block Sparse Formats)提高稀疏矩阵的存储与运算效率。
  • 内存优化:针对大规模矩阵的内存管理和压缩存储技术。
  1. 跨领域融合:矩阵技术与其他学科结合,解决特定领域的复杂问题。
  • 图神经网络(GNN):结合图的矩阵表示与深度学习技术,应用于社交网络分析、生物数据等领域。
  • 量子计算:探索量子矩阵运算在未来计算架构中的应用。

结语

矩阵具有通用性、高效性、表达能力强等优点,是数学上高度统一的工具,适用于各种领域,其一致的语义和表示方法可以简化算法设计与实现,还能方便表示多维数据及其相互关系,如线性变换、图结构等。

现代计算设备对矩阵运算进行了高度优化,硬件(如 GPU)可以加速矩阵运算。开发库(如 NumPy、SciPy 等)提供高效的矩阵运算功能。


  • 上一篇:多重编码:兼顾范围与精度
  • 专栏:「数智通识」 | 「算法通解」

相关文章:

矩阵:消除冗余

矩阵 基本概念 矩阵(Matrix)是一个按照行和列排列的元素的二维数组。具体来说,一个 ( m \times n ) 的矩阵有 ( m ) 行和 ( n ) 列,表示为: A ( a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋮ ⋮ ⋱ ⋮ a m 1 a m 2 ⋯…...

【AWS账号解绑关联】Linker账号解绑重新关联注意事项

文章目录 一、来自客户疑问二、提交工单获取帮助三、最佳操作说明四、最佳操作步骤五、参考资料活动上新 一、来自客户疑问 将Linker账号,从一个组织中退出,重新关联到新的组织中,这解绑到重新完成新的关联绑定期间会在Linker账号中的账单中…...

入门学习使用overleaf和latex

文章目录 1.下载对应的latex论文模板2.overleaf平台的使用2.1overleaf平台的介绍2.2overleaf平台模板文件的上传2.3latex语法的学习2.3.2 分段(如下图显示)2.3.3 其他2.3.4简单latex实操2.3.5 换行符和换页符2.3.6左右居中对齐2.3.7 字体设置2.3.8插入固定位置图片2.3.9文字包围…...

后端调优——分布式锁选型——入门

文章目录 引言正文分布式锁的定义分布式锁的具体应用场景如何实现分布式锁主动轮询型分布式锁实现思路一、MySQL分布式锁二、Redis分布式锁 监听回调型分布式锁Etcd分布式锁Zookeeper分布式锁 锁的对比 总结 引言 最近面试,一直被问到分布式锁,然后仅仅…...

k8s集群管理 Pod管理命令

k8s集群管理命令 信息查询命令 子命令说明help用于查看命令及子命令的帮助信息cluster-info显示集群的相关配置信息api-resources查看当前服务器上所有的资源对象api-versions查看当前服务器上所有资源对象的版本config管理当前节点上的认证信息 资源对象概述 Pod概述 Pod 管…...

Java 并发(二)—— AQS原理

AQS,全名AbstractQueuedSynchronizer。 抽象队列同步器定义多线程访问共享资源的同步模板,解决了实现自定义同步器时涉及的大量细节问题,简化开发两种同步状态:独占、共享核心组件:State变量、CLH变体队列、获取 / 释…...

Maven插件:exec-maven-plugin-代码执行或者直接输出内置变量信息

文章目录 概述使用应用自行实现记录项目打包插件 概述 官网&#xff1a; https://www.mojohaus.org/exec-maven-plugin/usage.html   依赖&#xff1a; https://mvnrepository.com/artifact/org.codehaus.mojo/exec-maven-plugin 使用 <plugin><groupId>org.codeh…...

https://ffmpeg.org/

https://ffmpeg.org/ https://www.gyan.dev/ffmpeg/builds/ https://github.com/BtbN/FFmpeg-Builds/releases F:\Document_ffmpeg F:\Document_ffmpeg\ffmpeg-master-latest-win64-gpl-shared\bin...

linux 源码部署polardb-x 错误汇总

前言 在linux 源码部署polardb-x 遇到不少错误&#xff0c;特在此做个汇总。 问题列表 CN 启动报错 Failed to init new TCP 详细错误如下 Caused by: Failed to init new TCP. XClientPool to my_polarx#267b21d8127.0.0.1:33660 now 0 TCP(0 aging), 0 sessions(0 runni…...

vscode用快捷键一键生成vue模板

项目中有些代码模块是固定的&#xff0c;如下面的代码所示&#xff0c;为了不重复写这些相同的代码&#xff0c;我们可以使用快键键一键生成模板。 流程&#xff1a; 中文&#xff1a;首选项-> 用户代码片段 -> 输入框中输入vue,找到vue.json文件&#xff08;没有vue.j…...

ARM 架构硬件新趋势:嵌入式领域的未来

目录 目录 一、ARM 架构概述 二、新趋势一&#xff1a;AI 加速器集成 三、新趋势二&#xff1a;更高效的电源管理 四、新趋势三&#xff1a;安全性增强 五、结语 随着物联网 (IoT) 和边缘计算的发展&#xff0c;ARM 架构在嵌入式系统中的应用越来越广泛。从智能手机到智能…...

星戈瑞-二油酰磷脂酰乙醇胺标记荧光素 DOPE-FITC

DOPE-FITC&#xff0c;全称为1,2-dioleoyl-sn-glycero-3-phosphoethanolamine-N-FITC&#xff0c;是一种结合了二油酰磷脂酰乙醇胺&#xff08;DOPE&#xff09;与荧光素异硫氰酸酯&#xff08;FITC&#xff09;的复合标记物。以其独特的磷脂结构和强烈的绿色荧光特性&#xff…...

堆的实现(偷懒版)

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、堆的实现 1.1 堆的向下调整算法 思路&#xff1a; 1.2 堆的向上调整算法 1.3 堆的创建 1.4 堆的复杂度计算 向下调整建堆的复杂度…...

一键启动,智能分拣:3D视觉系统赋能多SKU纸箱高效混拆作业

在快速发展的电商时代&#xff0c;仓储物流面临着前所未有的挑战。尤其是面对成千上万种不同的纸箱&#xff0c;如何实现快速、准确、高效的混拆作业&#xff0c;成为了众多企业亟待解决的问题。幸运的是&#xff0c;随着科技的进步&#xff0c;3D视觉系统正逐步成为这一领域的…...

unity草体渲染方案 GPU Instaning

有一天看项目里的FrameDebug发现在森林系的场景里草体的drawcall差不多有100多 主要是因为灯光贴图&#xff0c;位置等不一样导致的打断合批&#xff0c;导致一个批次只能渲染10个左右的草体 之前有了解过unity有接口&#xff08;Graphics.DrawMeshInstanced&#xff09;可以把…...

最近在西安召开的学术会议:EI检索超快,信息系统与计算技术领域!

第十二届信息系统与计算技术国际会议&#xff08;ISCTech 2024&#xff09;将于2024年11月8日-11月11日在中国西安盛大举行&#xff0c;由长沙理工大学主办&#xff0c;同济大学、西北工业大学联合协办。会议聚焦信息系统与计算技术等相关研究领域&#xff0c;广泛邀请国内外知…...

sRGB和伽马矫正

sRGB和伽马矫正 1. sRGB的含义&#xff1a; sRGB是一种色彩空间&#xff0c;全称为“标准红色-绿色-蓝色”&#xff08;standard Red Green Blue&#xff09;。它由惠普和微软在1996年共同开发&#xff0c;用于确保不同设备上色彩的一致性。 在sRGB中&#xff0c;“s”代表“…...

Summer School science communication project--Laptop Selection Suggestion

目录 Introduction Audiance Usage CPU What is a central processing unit (CPU) Notable makers of CPUs GPU Graphics Card: GPU The classifications of graphics cards The brands of graphics cards Dedicated Graphics Cards GeForce MX Series: GeForc…...

网络编程概念详解模拟回显客户端服务器

目录 1.网络中重要的概念 1&#xff09;IP地址&#xff1a; 2&#xff09;端口号&#xff1a; 3&#xff09;协议 协议分层 OSI七层模型(教科书) TCP/IP五层模型 封装和分用 网络套接字 面试题&#xff1a;TCP/UDP的区别&#xff1f; UDP数据报套接字编程 模拟一个回…...

代码随想录第二十四天|动态规划(8)

目录 LeetCode 300. 最长递增子序列 LeetCode 674. 最长连续递增序列 LeetCode 718. 最长重复子数组 LeetCode 1143. 最长公共子序列 LeetCode 1035. 不相交的钱 LeetCode 53. 最大子序和 LeetCode 392. 判断子序列 总结 LeetCode 300. 最长递增子序列 题目链接&#…...

uni-app学习笔记二十九--数据缓存

uni.setStorageSync(KEY,DATA) 将 data 存储在本地缓存中指定的 key 中&#xff0c;如果有多个key相同&#xff0c;下面的会覆盖掉原上面的该 key 对应的内容&#xff0c;这是一个同步接口。数据可以是字符串&#xff0c;可以是数组。 <script setup>uni.setStorageSyn…...

Linux下如何查看一个端口被什么进程占用? 该进程又打开了哪些文件?

Linux下如何查看一个端口被什么进程占用&#xff1f; 该进程又打开了哪些文件&#xff1f; 查看端口 1.使用lsof命令查看端口占用的进程 lsof可以列出系统上打开的文件&#xff0c;其中包括网络连接、进程信息等。 lsof -i:<端口号> 例如&#xff0c;如果需…...

12-Oracle 23ai Vector 使用ONNX模型生成向量嵌入

一、Oracle 23ai Vector Embeddings 核心概念​ 向量嵌入&#xff08;Vector Embeddings&#xff09;​​ -- 将非结构化数据&#xff08;文本/图像&#xff09;转换为数值向量 - - 捕获数据的语义含义而非原始内容 - 示例&#xff1a;"数据库" → [0.24, -0.78, 0.5…...

记录一个用了很久的git提交到github和gitee比较方便的方法

在当前git init后&#xff0c;在隐藏的git文件夹中找到config文件 [user]name thels [remote "github"]url your github repository urlfetch refs/heads/*:refs/remotes/origin/* [remote "gitee"]url your gitee repository urlfetch refs/heads/*:…...

如何生成和制作PDF文件

在数字化办公的今天&#xff0c;PDF文件已经成为我们工作和学习中不可或缺的一部分。无论是合同、报告、简历&#xff0c;还是电子书、表单&#xff0c;PDF格式都以其跨平台兼容性、不可编辑性和清晰的排版而被广泛使用。但你是否知道&#xff0c;生成和制作PDF文件其实并不复杂…...

Golang基础学习

​​​​​​​​​​ 初见golang语法 go项目路径 cd $GOPATH //ls可以看到有bin,pkg,src三个文件 cd src/ mkdir GolangStudy cd GolangStudy mkdir firstGolanggo程序执行: go run hello.go//如果想分两步执行: go build hello.go ./hello导入包的方式 import "f…...

大故障,阿里云核心域名疑似被劫持

2025年6月5日凌晨&#xff0c;阿里云多个服务突发异常&#xff0c;罪魁祸首居然是它自家的“核心域名”——aliyuncs.com。包括对象存储 OSS、内容分发 CDN、镜像仓库 ACR、云解析 DNS 等服务在内&#xff0c;全部受到波及&#xff0c;用户业务连夜“塌房”。 更让人惊讶的是&…...

ps蒙版介绍

一、蒙版的类型 Photoshop中有多种蒙版类型&#xff0c;每种适用于不同的场景&#xff1a; 图层蒙版&#xff08;Layer Mask&#xff09; 作用&#xff1a;控制图层的可见性&#xff0c;黑色隐藏、白色显示、灰色半透明。特点&#xff1a;可随时编辑&#xff0c;适合精细调整。…...

OpenWrt:使用ALSA实现边录边播

ALSA是Linux系统中的高级音频架构&#xff08;Advanced Linux Sound Architecture&#xff09;。目前已经成为了linux的主流音频体系结构&#xff0c;想了解更多的关于ALSA的知识&#xff0c;详见&#xff1a;http://www.alsa-project.org 在内核设备驱动层&#xff0c;ALSA提供…...

【win | 自动更新关闭】win11

利用本地组策略编辑器 对于Windows 11专业版或更高版本的用户&#xff0c;可以利用本地组策略编辑器来完全关闭自动更新。按下“WinR”键&#xff0c;输入“gpedit.msc”并回车。在本地组策略编辑器中&#xff0c;依次展开“计算机配置”>“管理模板”>“Windows组件”&…...