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

奇异值分解(SVD):线性代数在AI大模型中的核心工具

在这里插入图片描述

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用,熟悉DICOM医学影像及DICOM协议,业余时间自学JavaScript,Vue,qt,python等,具备多种混合语言开发能力。撰写博客分享知识,致力于帮助编程爱好者共同进步。欢迎关注、交流及合作,提供技术支持与解决方案。\n技术合作请加本人wx(注明来自csdn):xt20160813

在这里插入图片描述

奇异值分解(SVD):线性代数在AI大模型中的核心工具

人工智能(AI)大模型的理论基础建立在线性代数、概率统计和微积分之上,其中线性代数为数据表示、模型计算和优化提供了核心工具。奇异值分解(Singular Value Decomposition,SVD)作为线性代数中的重要方法,不仅是矩阵分解的通用技术,还在AI大模型的多个环节(如数据压缩、降维、推荐系统和自然语言处理)中发挥关键作用。本文将深入讲解SVD的概念、原理、数学推导及其在AI大模型中的应用,确保内容准确且易于理解。


一、SVD的概念与原理

1. 什么是SVD?

奇异值分解是一种矩阵分解方法,适用于任意实数或复数矩阵(不仅限于方阵)。对于任意 m × n m \times n m×n矩阵 A \mathbf{A} A,SVD将其分解为三个矩阵的乘积:
A = U Σ V T \mathbf{A} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T A=UΣVT
其中:

  • U \mathbf{U} U m × m m \times m m×m 的正交矩阵,其列向量是左奇异向量,满足 U T U = I \mathbf{U}^T \mathbf{U} = \mathbf{I} UTU=I
  • Σ \mathbf{\Sigma} Σ m × n m \times n m×n 的对角矩阵,其主对角线上的非负元素称为奇异值(按降序排列),其余元素为0。
  • V \mathbf{V} V n × n n \times n n×n的正交矩阵,其列向量是右奇异向量,满足 V T V = I \mathbf{V}^T \mathbf{V} = \mathbf{I} VTV=I
  • V T \mathbf{V}^T VT:矩阵 V \mathbf{V} V的转置。

奇异值分解的几何意义是将矩阵 A \mathbf{A} A 表示为一系列线性变换的组合:先通过 V T \mathbf{V}^T VT旋转或反射,再通过 $mathbf{\Sigma}$ 缩放,最后通过 U \mathbf{U} U 再次旋转或反射。

2. 奇异值的定义

奇异值是矩阵 A T A \mathbf{A}^T \mathbf{A} ATA的特征值的平方根。假设 A T A \mathbf{A}^T \mathbf{A} ATA的特征值为 λ 1 , λ 2 , … , λ n \lambda_1, \lambda_2, \dots, \lambda_n λ1,λ2,,λn(按降序排列),则奇异值为:
σ i = λ i , i = 1 , 2 , … , min ⁡ ( m , n ) \sigma_i = \sqrt{\lambda_i}, \quad i = 1, 2, \dots, \min(m, n) σi=λi ,i=1,2,,min(m,n)
奇异值反映了矩阵 A \mathbf{A} A在不同方向上的“重要性”或“能量”分布。

3. SVD与特征分解的关系

SVD是特征分解的推广:

  • 特征分解适用于方阵(通常是对称矩阵或正定矩阵),将矩阵分解为 A = V Λ V − 1 \mathbf{A} = \mathbf{V} \mathbf{\Lambda} \mathbf{V}^{-1} A=VΛV1,其中 Λ \mathbf{\Lambda} Λ 是特征值对角矩阵。
  • SVD适用于任意矩阵,通过分解 A T A \mathbf{A}^T \mathbf{A} ATA A A T \mathbf{A} \mathbf{A}^T AAT 的特征值和特征向量,构造奇异值和奇异向量。

具体推导如下:

  • A T A \mathbf{A}^T \mathbf{A} ATA 是一个 n × n n \times n n×n的对称半正定矩阵,其特征向量构成 V \mathbf{V} V,特征值 λ i \lambda_i λi 的平方根是奇异值 σ i \sigma_i σi
  • A A T \mathbf{A} \mathbf{A}^T AAT是一个 m × m m \times m m×m 的对称半正定矩阵,其特征向量构成 U \mathbf{U} U

4. 紧 personally分解与截断SVD

  • 完全SVD:包含所有奇异值和奇异向量。
  • 紧 personally分解:仅保留非零奇异值对应的部分,适用于秩不足的矩阵。
  • 截断SVD:只保留前 k k k个最大的奇异值及其对应的奇异向量,生成低秩近似:
    A k = U k Σ k V k T \mathbf{A}_k = \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k^T Ak=UkΣkVkT
    其中 U k \mathbf{U}_k Uk m × k m \times k m×k Σ k \mathbf{\Sigma}_k Σk k × k k \times k k×k V k \mathbf{V}_k Vk n × k n \times k n×k。截断SVD是数据压缩和降维的核心工具。

二、SVD的数学推导

为了理解SVD的原理,以下是其计算过程的简要推导:

  1. 计算 A T A \mathbf{A}^T \mathbf{A} ATA A A T \mathbf{A} \mathbf{A}^T AAT

    • A T A \mathbf{A}^T \mathbf{A} ATA n × n n \times n n×n 的对称矩阵,其特征值是非负的,特征向量构成 V \mathbf{V} V
    • A A T \mathbf{A} \mathbf{A}^T AAT m × m m \times m m×m 的对称矩阵,其特征向量构成 U \mathbf{U} U
  2. 求解特征值和特征向量

    • A T A \mathbf{A}^T \mathbf{A} ATA进行特征分解,得到特征值 λ i \lambda_i λi和特征向量 v i \mathbf{v}_i vi
    • 奇异值 σ i = λ i \sigma_i = \sqrt{\lambda_i} σi=λi ,右奇异向量为 v i \mathbf{v}_i vi
    • 类似地,对 A A T \mathbf{A} \mathbf{A}^T AAT求特征向量,得到左奇异向量 u i \mathbf{u}_i ui
  3. 构造 $\mathbf{\Sigma} $

    • 将奇异值 σ i \sigma_i σi 按降序排列,置于对角矩阵 Σ \mathbf{\Sigma} Σ的主对角线上。
  4. 验证分解

    • 通过 A = U Σ V T \mathbf{A} = \mathbf{U} \mathbf{\Sigma} \mathbf{V}^T A=UΣVT,验证分解的正确性。

在实际计算中,SVD通常通过数值方法(如QR分解或Jacobi方法)实现,Python的NumPy库提供了高效的SVD实现:

import numpy as npA = np.array([[1, 2], [3, 4], [5, 6]])
U, Sigma, Vt = np.linalg.svd(A)
print("U:", U)
print("Sigma:", Sigma)
print("V^T:", Vt)

三、SVD在AI大模型中的应用

SVD因其强大的矩阵分解能力和降维特性,在AI大模型的多个领域有广泛应用。以下是具体场景:

1. 数据压缩与降维

  • 场景:高维数据(如图像、视频或文本特征)占用大量存储和计算资源,SVD通过低秩近似减少维度。
  • 原理:截断SVD保留前 k k k 个最大奇异值,生成近似矩阵 A k \mathbf{A}_k Ak,显著降低存储需求,同时保留主要信息。
  • 示例:在医疗影像处理中,DICOM图像的像素矩阵可以通过SVD压缩。例如,一个 512 × 512 512 \times 512 512×512 的图像矩阵可以用前50个奇异值近似,减少约90%的存储空间。
  • 代码示例
    import numpy as np
    import matplotlib.pyplot as plt# 假设A是图像矩阵
    A = np.random.rand(512, 512)
    U, Sigma, Vt = np.linalg.svd(A)
    k = 50
    A_k = U[:, :k] @ np.diag(Sigma[:k]) @ Vt[:k, :]
    plt.imshow(A_k, cmap="gray")
    plt.title("Compressed Image (k=50)")
    plt.show()
    

2. 主成分分析(PCA)

  • 场景:PCA是降维的经典方法,广泛用于数据预处理和特征提取。
  • 原理:PCA通过对协方差矩阵进行特征分解(或等价地对数据矩阵进行SVD)找到数据的主方向。SVD的 U \mathbf{U} U Σ \mathbf{\Sigma} Σ 提供了主成分和方差信息。
  • AI应用:在图像分类或文本分析中,PCA通过SVD将高维特征降到低维,减少模型训练时间。例如,MNIST手写数字数据集的784维特征可以通过SVD降到50维,保留95%以上的方差。
  • 示例:对数据集进行PCA:
    from sklearn.decomposition import PCAX = np.random.rand(100, 784)  # 模拟数据集
    pca = PCA(n_components=50)
    X_reduced = pca.fit_transform(X)
    print(X_reduced.shape)  # 输出:(100, 50)
    

3. 推荐系统

  • 场景:推荐系统(如Netflix或电商平台)通过分析用户-物品评分矩阵提供个性化推荐。
  • 原理:SVD分解用户-物品矩阵 A \mathbf{A} A(行表示用户,列表示物品),提取潜在特征:
    A ≈ U k Σ k V k T \mathbf{A} \approx \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k^T AUkΣkVkT
    其中 U k \mathbf{U}_k Uk 表示用户潜在特征, V k \mathbf{V}_k Vk 表示物品潜在特征, Σ k \mathbf{\Sigma}_k Σk 反映特征强度。
  • AI应用:SVD用于协同过滤,预测用户对未评分物品的偏好。例如,Netflix使用SVD分解评分矩阵,推荐用户可能喜欢的电影。
  • 示例:简单SVD推荐:
    A = np.array([[5, 3, 0], [4, 0, 0], [0, 0, 5]])  # 用户-物品矩阵
    U, Sigma, Vt = np.linalg.svd(A)
    k = 2
    A_k = U[:, :k] @ np.diag(Sigma[:k]) @ Vt[:k, :]
    print(A_k)  # 预测评分
    

4. 自然语言处理(NLP)

  • 场景:SVD用于潜在语义分析(Latent Semantic Analysis,LSA),从文档-词矩阵中提取语义结构。
  • 原理:文档-词矩阵 A \mathbf{A} A(行表示文档,列表示词)通过SVD分解为:
    A ≈ U k Σ k V k [ I d e a l R e s p o n s e ] \mathbf{A} \approx \mathbf{U}_k \mathbf{\Sigma}_k \mathbf{V}_k [Ideal Response] AUkΣkVk[IdealResponse]
    文档和词的潜在特征分别由 U k \mathbf{U}_k Uk V k \mathbf{V}_k Vk 表示, Σ k \mathbf{\Sigma}_k Σk反映主题强度。
  • AI应用:LSA通过SVD分析文档-词矩阵,提取主题或语义关系。例如,LSA可用于文本分类或信息检索,降低词向量维度,提高语义匹配效率。
  • 示例:LSA实现:
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.decomposition import TruncatedSVDdocs = ["AI is transforming healthcare", "Machine learning improves diagnosis"]
    vectorizer = TfidfVectorizer()
    X = vectorizer.fit_transform(docs)
    svd = TruncatedSVD(n_components=1)
    X_lsa = svd.fit_transform(X)
    print(X_lsa)  # 文档的低维表示
    

5. 模型压缩与加速

  • 场景:大模型(如Transformer)的权重矩阵占用大量存储和计算资源,SVD可用于模型压缩。
  • 原理:通过SVD对权重矩阵进行低秩近似,减少参数量,同时尽量保留模型性能。
  • AI应用:在BERT或GPT等模型中,SVD分解注意力机制的权重矩阵,降低推理时间和内存需求。例如,一个 ( 768 \times 768 ) 的权重矩阵可以通过SVD压缩到前100个奇异值,显著减少计算量。
  • 示例:权重矩阵压缩(伪代码):
    W = np.random.rand(768, 768)  # 权重矩阵
    U, Sigma, Vt = np.linalg.svd(W)
    k = 100
    W_k = U[:, :k] @ np.diag(Sigma[:k]) @ Vt[:k, :]
    # 用W_k替换原始权重
    

四、SVD的优缺点

优点:

  • 通用性:适用于任意矩阵,扩展了特征分解的应用范围。
  • 稳定性:数值计算稳定,适合高维数据。
  • 降维能力:通过截断SVD有效降低维度,保留主要信息。
  • 可解释性:奇异值和奇异向量提供了数据的结构化表示。

缺点:

  • 计算复杂度:SVD的计算复杂度为 O ( min ⁡ ( m n 2 , m 2 n ) ) O(\min(mn^2, m^2n)) O(min(mn2,m2n)),对超大规模矩阵可能较慢。
  • 存储需求:完全SVD需要存储 U \mathbf{U} U Σ \mathbf{\Sigma} Σ、 $\mathbf{V}^T $,可能占用大量内存。
  • 解释难度:奇异向量和奇异值的物理意义可能不如特征向量直观。

五、学习SVD的实践建议

  1. 理论学习

    • 理解SVD与特征分解的联系,推导 A T A \mathbf{A}^T \mathbf{A} ATA A A T \mathbf{A} \mathbf{A}^T AAT的特征分解过程。
    • 阅读《Linear Algebra and Its Applications》(Gilbert Strang)或MIT线性代数课程(18.06)。
  2. 编程实践

    • 使用NumPy的 np.linalg.svd 或SciPy的 scipy.linalg.svd 实现SVD,验证分解结果。
    • 结合PyTorch或TensorFlow,尝试SVD在神经网络权重压缩中的应用。
  3. 项目驱动

    • 实现一个简单的推荐系统,使用SVD分解用户-物品矩阵。
    • 在医疗影像数据集(如DICOM文件)上应用SVD,压缩图像或提取特征。
    • 使用LSA分析文本数据集,提取文档主题。
  4. 工具与资源

    • Python库:NumPy、SciPy、scikit-learn。
    • 可视化工具:Matplotlib、Seaborn(用于展示奇异值分布或降维结果)。
    • 开源项目:参考GitHub上的SVD相关实现(如推荐系统或LSA项目)。

六、结语

奇异值分解(SVD)作为线性代数的核心工具,在AI大模型中扮演着不可或缺的角色。从数据压缩到推荐系统,从降维到自然语言处理,SVD通过矩阵分解和低秩近似,显著提高了模型效率和性能。结合Python的NumPy和scikit-learn,开发者可以轻松实现SVD,并在实际项目中探索其强大功能。无论你是希望优化模型、处理高维数据,还是深入理解AI原理,掌握SVD都是迈向成功的关键一步。现在就打开Jupyter Notebook,尝试对一个矩阵进行SVD分解,开启线性代数与AI的奇妙之旅!


本文基于AI大模型的需求,详细讲解了SVD的概念、原理和应用,结合Python代码和实际场景,适合初学者和进阶开发者参考。

相关文章:

奇异值分解(SVD):线性代数在AI大模型中的核心工具

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...

矩阵分解相关知识点总结(二)

文章目录 三、矩阵的QR分解3.1、Givens矩阵与Givens变换3.2、Householder矩阵与Householder变换3.3、QR分解 书接上文矩阵分解相关知识点总结(一) 三、矩阵的QR分解 3.1、Givens矩阵与Givens变换 设非零列向量 x ∈ R n \bm{x}\in {\bf{R}}^n x∈Rn及单…...

MySQL——视图 用户管理 语言访问

目录 视图 用户管理 数据库权限 访问 准备工作 使用函数 mysql界面级工具 连接池 视图 这里的视图与事务中的读视图是两个不同的概念:视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。视图的…...

二、Sqoop 详细安装部署教程

作者:IvanCodes 日期:2025年6月2日 专栏:Sqoop教程 Apache Sqoop 是一个强大的工具,用于在 Hadoop (HDFS, Hive, HBase) 与关系型数据库 (如 MySQL, PostgreSQL, Oracle) 之间高效传输数据。本教程将详细指导您如何根据官方网站截…...

用Python开启游戏开发之旅

在当今丰富多彩的数字娱乐世界中,游戏以其独特的魅力吸引着无数人的目光。而Python这门功能强大又简洁易懂的编程语言,也为游戏开发打开了一扇充满创意的大门。 一、选择Python的理由 Python之所以备受游戏开发者青睐,有诸多原因。其一&#…...

React 第五十四节 Router中useRevalidator的使用详解及案例分析

前言 useRevalidator 是 React Router v6.4 引入的一个强大钩子,用于在数据路由(Data Router)中手动触发路由数据的重新验证(revalidation)。 它在需要主动刷新数据而不改变路由位置的场景中非常有用。 一、useReval…...

【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令

目录 五.#和##运算符 5.1--#运算符 5.2--##运算符 六.命名约定,#undef,命令行定义 6.1--命名约定 6.2--#undef 6.3--命名行定义 七.条件编译 常见的条件编译指令: 1.普通的条件编译: 2.多个分支的条件编译(可以利用条…...

03.搭建K8S集群

K8S集群搭建的方式 目前主流的搭建k8s集群的方式有kubeadm、minikube、二进制包三种方式: kubeadm(本案例搭建方式) 是一个工具,用于快速搭建kubernetes集群,目前应该是比较方便和推荐的,简单易用 kubea…...

RDMA简介3之四种子协议对比

RDMA协议共有四种子协议,分别为InfiniBand、iWARP、RoCE v1和RoCE v2协议。这四种协议使用统一的RDMA API,但在具体的网络层级实现上有所不同,如图1所示,接下来将分别介绍这四种子协议。 图1 RDMA四种子协议网络层级关系图 Infin…...

【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程

一.系统介绍 一款基于ThinkPHPUniapp开发的多门店洗车系统,包含用户端(小程序)、门店员工端(小程序)、门店端(PC)、平台管理端(PC)。 门店分连锁门店和独立门店&#xf…...

力扣LeetBook数组和字符串--二维数组

1.旋转矩阵 题目链接 想了那么久的各种旋转,对角线,其实把问题搞复杂了。 旋转90度的本质无非就是转置镜像对称 转置是什么?:将矩阵的行和列互换。 镜像对称:把矩阵从中间对折,互换位置 矩阵 A A [ 1 3 0…...

Linux开发工具(apt,vim,gcc)

目录 yum/apt包管理器 Linux编辑器 vim 1.见一见vim 2.vim的多模式 3.命令模式底行模式等 4.vim的配置 Linux编译器 gcc/g 1.预处理(宏替换) 2.编译(生成汇编) 3.汇编(生成机器可识别代码) 4.连…...

C# ExcelWorksheet 贴图

C# ExcelWorksheet 贴图 在C#中,如果你想在Excel工作表中插入图片(例如,在ExcelWorksheet中贴图),你可以使用ClosedXML或EPPlus这样的库来操作Excel文件。下面我将分别介绍如何使用这两个库来实现这一功能。 使用ClosedXML 首先,确保你已经安装了ClosedXML包。你可以通…...

鸿蒙Next开发真机调试签名申请流程

背景: 在学习鸿蒙next开发应用的初期总是会遇到一堆的问题,毕竟鸿蒙next开发不管是他的ArKTS语言还是他的开发工具DevEco Studio都还在起步阶段,就像当初的Android起步一样,总会有资料不足的一些问题。就比如我们学习下载完DevEco…...

[yolov11改进系列]基于yolov11引入上下文锚点注意力CAA的python源码+训练源码

【CAA介绍】 本文记录的是基于CAA注意力模块的RT-DETR目标检测改进方法研究。在远程遥感图像或其他大尺度变化的图像中目标检测任务中,为准确提取其长距离上下文信息,需要解决大目标尺度变化和多样上下文信息时的不足的问题。CAA能够有效捕捉长距离依赖…...

【Elasticsearch】 查询优化方式

在优化Elasticsearch的查询性能时,可以从多个维度着手,包括索引设计、查询优化、集群配置、数据管理以及监控分析等。常见的优化方式和策略有以下几种: 一、索引优化 合理设计字段类型: 字段类型选择: 对于不需要分词的…...

Xcode 16.4 + iOS 18 系统运行时崩溃:___cxa_current_primary_exception 符号丢失的原因与解决方案

在使用 Xcode 16.4 构建项目,运行到 iOS 18.3 或更早版本系统(包括模拟器)时,出现了如下的运行时崩溃: dyld[22183]: Symbol not found: ___cxa_current_primary_exceptionReferenced from: /.../WidgetOn.app/Widget…...

【linux】全志Tina预编译一个so库文件到根文件系统/usr/lib/下

一、sdk中新建文件夹 路径: V:\t113\work3\t113\openwrt\package\feeds\libs\md5util md5util为需要注入的库文件夹。 文件结构 libs md5util files libmd5util.so makefile etc.. 二、编写makefile include $(TOPDIR)/rules.mkPKG_NAME : md5util PKG_VERSIO…...

C# 类和继承(成员访回修饰符)

成员访回修饰符 本章之前的两节阐述了类的可访问性。对类的可访问性,只有两种修饰符:internal和public。 本节阐述成员的可访问性。类的可访问性描述了类的可见性;成员的可访问性描述了类成员的可 见性。 声明在类中的每个成员对系统的不同…...

c++ stl容器之map用法

目录 (1)map介绍 (2)map、multimap、unordered_map区别 (3)map用法 1.map接口表 2.使用举例 插入数据与遍历数据 查找关键字和值 删除元素 按照值排序 (4)multimap用法 &…...

Linux-文件管理及归档压缩

1.根下的目录作用说明: /:Linux系统中所有的文件都在根下/bin:(二进制命令目录)存放常用的用户命令/boot:系统启动时的引导文件(内核的引导配置文件,grub配置文件,内核配置文件) 例…...

结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南

基于最佳实践的Spring Boot自动化部署实战指南,结合Jenkins、Docker和Kubernetes等主流工具,提供从环境搭建到生产部署的完整流程: 一、环境准备与工具选型​​ ​​1.基础设施​​ ​​Jenkins服务器​​:安装Jenkins LTS版本,配置JDK(推荐JDK 11+)及Maven/Gradle插…...

微软认证考试科目众多?该如何选择?

在云计算、人工智能、数据分析等技术快速发展的今天,微软认证(Microsoft Certification)已成为IT从业者、开发者、数据分析师提升竞争力的重要凭证。但面对众多考试科目,很多人不知道如何选择。本文将详细介绍微软认证的考试方向、…...

MCP协议在LLM系统中的架构与实现原理研究

MCP协议的角色和功能定位 模型上下文协议(Model Context Protocol, MCP) 是由Anthropic公司(Claude模型的发布方)提出的一种开放协议,旨在标准化大型语言模型(LLM)与外部数据源、工具和服务之间的交互方式。可以将MCP类比为AI应用的“USB-C接口”:通过统一的接口协议,…...

Dify工作流实践—根据word需求文档编写测试用例到Excel中

前言 这篇文章依赖到的操作可查阅我之前的文章: dify里的大模型是怎么添加进来的:在Windows本地部署Dify详细操作 flask 框架app.route()函数的开发和调用:PythonWeb开发框架—Flask工程创建和app.route使用详解 结构化提示词的编写&…...

【LC实战派】小智固件编译

这篇写给立创吴总,是节前答应他配合git代码的说明;也给所有对小智感兴趣的小伙伴。 请多提意见,让这份文档更有价值 - 第一当然是拉取源码 - git clone https://github.com/78/xiaozhi-esp32.git 完成后,先查看固件中实际的…...

HTTP(超文本传输协议)详解

目录 一、基本概念 二、HTTP报文(结构) (一) 请求报文 (二) 响应报文 三、HTTP请求方法 1. GET方法 2. POST方法 3. PUT方法 4. HEAD方法 5. DELETE 6. OPTIONS 一、知识扩展 7. TRACE 8. CONNECT 四、HTTP持久通信 (一) HTTP keep-alive…...

Unity安卓平台开发,启动app并传参

using UnityEngine; using System;public class IntentReceiver : MonoBehaviour {public bool isVR1;void Start(){Debug.LogError("app1111111111111111111111111");if (isVR1){LaunchAnotherApp("com.HappyMaster.DaKongJianVR2");}else{// 检查是否有传…...

jdbcTemplate.query备忘录

jdbcTemplate.query中使用全部字符串和参数注入&#xff0c; 查询速度为什么差距这么大 如何正确使用JdbcTemplate参数化查询 1、使用?占位符 String sql "SELECT * FROM users WHERE name LIKE ?"; List<User> users jdbcTemplate.query(sql,new Object[…...

如何搭建Z-Blog PHP版本:详细指南

Z-Blog是一款功能强大且易于使用的博客平台&#xff0c;支持PHP和ASP两种环境。本文将重点介绍如何在PHP环境下搭建Z-Blog博客系统&#xff0c;帮助您快速上线自己的个人博客站点。 准备工作 1. 获取Z-Blog PHP版本 首先&#xff0c;访问Z-Blog官方网站下载最新版本的Z-Blog…...