正交投影与内积空间:机器学习的几何基础
前言
本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!
本专栏目录结构和参考文献请见《机器学习数学通关指南》
正文
🔍 1. 内积空间的数学定义
1.1 代数定义 ✏️
两个维度相同的向量 a = [ a 1 , … , a n ] \mathbf{a} = [a_1, \dots, a_n] a=[a1,…,an] 和 b = [ b 1 , … , b n ] \mathbf{b} = [b_1, \dots, b_n] b=[b1,…,bn],其内积为:
a ⋅ b = ∑ i = 1 n a i b i \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^n a_i b_i a⋅b=∑i=1naibi
内积结果为标量,是后续投影和正交性的计算基础。在Python中可以这样实现:
import numpy as npa = np.array([1, 2, 3])
b = np.array([4, 5, 6])
dot_product = np.dot(a, b) # 或简写为 a.dot(b) 或 a @ b
print(f"内积结果: {dot_product}") # 输出: 内积结果: 32
1.2 几何定义 📐
从几何角度,向量 a \mathbf{a} a 与向量 b \mathbf{b} b 的内积为:
a ⋅ b = ∥ a ∥ ∥ b ∥ cos θ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta a⋅b=∥a∥∥b∥cosθ
其中 θ \theta θ 是两个向量的夹角。这一性质直接关联到正交投影的计算,并表明:
- 当 θ = 90 ° \theta = 90° θ=90° 时,内积为0(正交向量)
- 当 θ = 0 ° \theta = 0° θ=0° 时,内积最大(同向向量)
- 当 θ = 180 ° \theta = 180° θ=180° 时,内积为负(反向向量)
🚀 2. 正交投影的核心思想
2.1 投影的物理意义 💡
向量 a \mathbf{a} a 在向量 b \mathbf{b} b 上的正交投影反映了前者在后者方向上的"影子长度"(即分解到该方向的分量):
投影长度 = ∥ a ∥ cos θ = a ⋅ b ∥ b ∥ \text{投影长度} = \|\mathbf{a}\| \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|} 投影长度=∥a∥cosθ=∥b∥a⋅b
投影向量则为:
投影向量 = a ⋅ b ∥ b ∥ 2 b \text{投影向量} = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{b}\|^2} \mathbf{b} 投影向量=∥b∥2a⋅bb
2.2 正交基与坐标表示 📊
在标准正交基下(如二维空间的基向量 e 1 , e 2 \mathbf{e}_1, \mathbf{e}_2 e1,e2),向量 v = [ v 1 , v 2 ] T \mathbf{v} = [v_1, v_2]^T v=[v1,v2]T 的坐标值实际上是其在基向量上的投影:
v 1 = v ⋅ e 1 , v 2 = v ⋅ e 2 v_1 = \mathbf{v} \cdot \mathbf{e}_1, \quad v_2 = \mathbf{v} \cdot \mathbf{e}_2 v1=v⋅e1,v2=v⋅e2
这揭示了一个重要概念:内积空间的坐标系本质上建立在投影关系上。
🧩 3. 正交基的构造方法(Gram-Schmidt过程)
3.1 算法步骤 🔄
Gram-Schmidt正交化是将一组线性无关向量转换为正交基(甚至标准正交基)的经典方法:
- 从第一个向量开始,标准化得到第一个正交基向量
- 计算下一个向量在已有正交基上的投影
- 从原向量中减去这些投影分量,得到正交分量
- 标准化正交分量得到新的正交基向量
- 重复步骤2-4直到处理完所有向量
3.2 二维空间实例实现 🔨
如何将非正交基 { a 1 , a 2 } \{\mathbf{a}_1, \mathbf{a}_2\} {a1,a2} 转化为正交基 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2}:
- 赋值 q 1 = a 1 ∥ a 1 ∥ \mathbf{q}_1 = \frac{\mathbf{a}_1}{\|\mathbf{a}_1\|} q1=∥a1∥a1
- 计算 a 2 \mathbf{a}_2 a2 到 q 1 \mathbf{q}_1 q1 的投影分量:
投影向量 = ( a 2 ⋅ q 1 ) q 1 \text{投影向量} = (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 投影向量=(a2⋅q1)q1 - 去除投影分量后的正交向量:
v 2 = a 2 − ( a 2 ⋅ q 1 ) q 1 \mathbf{v}_2 = \mathbf{a}_2 - (\mathbf{a}_2 \cdot \mathbf{q}_1) \mathbf{q}_1 v2=a2−(a2⋅q1)q1 - 标准化得:
q 2 = v 2 ∥ v 2 ∥ \mathbf{q}_2 = \frac{\mathbf{v}_2}{\|\mathbf{v}_2\|} q2=∥v2∥v2
生成的 { q 1 , q 2 } \{\mathbf{q}_1, \mathbf{q}_2\} {q1,q2} 是标准正交基。
Python实现 🐍
def gram_schmidt(vectors):"""将一组线性无关向量正交化"""basis = []for v in vectors:w = v.copy() # 从原始向量开始for b in basis:# 减去在已有基向量上的投影w = w - np.dot(w, b) / np.dot(b, b) * b# 如果剩余向量不为零,则标准化并添加到基向量集if np.linalg.norm(w) > 1e-10:basis.append(w / np.linalg.norm(w))return np.array(basis)# 示例
vectors = np.array([[1, 1], [1, 0]])
orthonormal_basis = gram_schmidt(vectors)
print("正交基:\n", orthonormal_basis)# 验证正交性
dot_product = np.dot(orthonormal_basis[0], orthonormal_basis)
print(f"内积结果(应接近0): {dot_product:.10f}")
🔬 4. 正交投影与矩阵表示
4.1 矩阵向量乘法的几何解释 📈
在标准正交基下,向量 v \mathbf{v} v 的坐标可表示为:
v 投影 = [ v ⋅ e 1 v ⋅ e 2 ] \mathbf{v}_{\text{投影}} = \begin{bmatrix} \mathbf{v} \cdot \mathbf{e}_1 \\ \mathbf{v} \cdot \mathbf{e}_2 \end{bmatrix} v投影=[v⋅e1v⋅e2]
它等价于基向量组成的变换矩阵 Q = [ e 1 e 2 ] \mathbf{Q} = [\mathbf{e}_1 \quad \mathbf{e}_2] Q=[e1e2] 的转置与向量的乘积:
v 投影 = Q T v \mathbf{v}_{\text{投影}} = \mathbf{Q}^T \mathbf{v} v投影=QTv
4.2 投影矩阵 🔄
向量 v \mathbf{v} v 投影到子空间 W W W 上的投影矩阵为:
P W = Q ( Q T Q ) − 1 Q T \mathbf{P}_W = \mathbf{Q}(\mathbf{Q}^T\mathbf{Q})^{-1}\mathbf{Q}^T PW=Q(QTQ)−1QT
当 Q \mathbf{Q} Q 是标准正交基时,简化为:
P W = Q Q T \mathbf{P}_W = \mathbf{Q}\mathbf{Q}^T PW=QQT
🌟 5. 机器学习中的应用实例
5.1 主成分分析 (PCA) 🧠
PCA是最常见的降维技术,其核心就是寻找数据最大方差方向的正交基,并在该基上投影:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA# 生成有相关性的二维数据
np.random.seed(42)
cov = [[2, 1.5], [1.5, 1]]
data = np.random.multivariate_normal([0, 0], cov, 500)# 应用PCA
pca = PCA(n_components=2)
pca.fit(data)
transformed = pca.transform(data)# 可视化
plt.figure(figsize=(12, 5))# 原始数据
plt.subplot(1, 2, 1)
plt.scatter(data[:, 0], data[:, 1], alpha=0.5)
plt.title('原始数据')
plt.grid(True)# PCA转换后的数据
plt.subplot(1, 2, 2)
plt.scatter(transformed[:, 0], transformed[:, 1], alpha=0.5)
for i, (comp, var) in enumerate(zip(pca.components_, pca.explained_variance_)):plt.quiver(0, 0, comp[0], comp, scale=var*3, color='r',label=f'PC{i+1}: {var:.2f}')
plt.title('PCA转换后数据')
plt.grid(True)
plt.legend()plt.tight_layout()
plt.show()print(f"主成分方差比例: {pca.explained_variance_ratio_}")
print(f"主成分方向: {pca.components_}")
5.2 QR分解与矩阵求解 🧮
QR分解是Gram-Schmidt正交化的矩阵形式,广泛用于线性方程组求解和最小二乘法问题:
import numpy as np# 用于求解线性方程组 Ax = b
A = np.array([[2, 1], [1, 3]])
b = np.array([5, 4])# QR分解
Q, R = np.linalg.qr(A)# 求解方程 Rx = Q^T b
y = Q.T @ b
x = np.linalg.solve(R, y)print("QR分解求解的解: ", x)
print("直接求解的解: ", np.linalg.solve(A, b))
print("误差: ", np.linalg.norm(A @ x - b))
5.3 核方法与支持向量机 🔍
在支持向量机(SVM)中,核函数实质上定义了特征空间中的内积,使我们能在高维空间中执行计算而无需显式映射:
from sklearn import svm
from sklearn.datasets import make_circles
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt# 生成非线性可分数据
X, y = make_circles(n_samples=500, noise=0.1, factor=0.3, random_state=42)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练RBF核SVM(本质是在高维空间中寻找正交超平面)
clf = svm.SVC(kernel='rbf', gamma=10)
clf.fit(X_train, y_train)# 预测与评估
accuracy = clf.score(X_test, y_test)# 绘制决策边界
h = 0.02
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)plt.figure(figsize=(8, 6))
plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.scatter(clf.support_vectors_[:, 0], clf.support_vectors_[:, 1],s=80, facecolors='none', edgecolors='k')
plt.title(f'RBF核SVM (准确率: {accuracy:.2f})')
plt.xlabel('特征1')
plt.ylabel('特征2')
plt.tight_layout()
plt.show()
5.4 正交化在神经网络中的应用 🧠
正交初始化和正交约束可以提高神经网络的训练稳定性和泛化能力:
import torch
import torch.nn as nn
import numpy as npclass OrthogonalRegularization(nn.Module):"""实现权重正交化的正则项"""def __init__(self):super(OrthogonalRegularization, self).__init__()def forward(self, model, strength=1e-4):reg_loss = 0.0for name, param in model.named_parameters():if 'weight' in name:if param.ndimension() > 1:# 计算 WW^T - I 的范数,鼓励权重矩阵正交mat = param.view(param.shape[0], -1)sym = torch.mm(mat, mat.t())sym -= torch.eye(sym.shape[0]).to(param.device)reg_loss += torch.sum(sym * sym)return strength * reg_loss# 在训练循环中使用:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels) + ortho_reg(model)
loss.backward()
optimizer.step()
🧮 6. 正交投影和内积空间的进阶应用
6.1 最小二乘法与线性回归 📊
最小二乘法是机器学习中最基础的模型之一,其解可以通过正交投影来理解:
β ^ = ( X T X ) − 1 X T y \hat{\beta} = (X^TX)^{-1}X^Ty β^=(XTX)−1XTy
这个公式本质上是将目标向量 y y y 投影到 X X X 的列空间上:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression# 生成带噪声的线性数据
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 3 * X.squeeze() + 2 + np.random.randn(100) * 0.5# 正交投影方法(手动实现最小二乘)
X_b = np.c_[np.ones((100, 1)), X] # 添加偏置项
theta_best = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y
print(f"手动计算的系数: {theta_best}")# 使用sklearn实现
reg = LinearRegression()
reg.fit(X, y)
print(f"sklearn系数: [{reg.intercept_}, {reg.coef_[0]}]")# 绘制结果
plt.figure(figsize=(10, 6))
plt.scatter(X, y, alpha=0.7)
X_test = np.array([[0], ])
X_test_b = np.c_[np.ones((2, 1)), X_test]
y_pred = X_test_b @ theta_best
plt.plot(X_test, y_pred, 'r-', linewidth=2, label='预测线')
plt.xlabel('X')
plt.ylabel('y')
plt.title('通过正交投影实现的最小二乘法')
plt.grid(True)
plt.legend()
plt.show()
6.2 特征值分解与谱理论 🔮
正交性在特征值分解中表现为正交特征向量,这是许多算法的理论基础:
import numpy as np
import matplotlib.pyplot as plt# 创建一个对称矩阵
A = np.array([[4, 2], [2, 3]])# 特征值分解
eigenvalues, eigenvectors = np.linalg.eig(A)
print("特征值:", eigenvalues)
print("特征向量:\n", eigenvectors)# 验证正交性
dot_product = np.dot(eigenvectors[:, 0], eigenvectors[:, 1])
print(f"特征向量内积(应接近0): {dot_product:.10f}")# 验证 Av = λv
for i in range(len(eigenvalues)):v = eigenvectors[:, i]lhs = A @ vrhs = eigenvalues[i] * vprint(f"特征向量{i+1}的验证误差: {np.linalg.norm(lhs - rhs):.10f}")# 可视化
plt.figure(figsize=(7, 7))
plt.axhline(y=0, color='k', linestyle='-', alpha=0.3)
plt.axvline(x=0, color='k', linestyle='-', alpha=0.3)
plt.grid(alpha=0.3)# 绘制原始矩阵的作用
for i in range(-2, 3):for j in range(-2, 3):v = np.array([i, j]) * 0.5Av = A @ vplt.arrow(v[0], v, Av[0]-v[0], Av-v, head_width=0.1, head_length=0.2, fc='b', ec='b', alpha=0.3)# 绘制特征向量
colors = ['red', 'green']
for i in range(len(eigenvalues)):v = eigenvectors[:, i] * eigenvalues[i]plt.arrow(0, 0, v[0], v, head_width=0.2, head_length=0.3, fc=colors[i], ec=colors[i], label=f'特征向量{i+1} (λ={eigenvalues[i]:.2f})')plt.xlim(-4, 4)
plt.ylim(-4, 4)
plt.title('特征向量与矩阵变换')
plt.legend()
plt.axis('equal')
plt.show()
📝 7. 总结与思考
7.1 核心概念回顾 💭
- 内积空间提供了计算向量长度、角度和投影的统一框架
- 正交性是向量空间中最重要的几何关系之一,表示两个方向完全独立
- 正交投影允许我们将向量分解为互相独立的分量
- Gram-Schmidt过程构造了线性无关向量集的正交基
- 投影矩阵以矩阵形式表达投影操作,为线性代数提供几何解释
7.2 机器学习中的价值 🌱
内积空间和正交投影在机器学习中至关重要,因为它们:
- 简化计算:正交基使得矩阵运算和问题分解更加高效
- 增强解释性:正交特征往往具有更好的解释性和独立含义
- 避免过拟合:特征正交化减少了冗余信息,有助于泛化
- 启发算法设计:从PCA到深度学习中的正交初始化,正交性启发了众多算法改进
相关文章:

正交投影与内积空间:机器学习的几何基础
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 🔍 1. 内积空间的…...

Qt中txt文件输出为PDF格式
main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…...

《HelloGitHub》第 107 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 Python、…...
Langchain解锁LLM大语言模型的结构化输出能力(多种实现方案)
在 LangChain解锁LLM大语言模型的结构化输出能力:调用 with_structured_output() 方法 这篇博客中,我们了解了格式化LLM输出内容的必要性以及如何通过调用langchain框架中提供的 with_structured_output() 方法对LLM输出进行格式化(三种可选方…...

AI数据分析:deepseek生成SQL
在当今数据驱动的时代,数据分析已成为企业和个人决策的重要工具。随着人工智能技术的快速发展,AI 驱动的数据分析工具正在改变我们处理和分析数据的方式。本文将着重介绍如何使用 DeepSeek 进行自动补全SQL 查询语句。 我们都知道,SQL 查询语…...
力扣-动态规划-115 不同子序列
思路 dp数组定义:0_i-1的字符串中有0_j-1的字符串有dp[i][j]个递推公式: if(s[i-1] t[j-1]){dp[i][j] dp[i-1][j-1] dp[i-1][j]; }else{dp[i][j] dp[i-1][j]; } 在该元素相同时,有两种可能1:使用该元素,所以0_i-2…...

Qt C++ 开发 动态上下页按钮实现
项目开发,想实现动态的显示按钮,考虑使用QStackedWidget做两个页面去切换。 首先,我们使用Qt ui 画出两个QStackedWidget的两个页面 要实现切换,我们只需要调用stackedWidget->setCurrentIndex(index)就行。 那么如何自动调…...

数据结构第五节:排序
1.常见的排序算法 插入排序:直接插入排序、希尔排序 选择排序:直接选择排序、堆排序 交换排序:冒泡排序、快速排序 归并排序:归并排序 排序的接口实现: // 1. 直接插入排序 void InsertSort(int* a, int n); // 2. 希…...

从文件到块: 提高 Hugging Face 存储效率
Hugging Face 在Git LFS 仓库中存储了超过30 PB 的模型、数据集和 Spaces。由于 Git 在文件级别进行存储和版本控制,任何文件的修改都需要重新上传整个文件。这在 Hub 上会产生高昂的成本,因为平均每个 Parquet 和 CSV 文件大小在 200-300 MB 之间&#…...
Android14 串口控制是能wifi adb实现简介
Android14 串口控制是能wifi adb实现简介 一、前言 文章目录 Android14 串口控制是能wifi adb实现简介一、前言二、Android14 串口控制是能wifi adb实现1、设置prop属性命令开启adb(1)相关prop属性设置(2)在设置界面或者 ifconfi…...
vue3中 组合式~测试深入组件:事件 与 $emit()
一、语法(props) 第一步:在组件模板表达式中,可以直接用$emit()方法触发自定义事件, <!-- MyComponent --> <button click"$emit(someEvent)">Click Me</button> 第二步父组件可以通过 v-on (缩写为 ) 来监听…...

SQL-labs13-16闯关记录
http://127.0.0.1/sqli-labs/less-13/ 基于POST单引号双注入变形 1,依然是一个登录框,POST型SQL注入 2,挂上burpsuite,然后抓取请求,构造请求判断漏洞类型和闭合条件 admin 发生了报错,根据提示闭合方式是(…...

基于微信小程序的停车场管理系统的设计与实现
第1章 绪论 1.1 课题背景 随着移动互联形式的不断发展,各行各业都在摸索移动互联对本行业的改变,不断的尝试开发出适合于本行业或者本公司的APP。但是这样一来用户的手机上就需要安装各种软件,但是APP作为一个只为某个公司服务的一个软件&a…...

DAIR-V2X-R数据集服务器下载
【官方github链接】https://github.com/ylwhxht/V2X-R 点击并登录 选择并点击下载 浏览器弹窗,右键选择复制下载链接 ------------------------------------服务器下载----------------------------------------- 登录服务器,选在要下载的文件夹复制路…...

table 拖拽移动
表格拖拽 Sortable.js中文网|配置 <!-- 教务处 --><template><div class"but"><el-button click"mergeAndPrintArrays()" type"primary">保存数据</el-button><el-button click"restoration()" t…...
Linux使用笔记:Find Tree 命令
Tree 命令的使用 使用-I 参数,过滤掉不想展未的目录或文件使用-L参数,指定展示的目录层级个数 arsenaltxzq1899:~/Workspace/vue-application$ tree -I node_modules/ -I public/ -L 2 . ├── components.json ├── Dockerfile ├── ecosystem.c…...

数据结构入门篇——什么是数据结构。
一、引入 工具是一种什么东西呢?是一种转化媒介,我们需要熟食,我们要通过用火来将生肉烤熟。在这个过程中。我们要输入一个东西——生肉,通过工具——火的加工,从而得到我们的目的产物——熟肉。 将上面的例子和红字部…...

MySQL-简介与基本命令
数据库 主流数据库 关系型数据库 MySQL:开源免费的关系型数据库,易于使用和学习,支持大型企业级应用。其特点包括高性能、可靠性和可扩展性,支持多种编程语言和操作系统,拥有大量的社区支持和插件SQLite:…...

汽车材料耐候性测试仪器-太阳光模拟器介绍
**太阳光模拟器**是一种用于模拟太阳光谱的设备,广泛应用于汽车材料的耐候性测试。通过模拟太阳光中的紫外线、可见光和红外线,评估材料在长期光照下的性能变化。 主要组成部分 1. **光源系统**: - **氙灯**:最常用的光源&…...

音频3A测试--AEC(回声消除)测试
一、测试前期准备 一台录制电脑:用于作为近段音源和收集远端处理后的数据; 一台测试设备B:用于测试AEC的设备; 一个高保真音响:用于播放设备B的讲话; 一台播放电脑:用于模拟设备A讲话,和模拟设备B讲话; 一台音频处理器(调音台):用于录制和播放数据; 测试使用转接线若…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...