张量操作与线性回归

一、张量的操作:拼接、切分、索引和变换

(1)张量拼接与切分

1.1 torch.cat()

功能:将张量按维度dim进行拼接
• tensors: 张量序列
• dim : 要拼接的维度
torch.cat(tensors, dim=0, out=None)函数用于沿着指定维度dim将多个张量拼接在一起。它接受一个张量列表tensors作为输入,并返回一个拼接后的张量。参数dim指定了拼接的维度,默认为0。

flag = True
if flag:t = torch.ones((2, 3)) #创建一个形状为(2, 3)的全为1的张量tt_0 = torch.cat([t, t], dim=0) # 将张量t沿着dim=0的维度拼接两次,得到张量t_0t_1 = torch.cat([t, t, t], dim=1)# 将张量t沿着dim=1的维度拼接三次,得到张量t_1print("t_0:{} shape:{}\nt_1:{} shape:{}".format(t_0, t_0.shape, t_1, t_1.shape))
t_0:tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]]) shape:torch.Size([4, 3])
t_1:tensor([[1., 1., 1., 1., 1., 1., 1., 1., 1.],[1., 1., 1., 1., 1., 1., 1., 1., 1.]]) shape:torch.Size([2, 9])
  • format()用于将t_0、t_0.shape、t_1和t_1.shape的值插入到字符串中的占位符位置。具体来说,{}是占位符,format()方法将会将对应的值填充到这些占位符的位置。
  • 例如,“t_0:{} shape:{}\nt_1:{} shape:{}”.format(t_0, t_0.shape, t_1, t_1.shape)中的{}将会分别被t_0、t_0.shape、t_1和t_1.shape的值所替代。

1.2 torch.stack()

功能:在新创建的维度dim上进行拼接
• tensors:张量序列
• dim :要拼接的维度

torch.stack(tensors, dim=0, out=None)函数用于沿着指定维度dim将多个张量堆叠在一起。它接受一个张量列表tensors作为输入,并返回一个堆叠后的张量。参数dim指定了堆叠的维度,默认为0。

以下是示例代码:

import torch
# 示例张量
tensor1 = torch.tensor([1, 2, 3])
tensor2 = torch.tensor([4, 5, 6])
tensor3 = torch.tensor([7, 8, 9])
# 使用torch.cat()函数拼接张量
cat_result = torch.cat([tensor1, tensor2, tensor3], dim=0)
print("torch.cat()拼接结果:", cat_result)# 使用torch.stack()函数堆叠张量
stack_result = torch.stack([tensor1, tensor2, tensor3], dim=0)
print("torch.stack()堆叠结果:", stack_result)

输出结果为:

torch.cat()拼接结果: tensor([1, 2, 3, 4, 5, 6, 7, 8, 9])
torch.stack()堆叠结果: tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])

1.3 torch.chunk()

torch.chunk()是PyTorch中的一个函数,用于将张量沿着指定维度进行分块。
函数的参数包括:

  • input:要分块的输入张量。
  • chunks:要分成的块数。
  • dim(可选):指定要分块的维度,默认为0。
    函数返回一个元组,包含分块后的张量块。
    以下是一个示例代码:
import torch
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
chunks = torch.chunk(x, chunks=3, dim=0)
for chunk in chunks:print(chunk)

在上述代码中,我们创建了一个形状为(3, 3)的张量x。然后,我们使用torch.chunk()函数将x沿着dim=0的维度分成3块。
最后,我们使用for循环遍历每个分块,并打印出来。运行代码后,输出如下:

tensor([[1, 2, 3]])
tensor([[4, 5, 6]])
tensor([[7, 8, 9]])

可以看到,x被分成了3个块,每个块是一个形状为(1, 3)的张量。


1.4 torch.split()

torch.split()是PyTorch中的一个函数,用于将张量沿着指定维度进行切分。
函数的参数包括:

  • tensor:要切分的输入张量。
  • split_size_or_sections:切分的大小或切分的份数。当split_size_or_sections为整数时,表示每一份的长度;当split_size_or_sections为列表时,按照列表元素进行切分。
  • dim(可选):指定要切分的维度,默认为0。
    函数返回一个张量列表,包含切分后的张量。
    以下是一个示例代码:
import torch
x = torch.tensor([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10],[11, 12, 13, 14, 15]])
splits = torch.split(x, split_size_or_sections=2, dim=1)
for split in splits:print(split)

在上述代码中,我们创建了一个形状为(3, 5)的张量x。然后,我们使用torch.split()函数将x沿着dim=1的维度切分为大小为2的块。
最后,我们使用for循环遍历每个切分块,并打印出来。运行代码后,输出如下:

tensor([[ 1,  2],[ 6,  7],[11, 12]])
tensor([[ 3,  4],[ 8,  9],[13, 14]])
tensor([[ 5],[10],[15]])

可以看到,x被切分成了3个块,每个块的大小为(3, 2)(3, 2)(3, 1)


(2)张量索引

2.1 torch.index_select()

torch.index_select()是PyTorch中的一个函数,用于按索引从输入张量中选择元素。
函数的参数包括:

  • input:输入张量。
  • dim:指定按哪个维度进行选择。
  • index:选择元素的索引。可以是一个张量或一个整数列表。
  • out(可选):输出张量,用于存储结果。
    函数返回一个新的张量,包含按索引选择的元素。
    以下是一个示例代码:
import torch# 创建一个输入张量
import torch# 创建一个输入张量
x = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])# 创建一个索引张量
indices = torch.tensor([0, 2])# 使用 torch.index_select() 函数按索引从输入张量中选择元素
selected = torch.index_select(x, dim=0, index=indices)# 打印选择的结果
print(selected)

在上述代码中,我们创建了一个形状为(3, 3)的张量x。然后,我们使用torch.index_select()函数从x中按dim=0的维度选择索引为[0, 2]的元素。
最后,我们打印出选择的结果。运行代码后,输出如下:

tensor([[1, 2, 3],[7, 8, 9]])

可以看到,选择的结果是一个形状为(2, 3)的张量,其中包含了x中索引为02的两行。

2.2 torch.masked_select()

功能:按mask中的True进行索引
返回值:一维张量
• input: 要索引的张量
• mask: 与input同形状的布尔类型张量

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6],[7, 8, 9]])
# 创建一个掩码张量
mask = torch.tensor([[1, 0, 1],[0, 1, 0],[1, 0, 1]], dtype=torch.bool)
# 使用 torch.masked_select() 函数根据掩码从输入张量中选择元素
output = torch.masked_select(input, mask)
print(output)

这段代码使用了 torch.masked_select() 函数,它的作用是根据掩码 mask 从输入张量 input 中选择元素。
在代码中,我们首先创建了一个形状为 (3, 3) 的输入张量 input。然后,我们创建了一个与输入张量形状相同的掩码张量 mask,其中的元素为布尔类型,用来指示要选择的元素。
接下来,我们调用 torch.masked_select() 函数,传入输入张量 input 和掩码张量 mask。函数会根据掩码选择对应位置为 True 的元素,并返回一个新的张量。
最后,我们将选择的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([1, 3, 5, 7, 9])

可以看到,输出张量 output 包含了输入张量 input 中掩码为 True 的元素。

(3)张量变换

3.1 torch.reshape()

功能:变换张量形状
注意事项:当张量在内存中是连续时,新张量与input共享数据内存
• input: 要变换的张量
• shape: 新张量的形状

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.reshape() 函数改变张量的形状
output = torch.reshape(input, (3, 2))
print(output)

这段代码使用了 torch.reshape() 函数,它的作用是改变张量的形状。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.reshape() 函数,传入输入张量 input 和目标形状 (3, 2)
函数会将输入张量 input 改变为目标形状 (3, 2),并返回一个新的张量。
最后,我们将改变形状后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 2],[3, 4],[5, 6]])

可以看到,输出张量 output 的形状已经被改变为 (3, 2),其中的元素顺序与输入张量 input 保持一致。

3.2 torch.transpose()

功能:交换张量的两个维度
• input: 要变换的张量
• dim0: 要交换的维度
• dim1: 要交换的维度

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.transpose() 函数交换张量的维度
output = torch.transpose(input, 0, 1)
print(output)

这段代码使用了 torch.transpose() 函数,它的作用是交换张量的维度。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.transpose() 函数,传入输入张量 input 和要交换的维度 dim0=0dim1=1
函数会将输入张量 input 的维度 0 和维度 1 进行交换,并返回一个新的张量。
最后,我们将交换维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 4],[2, 5],[3, 6]])

可以看到,输出张量 output 的维度已经被交换,形状变为 (3, 2),其中的元素顺序与输入张量 input 保持一致。

3.3 torch.t()

功能:2维张量转置,对矩阵而言,等价于 torch.transpose(input, 0, 1)

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.t() 函数转置张量
output = torch.t(input)
print(output)

这段代码使用了 torch.t() 函数,它的作用是对张量进行转置操作。
在代码中,我们首先创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.t() 函数,传入输入张量 input
函数会将输入张量 input 进行转置,并返回一个新的张量。
最后,我们将转置后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 4],[2, 5],[3, 6]])

可以看到,输出张量 output 的维度已经被转置,形状变为 (3, 2),其中的元素顺序与输入张量 input 保持一致

3.4 torch.squeeze()

功能:压缩长度为1的维度(轴)
• dim: 若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除;

import torch
# 创建一个输入张量
input = torch.tensor([[[1, 2, 3],[4, 5, 6]]])
# 使用 torch.squeeze() 函数去除张量的尺寸为 1 的维度
output = torch.squeeze(input)
print(output)

这段代码使用了 torch.squeeze() 函数,它的作用是去除张量中尺寸为 1 的维度。
在代码中,我们首先创建了一个形状为 (1, 2, 3) 的输入张量 input。然后,我们调用 torch.squeeze() 函数,传入输入张量 input
函数会去除输入张量 input 中尺寸为 1 的维度,并返回一个新的张量。
最后,我们将去除尺寸为 1 的维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[1, 2, 3],[4, 5, 6]])

可以看到,输出张量 output 的形状已经被修改,尺寸为 1 的维度被去除,变为 (2, 3)


3.5 torchunsqueeze()

功能:依据dim扩展维度
• dim: 扩展的维度

抱歉,我之前给出的回答有误。在PyTorch中没有 torch.usqueeze() 函数。正确的函数是 torch.unsqueeze(),它的作用是在指定的维度上增加一个大小为1的维度。
以下是使用 torch.unsqueeze() 函数的示例代码:

import torch
# 创建一个输入张量
input = torch.tensor([[1, 2, 3],[4, 5, 6]])
# 使用 torch.unsqueeze() 函数在维度0上增加一个大小为1的维度
output = torch.unsqueeze(input, dim=0)
print(output)

在这个示例中,我们创建了一个形状为 (2, 3) 的输入张量 input。然后,我们调用 torch.unsqueeze() 函数,传入输入张量 input 和要增加维度的维度索引 dim=0
函数会在维度0上增加一个大小为1的维度,并返回一个新的张量。
最后,我们将增加维度后的结果存储在输出张量 output 中,并打印出来。运行代码后,输出如下:

tensor([[[1, 2, 3],[4, 5, 6]]])

可以看到,输出张量 output 的形状已经被修改,维度0上增加了一个大小为1的维度。

二、张量数学运算

一、加减乘除

  1. torch.add(input, other, alpha=1):将输入张量 input 和另一个张量 other 按元素相加,并返回结果张量。可选参数 alpha 控制相加的缩放因子。
    torch.add() 功能:逐元素计算 input+alpha×other
    • input: 第一个张量
    • alpha: 乘项因子
    • other: 第二个张量

torch.add(input, alpha=1, other, out=None) 是一个用于执行张量相加操作的函数。
参数说明:

  • input:输入张量。
  • alpha:一个可选的缩放因子,默认为1。它用于将 other 张量与 input 张量相乘后再相加。
  • other:另一个张量,与 input 张量进行相加操作。
  • out:可选的输出张量,用于存储结果。
    函数功能:
    该函数将输入张量 input 与另一个张量 other 进行按元素相加的操作,并返回结果张量。如果提供了 out 参数,结果将存储在 out 张量中;否则,将创建一个新的张量来存储结果。
    请注意,inputother 的形状必须是可广播的,否则会引发错误。广播机制允许在不同形状的张量之间执行按元素操作。
    示例用法:
import torch
input = torch.tensor([1, 2, 3])
other = torch.tensor([4, 5, 6])
result = torch.add(input, alpha=2, other=other)
print(result)  # 输出: tensor([9, 12, 15])

在这个示例中,input 张量为 [1, 2, 3]other 张量为 [4, 5, 6]alpha 参数为2。函数将 inputother 相乘得到 [2, 4, 6],然后再与 other 相加得到结果 [6, 9, 12]

  1. torch.addcdiv(input, tensor1, tensor2, value=1):将输入张量 input 与张量 tensor1 的按元素除法结果与张量 tensor2 相乘,然后加上一个标量值 value,并返回结果张量。

在这里插入图片描述

  1. torch.addcmul(input, tensor1, tensor2, value=1):将输入张量 input 与张量 tensor1 的按元素乘法结果与张量 tensor2 相加,然后加上一个标量值 value,并返回结果张量。
    在这里插入图片描述

torch.addcmul(input, value=1, tensor1, tensor2, out=None) 是一个执行逐元素乘法和加法操作的函数。
参数说明:

  • input:输入张量。
  • value:一个可选的缩放因子,默认为1。它用于将 tensor1tensor2 相乘后再与 input 相加。
  • tensor1:第一个张量,与 tensor2 相乘。
  • tensor2:第二个张量,与 tensor1 相乘。
  • out:可选的输出张量,用于存储结果。
    函数功能:
    该函数将输入张量 inputtensor1tensor2 进行逐元素相乘,并将结果与 input 相加。如果提供了 out 参数,结果将存储在 out 张量中;否则,将创建一个新的张量来存储结果。
    请注意,inputtensor1tensor2 的形状必须是可广播的,否则会引发错误。广播机制允许在不同形状的张量之间执行按元素操作。
    示例用法:
import torch
input = torch.tensor([1, 2, 3])
tensor1 = torch.tensor([4, 5, 6])
tensor2 = torch.tensor([2, 3, 4])
result = torch.addcmul(input, value=0.5, tensor1=tensor1, tensor2=tensor2)
print(result)  # 输出: tensor([5., 7.5, 10.])

在这个示例中,input 张量为 [1, 2, 3]tensor1 张量为 [4, 5, 6]tensor2 张量为 [2, 3, 4]value 参数为0.5。函数将 tensor1tensor2 逐元素相乘得到 [8, 15, 24],然后再与 input 相加得到结果 [9, 17, 27]

  1. torch.sub(input, other):将输入张量 input 和另一个张量 other 按元素相减,并返回结果张量。
  2. torch.div(input, other):将输入张量 input 和另一个张量 other 按元素相除,并返回结果张量。
  3. torch.mul(input, other):将输入张量 input 和另一个张量 other 按元素相乘,并返回结果张量。

二、对数,指数,幂函数

  1. torch.log(input, out=None):计算输入张量 input 的自然对数,并返回结果张量。
  2. torch.log10(input, out=None):计算输入张量 input 的以10为底的对数,并返回结果张量。
  3. torch.log2(input, out=None):计算输入张量 input 的以2为底的对数,并返回结果张量。
  4. torch.exp(input, out=None):计算输入张量 input 的指数函数,即 e^x,其中 e 是自然对数的底数,并返回结果张量。
  5. torch.pow(input, exponent, out=None):计算输入张量 input 的每个元素的指数幂,指数由参数 exponent 指定,并返回结果张量。

三、三角函数

  1. torch.abs(input, out=None):计算输入张量 input 的绝对值,并返回结果张量。
  2. torch.acos(input, out=None):计算输入张量 input 的反余弦值(弧度制),并返回结果张量。
  3. torch.cosh(input, out=None):计算输入张量 input 的双曲余弦值,并返回结果张量。
  4. torch.cos(input, out=None):计算输入张量 input 的余弦值(弧度制),并返回结果张量。
  5. torch.asin(input, out=None):计算输入张量 input 的反正弦值(弧度制),并返回结果张量。
  6. torch.atan(input, out=None):计算输入张量 input 的反正切值(弧度制),并返回结果张量。
  7. torch.atan2(input, other, out=None):计算输入张量 input 与另一个张量 other 的反正切值(弧度制),并返回结果张量。

三、线性回归

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import torch
import matplotlib.pyplot as plt# 设置随机种子
torch.manual_seed(10)# 学习率
lr = 0.05# 创建训练数据
x = torch.rand(20, 1) * 10  # x data (tensor), shape=(20, 1)
y = 2*x + (5 + torch.randn(20, 1))  # y data (tensor), shape=(20, 1)# 构建线性回归参数
w = torch.randn((1), requires_grad=True)  # 权重 w,随机初始化
b = torch.zeros((1), requires_grad=True)  # 偏置 b,初始化为零# 迭代训练
for iteration in range(1000):# 前向传播wx = torch.mul(w, x)  # wx = w * xy_pred = torch.add(wx, b)  # y_pred = wx + b# 计算 MSE lossloss = (0.5 * (y - y_pred) ** 2).mean()# 反向传播loss.backward()# 更新参数b.data.sub_(lr * b.grad)  # 更新偏置 bw.data.sub_(lr * w.grad)  # 更新权重 w# 清零梯度w.grad.zero_()b.grad.zero_()# 绘图if iteration % 20 == 0:plt.cla()  # 清除当前图形plt.scatter(x.data.numpy(), y.data.numpy())  # 绘制训练数据的散点图plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)  # 绘制当前的拟合线plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})  # 显示当前的损失值plt.xlim(1.5, 10)plt.ylim(8, 28)plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))  # 显示当前的迭代次数和参数值plt.pause(0.5)if loss.data.numpy() < 1:breakplt.show()  # 显示图形

这段代码是一个简单的线性回归模型的训练过程,并且使用 matplotlib 库将训练过程可视化。

  • 代码首先导入了 torch 和 matplotlib.pyplot 库,并设置了随机种子。
  • 接下来,代码创建了训练数据,其中 x 是一个形状为 (20, 1) 的随机张量,y 是根据公式 2*x + (5 + 随机噪声) 生成的张量。
  • 然后,代码定义了线性回归模型的参数 w 和 b,它们都是需要梯度计算的张量。

在每次迭代中,代码进行了以下操作:

  1. 前向传播:根据当前的 w 和 b 计算预测值 y_pred。
  2. 计算均方误差(MSE)损失函数。
  3. 反向传播:根据损失函数计算梯度。
  4. 更新参数:使用学习率 lr 和梯度更新参数 w 和 b。
  5. 清零梯度:使用 w.grad.zero_() 和 b.grad.zero_() 清零参数的梯度。

每隔 20 次迭代,代码会绘制训练数据的散点图,并在图中绘制当前的拟合线。同时,代码还会显示当前的损失值和参数 w、b 的数值。如果损失值小于 1,代码会提前结束训练。最后,通过 plt.show() 显示图形。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES6之生成器(Generator)

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…

复兴计划01-lc06

StringBuilder和StringBuffer的区别 1. StringBuffer和StringBuilder都是用于字符串动态拼接,但是StringBuffer拼接的函数方法的实现中用了synchornized上锁&#xff0c;效率较低&#xff0c;不过可以用于多线程以此来维护线程安全&#xff1b;相比之下&#xff0c;StringBuil…

理解SQL中not in 与null值的真实含义

A not in B的原理是拿A表值与B表值做是否不等的比较, 也就是a ! b. 在sql中, null是缺失未知值而不是空值。 当你判断任意值a ! null时, 官方说, “You cannot use arithmetic comparison operators such as , <, or <> to test for NULL”, 任何与null值的对比都将返…

Postman使用

Postman使用 Pre-request Script 参考&#xff1a; Scripting in Postman 可以请求、集合或文件夹中添加Pre-request Script&#xff0c;在请求运行之前执行JavaScript 如设置变量值、参数、Header和正文数据&#xff0c;也可以使用Pre-request Script来调试代码&#xff0…

jupyter notebook打开其他盘的文件

jupyter notebook打开其他盘文件 打开jupyter notebook打开terminal输入&#xff1a;jupyter-notebook 路径打开你想打开的工程的文件 打开jupyter notebook 打开terminal 输入&#xff1a;jupyter-notebook 路径 打开你想打开的工程的文件

TDD-LTE 寻呼流程

目录 1. 寻呼成功流程 1.1 空闲态寻呼 1.2 连接态寻呼 2. 寻呼失败流程 2.1 Paging消息不可达 2.2 RRC建立失败 2.3 eNodeB未上发Initial UE message或达到超时 1. 寻呼成功流程 1.1 空闲态寻呼 寻呼成功&#xff1a;MME发起寻呼&#xff08;S1 接口发送Paing 消息&…

【docker实战】安装tomcat并连接mysql数据库

本节用docker来安装tomcat&#xff0c;并用这个tomcat连接我们上一节安装好的mysql数据库 一、拉取镜像 我们安装8.5.69版本 先搜索一下 [rootlocalhost ~]# docker search tomcat NAME DESCRIPTION …

SpringBoot快速集成多数据源(自动版)

有些人因为看见所以相信&#xff0c;有些人因为相信所以看见 有目录&#xff0c;不迷路 前期准备实现演示参考 最近研究了一下多数据源&#xff0c;这篇博客讲的是简单模式&#xff0c;下篇博客预计写自动切换模式 前期准备 本篇博客基于SpringBoot整合MyBatis-plus&#xff0…

【办公软件】Excel双坐标轴图表

在工作中整理测试数据&#xff0c;往往需要一个图表展示两个差异较大的指标。比如共有三个数据&#xff0c;其中两个是要进行对比的温度值&#xff0c;另一个指标是两个温度的差值&#xff0c;这个差值可能很小。 举个实际的例子&#xff1a;数据如下所示&#xff0c;NTC检测温…

Qt高质量的开源项目合集

文章目录 1.Qt官网下载/文档2.第三方开源 1.Qt官网下载/文档 Qt Downloads Qt 清华大学开源软件镜像站 Qt 官方博客 2.第三方开源 记录了平常项目开发中用到的第三方库&#xff0c;以及一些值得参考的项目&#xff01; Qt AV 基于Qt和FFmpeg的跨平台高性能音视频播放框…

SQL性能优化-索引

1.性能下降sql慢执行时间长等待时间长常见原因 1&#xff09;索引失效 索引分为单索、复合索引。 四种创建索引方式 create index index_name on user (name); create index index_name_2 on user(id,name,email); 2&#xff09;查询语句较烂 3&#xff09;关联查询太多join&a…

计算机组成原理 数据的表示与运算

文章目录 数据的表示与运算数据表示定点数的表示与运算定点数的表示无符号数有符号数定点整数定点小数四码反码补码移码 总结 定点数的运算算术移位原码反码补码总结 逻辑位移循环位移总结 加减运算原码加减法补码加减法 溢出判断采用一位符号位 浮点数的表示与运算表示IEEE 75…

使用拉普拉斯算子的图像锐化的python代码实现——数字图像处理

原理 拉普拉斯算子是一个二阶导数算子&#xff0c;用于图像处理中的边缘检测。它通过计算图像亮度的二阶空间导数来工作&#xff0c;能够突出显示图像中的快速变化区域&#xff0c;如边缘。 图像锐化的原理&#xff1a; 图像锐化是指增强图像中的边缘和细节&#xff0c;使图像…

Linux:apache优化(7)—— 日志分割|日志合并

作用&#xff1a;随着网站访问量的增加&#xff0c;访问日志中的信息会越来越多&#xff0c; Apache 默认访问日志access_log单个文件会越来越大&#xff0c;日志文件体积越大&#xff0c;信息都在一个文件中&#xff0c;查看及分析信息会及不方便。 分割 实现方式&#xff1a…

Linux操作系统极速入门[常用指令]

linux概述&#xff1a; Linux是一套免费使用和自由传播的操作系统 我们为什么要学&#xff0c;Linux&#xff1f; 主流操作系统&#xff1a; linux系统版本&#xff1a; 内核版&#xff1a; 由linux核心团队开发&#xff0c;维护 免费&#xff0c;开源 负责控制硬件 发行版&…

如何在MAC OS中的XCODE下添加 <bits/stdc++.h>

mac上使用的编译器是Clang&#xff0c;但是没有万能头文件bits/stdc.h\&#xff0c;本文介绍如何添加万能头文件 Xcode 版本&#xff1a;15.1 - 打开应用程序-Xcode-右键显示包内容 Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/includ…

【Spark精讲】SparkSQL的RBO与CBO

Spark SQL核心:Catalyst Spark SQL的核心是Catalyst查询编译器&#xff0c;它将用户程序中的SQL/Dataset/DataFrame经过一系列操作&#xff0c;最终转化为Spark系统中执行的RDD。 Catalyst组成部分 Parser &#xff1a;用Antlr将SQL/Dataset/DataFrame转化成一棵未经解析的树…

gzip引入后node_modules中.cache compression-webpack-plugin占用内存过多

1.Gzip Gzip&#xff08;GNU zip&#xff09;是一种常见的文件压缩格式和压缩算法&#xff0c;通常用于在 Web 服务器上对静态资源文件进行压缩&#xff0c;以减小文件大小并加快文件传输速度。在前端开发中&#xff0c;经常会使用 Gzip 压缩来优化网站的性能。 Gzip 压缩通过…

QT的信号与槽

QT的信号与槽 文章目录 QT的信号与槽前言一、QT 打印"hello QT"的dome二、信号和槽机制&#xff1f;二、信号与槽的用法1、QT5的方式1. 无参的信号与槽的dome2.带参的信号与槽dome 2、QT4的方式3、C11的语法 Lambda表达式1、函数对象参数2、操作符重载函数参数3、可修…

【数据结构】图论与并查集

一、并查集 1.原理 简单的讲并查集&#xff0c;就是查询两个个元素&#xff0c;是否在一个集合当中&#xff0c;这里的集合用树的形式进行表示。并查集的本质就是森林, 即多棵树。 我们再来简单的举个例子: 假设此时的你是大一新生&#xff0c;刚进入大学&#xff0c;肯定是…