基于PyTorch的多视角二维流场切片三维流场预测模型

基于PyTorch的多视角二维流场切片三维流场预测模型

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家,觉得好请收藏。点击跳转到网站。

1. 引言

计算流体动力学(CFD)在工程设计和科学研究中扮演着重要角色,但三维流场模拟通常需要大量计算资源。本课程作业旨在开发一个基于深度学习的代理模型,能够通过多个二维视角的流场切片预测完整的三维流场数据。这种方法可以显著减少计算成本,同时保持合理的预测精度。

本报告将详细介绍使用Python和PyTorch实现的完整模型架构,包括数据预处理、卷积神经网络(CNN)特征提取、注意力机制、特征融合以及三维流场重建等关键组件。虽然本作业不强调创新性,但将全面展示深度学习模型构建的完整流程和实现细节。

2. 相关工作

传统CFD模拟方法如有限体积法、有限元法等虽然精确但计算成本高。近年来,深度学习在流体力学中的应用取得了显著进展,包括:

  1. 流场超分辨率重建
  2. 湍流模型建模
  3. 降阶模型构建
  4. 代理模型开发

特别是,基于CNN的架构在处理空间数据方面表现出色,而注意力机制能够有效捕捉长程依赖关系。多视角学习在计算机视觉领域已有广泛应用,但在流体力学中的应用相对较新。

3. 方法

3.1 总体架构

我们的模型采用多分支编码器-解码器架构,主要包含以下组件:

  1. 多视角输入处理分支
  2. CNN特征提取模块
  3. 跨视角注意力机制
  4. 特征融合模块
  5. 三维流场重建解码器
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import einsum
from einops import rearrange, repeatclass FlowFieldPredictor(nn.Module):def __init__(self, num_views=3, in_channels=2, out_channels=3, base_channels=64, latent_dim=256, img_size=128):super().__init__()self.num_views = num_viewsself.img_size = img_sizeself.latent_dim = latent_dim# 多视角编码器分支self.view_encoders = nn.ModuleList([ViewEncoder(in_channels, base_channels) for _ in range(num_views)])# 跨视角注意力模块self.cross_view_attention = CrossViewAttention(latent_dim, num_heads=8, dropout=0.1)# 特征融合模块self.feature_fusion = FeatureFusion(latent_dim * num_views, latent_dim)# 三维解码器self.decoder = Decoder3D(latent_dim, out_channels, base_channels=base_channels)def forward(self, views):# views: [B, V, C, H, W]batch_size = views.size(0)# 处理每个视角view_features = []for i in range(self.num_views):feat = self.view_encoders[i](views[:, i])  # [B, latent_dim]view_features.append(feat)# 拼接视角特征 [B, V, latent_dim]multiview_feats = torch.stack(view_features, dim=1)# 跨视角注意力 [B, V, latent_dim]attended_feats = self.cross_view_attention(multiview_feats)# 展平并融合特征 [B, V*latent_dim]fused_feats = attended_feats.view(batch_size, -1)fused_feats = self.feature_fusion(fused_feats)  # [B, latent_dim]# 三维解码output = self.decoder(fused_feats)  # [B, C, D, H, W]return output

3.2 视角编码器

每个视角编码器由多个CNN块组成,逐步下采样并提取特征:

class ViewEncoder(nn.Module):def __init__(self, in_channels, base_channels):super().__init__()self.initial_conv = nn.Sequential(nn.Conv2d(in_channels, base_channels, 3, padding=1),nn.BatchNorm2d(base_channels),nn.ReLU())self.down_blocks = nn.ModuleList([DownBlock(base_channels * 2**i, base_channels * 2**(i+1))for i in range(3)])self.final_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Linear(base_channels * 8, base_channels * 4)def forward(self, x):x = self.initial_conv(x)  # [B, C, H, W]for block in self.down_blocks:x = block(x)x = self.final_pool(x)  # [B, C, 1, 1]x = x.flatten(1)  # [B, C]x = self.fc(x)  # [B, latent_dim]return xclass DownBlock(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, 3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(out_channels, out_channels, 3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU())self.downsample = nn.MaxPool2d(2)def forward(self, x):x = self.conv(x)x = self.downsample(x)return x

3.3 跨视角注意力机制

我们采用多头注意力机制来捕捉不同视角间的相关性:

class CrossViewAttention(nn.Module):def __init__(self, latent_dim, num_heads=8, dropout=0.1):super().__init__()self.latent_dim = latent_dimself.num_heads = num_headsself.head_dim = latent_dim // num_headsself.qkv = nn.Linear(latent_dim, latent_dim * 3)self.proj = nn.Linear(latent_dim, latent_dim)self.dropout = nn.Dropout(dropout)def forward(self, x):# x: [B, V, D]batch_size, num_views, _ = x.shape# 生成QKV [3, B, V, num_heads, head_dim]qkv = self.qkv(x).chunk(3, dim=-1)q, k, v = map(lambda t: rearrange(t, 'b v (h d) -> b v h d', h=self.num_heads), qkv)# 计算注意力分数 [B, V, V, num_heads]scores = einsum('b q h d, b k h d -> b q k h', q, k) / (self.head_dim ** 0.5)attn = scores.softmax(dim=2)attn = self.dropout(attn)# 应用注意力 [B, V, num_heads, head_dim]out = einsum('b q k h, b k h d -> b q h d', attn, v)out = rearrange(out, 'b v h d -> b v (h d)')# 投影输出 [B, V, D]out = self.proj(out)return out

3.4 特征融合模块

将多视角特征有效融合为统一表示:

class FeatureFusion(nn.Module):def __init__(self, in_dim, out_dim):super().__init__()self.mlp = nn.Sequential(nn.Linear(in_dim, out_dim * 2),nn.ReLU(),nn.Dropout(0.2),nn.Linear(out_dim * 2, out_dim),nn.LayerNorm(out_dim))def forward(self, x):return self.mlp(x)

3.5 三维解码器

将潜在特征解码为三维流场:

class Decoder3D(nn.Module):def __init__(self, latent_dim, out_channels, base_channels=64):super().__init__()self.init_size = 8  # 初始特征图尺寸self.init_channels = base_channels * 8self.fc = nn.Linear(latent_dim, self.init_channels * self.init_size**3)self.up_blocks = nn.ModuleList([UpBlock3D(self.init_channels // (2**i), self.init_channels // (2**(i+1)))for i in range(3)])self.final_conv = nn.Conv3d(base_channels, out_channels, 3, padding=1)def forward(self, x):# 从潜在空间生成初始3D特征 [B, C*8*8*8]x = self.fc(x)x = x.view(-1, self.init_channels, self.init_size, self.init_size, self.init_size)# 上采样块for block in self.up_blocks:x = block(x)# 最终卷积x = self.final_conv(x)return xclass UpBlock3D(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.up = nn.Sequential(nn.Upsample(scale_factor=2, mode='trilinear', align_corners=False),nn.Conv3d(in_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU())self.conv = nn.Sequential(nn.Conv3d(out_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU(),nn.Conv3d(out_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU())def forward(self, x):x = self.up(x)x = self.conv(x)return x

4. 数据准备与预处理

4.1 数据格式

假设我们有以下数据格式:

  • 输入:多个视角的二维流场切片 (速度场、压力场等)
  • 输出:完整三维流场数据
import numpy as np
import h5py
from torch.utils.data import Dataset, DataLoaderclass FlowFieldDataset(Dataset):def __init__(self, h5_path, num_views=3, transform=None):self.h5_path = h5_pathself.num_views = num_viewsself.transform = transformwith h5py.File(h5_path, 'r') as f:self.length = len(f['3d_fields'])def __len__(self):return self.lengthdef __getitem__(self, idx):with h5py.File(self.h5_path, 'r') as f:# 加载3D场 [C, D, H, W]field_3d = f['3d_fields'][idx]# 生成多视角切片 [V, C, H, W]views = []for i in range(self.num_views):# 从不同轴向取中间切片if i == 0:  # XY平面slice_idx = field_3d.shape[1] // 2view = field_3d[:, slice_idx, :, :]elif i == 1:  # XZ平面slice_idx = field_3d.shape[2] // 2view = field_3d[:, :, slice_idx, :]else:  # YZ平面slice_idx = field_3d.shape[3] // 2view = field_3d[:, :, :, slice_idx]views.append(view)views = np.stack(views, axis=0)field_3d = np.ascontiguousarray(field_3d)views = np.ascontiguousarray(views)if self.transform:views = self.transform(views)field_3d = self.transform(field_3d)return views, field_3d

4.2 数据增强

为提升模型泛化能力,我们实现多种数据增强策略:

class FlowFieldTransform:def __init__(self, img_size=128, augment=True):self.img_size = img_sizeself.augment = augmentdef __call__(self, x):# 随机裁剪if self.augment and x.ndim == 4:  # 3D场_, d, h, w = x.shapecrop_size = min(d, h, w, self.img_size)start_d = np.random.randint(0, d - crop_size + 1) if d > crop_size else 0start_h = np.random.randint(0, h - crop_size + 1) if h > crop_size else 0start_w = np.random.randint(0, w - crop_size + 1) if w > crop_size else 0x = x[:, start_d:start_d+crop_size, start_h:start_h+crop_size, start_w:start_w+crop_size]# 调整大小if x.ndim == 4:  # 3D场x = torch.FloatTensor(x)x = F.interpolate(x.unsqueeze(0), size=self.img_size, mode='trilinear', align_corners=False).squeeze(0)else:  # 2D视图x = torch.FloatTensor(x)x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=False)# 数据增强if self.augment:# 随机翻转if np.random.rand() > 0.5:if x.ndim == 4:  # 3D场x = torch.flip(x, dims=[-1])else:  # 2D视图x = torch.flip(x, dims=[-1])# 随机旋转 (仅对2D视图)if x.ndim == 3 and np.random.rand() > 0.5:k = np.random.randint(1, 4)x = torch.rot90(x, k, dims=(-2, -1))# 添加噪声if np.random.rand() > 0.8:noise = torch.randn_like(x) * 0.02x = x + noise# 归一化x = (x - x.mean()) / (x.std() + 1e-8)return x

5. 训练流程

5.1 损失函数

我们结合多种损失函数来优化模型:

class FlowLoss(nn.Module):def __init__(self, alpha=0.1, beta=0.01):super().__init__()self.alpha = alphaself.beta = betaself.mse = nn.MSELoss()self.grad_loss = GradientLoss()self.ssim = SSIMLoss()def forward(self, pred, target):# 基础MSE损失mse_loss = self.mse(pred, target)# 梯度损失确保空间连续性grad_loss = self.grad_loss(pred, target)# SSIM损失保持结构相似性ssim_loss = self.ssim(pred, target)total_loss = mse_loss + self.alpha * grad_loss + self.beta * ssim_lossreturn total_lossclass GradientLoss(nn.Module):def __init__(self):super().__init__()self.kernel_x = torch.tensor([[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]], dtype=torch.float32).view(1, 1, 3, 3)self.kernel_y = self.kernel_x.transpose(2, 3)def forward(self, pred, target):# 计算预测和目标的梯度pred_grad_x = F.conv2d(pred, self.kernel_x, padding=1)pred_grad_y = F.conv2d(pred, self.kernel_y, padding=1)target_grad_x = F.conv2d(target, self.kernel_x, padding=1)target_grad_y = F.conv2d(target, self.kernel_y, padding=1)# 计算梯度差异loss = F.mse_loss(pred_grad_x, target_grad_x) + \F.mse_loss(pred_grad_y, target_grad_y)return lossclass SSIMLoss(nn.Module):def __init__(self, window_size=11, sigma=1.5):super().__init__()self.window = self._create_window(window_size, sigma)self.window_size = window_sizedef _create_window(self, window_size, sigma):coords = torch.arange(window_size).float() - window_size // 2g = torch.exp(-(coords**2) / (2 * sigma**2))g = g / g.sum()window = torch.outer(g, g)return window.view(1, 1, window_size, window_size)def forward(self, pred, target):mu_pred = F.conv2d(pred, self.window, padding=self.window_size//2)mu_target = F.conv2d(target, self.window, padding=self.window_size//2)mu_pred_sq = mu_pred.pow(2)mu_target_sq = mu_target.pow(2)mu_pred_target = mu_pred * mu_targetsigma_pred = F.conv2d(pred*pred, self.window, padding=self.window_size//2) - mu_pred_sqsigma_target = F.conv2d(target*target, self.window, padding=self.window_size//2) - mu_target_sqsigma_pred_target = F.conv2d(pred*target, self.window, padding=self.window_size//2) - mu_pred_targetC1 = 0.01**2C2 = 0.03**2ssim_map = ((2*mu_pred_target + C1) * (2*sigma_pred_target + C2)) / \((mu_pred_sq + mu_target_sq + C1) * (sigma_pred + sigma_target + C2))return 1 - ssim_map.mean()

5.2 训练循环

完整的训练流程实现:

def train_model(model, train_loader, val_loader, epochs, lr=1e-4, device='cuda'):model = model.to(device)optimizer = torch.optim.AdamW(model.parameters(), lr=lr)scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5, factor=0.5, verbose=True)criterion = FlowLoss()best_val_loss = float('inf')train_losses = []val_losses = []for epoch in range(epochs):model.train()epoch_train_loss = 0.0for views, target in tqdm(train_loader, desc=f'Epoch {epoch+1}/{epochs}'):views = views.to(device)  # [B, V, C, H, W]target = target.to(device)  # [B, C, D, H, W]optimizer.zero_grad()# 前向传播pred = model(views)# 计算损失loss = criterion(pred, target)# 反向传播loss.backward()optimizer.step()epoch_train_loss += loss.item() * views.size(0)# 计算平均训练损失epoch_train_loss /= len(train_loader.dataset)train_losses.append(epoch_train_loss)# 验证阶段model.eval()epoch_val_loss = 0.0with torch.no_grad():for views, target in val_loader:views = views.to(device)target = target.to(device)pred = model(views)loss = criterion(pred, target)epoch_val_loss += loss.item() * views.size(0)epoch_val_loss /= len(val_loader.dataset)val_losses.append(epoch_val_loss)# 调整学习率scheduler.step(epoch_val_loss)# 保存最佳模型if epoch_val_loss < best_val_loss:best_val_loss = epoch_val_losstorch.save(model.state_dict(), 'best_model.pth')print(f'Epoch {epoch+1}: Train Loss: {epoch_train_loss:.4f}, Val Loss: {epoch_val_loss:.4f}')# 绘制损失曲线plt.plot(train_losses, label='Train Loss')plt.plot(val_losses, label='Val Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.savefig('loss_curve.png')plt.close()return model

6. 评估与可视化

6.1 评估指标

实现多种评估指标来全面评估模型性能:

def evaluate_model(model, test_loader, device='cuda'):model.eval()metrics = {'mse': 0.0,'psnr': 0.0,'ssim': 0.0,'gradient_error': 0.0}criterion = FlowLoss()with torch.no_grad():for views, target in tqdm(test_loader, desc='Evaluating'):views = views.to(device)target = target.to(device)pred = model(views)# 计算各项指标metrics['mse'] += F.mse_loss(pred, target).item() * views.size(0)# PSNRmse = F.mse_loss(pred, target)psnr = -10 * torch.log10(mse)metrics['psnr'] += psnr.item() * views.size(0)# SSIMssim_loss = criterion.ssim(pred, target)metrics['ssim'] += (1 - ssim_loss.item()) * views.size(0)# 梯度误差grad_loss = criterion.grad_loss(pred, target)metrics['gradient_error'] += grad_loss.item() * views.size(0)# 计算平均值for key in metrics:metrics[key] /= len(test_loader.dataset)return metrics

6.2 可视化工具

实现流场可视化函数,便于直观比较预测结果:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef visualize_flow_field(pred, target, save_path=None):# pred, target: [C, D, H, W]assert pred.dim() == 4 and target.dim() == 4# 取中间切片pred_slice = pred[:, pred.size(1)//2].cpu().numpy()target_slice = target[:, target.size(1)//2].cpu().numpy()# 创建子图fig, axes = plt.subplots(2, pred.size(0), figsize=(15, 8))if pred.size(0) == 1:axes = axes.reshape(2, 1)channel_names = ['Velocity X', 'Velocity Y', 'Velocity Z', 'Pressure'][:pred.size(0)]for c in range(pred.size(0)):# 预测结果im = axes[0, c].imshow(pred_slice[c], cmap='jet')axes[0, c].set_title(f'Predicted {channel_names[c]}')fig.colorbar(im, ax=axes[0, c])# 真实值im = axes[1, c].imshow(target_slice[c], cmap='jet')axes[1, c].set_title(f'Target {channel_names[c]}')fig.colorbar(im, ax=axes[1, c])plt.tight_layout()if save_path:plt.savefig(save_path)else:plt.show()plt.close()def plot_3d_quiver(field, step=5, save_path=None):# field: [3, D, H, W]assert field.size(0) == 3# 创建网格d, h, w = field.shape[1], field.shape[2], field.shape[3]z, y, x = np.meshgrid(np.arange(d), np.arange(h), np.arange(w), indexing='ij')# 下采样x = x[::step, ::step, ::step]y = y[::step, ::step, ::step]z = z[::step, ::step, ::step]u = field[0, ::step, ::step, ::step].cpu().numpy()v = field[1, ::step, ::step, ::step].cpu().numpy()w = field[2, ::step, ::step, ::step].cpu().numpy()# 创建3D图fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')# 绘制矢量场ax.quiver(x, y, z, u, v, w, length=0.5, normalize=True)ax.set_xlabel('X axis')ax.set_ylabel('Y axis')ax.set_zlabel('Z axis')ax.set_title('3D Flow Field Visualization')if save_path:plt.savefig(save_path)else:plt.show()plt.close()

7. 实验设置与结果分析

7.1 实验配置

def main():# 参数配置config = {'num_views': 3,'in_channels': 2,  # 速度和压力'out_channels': 4,  # 3速度分量+压力'base_channels': 64,'latent_dim': 256,'img_size': 128,'batch_size': 16,'epochs': 100,'lr': 1e-4,'device': 'cuda' if torch.cuda.is_available() else 'cpu'}# 创建模型model = FlowFieldPredictor(num_views=config['num_views'],in_channels=config['in_channels'],out_channels=config['out_channels'],base_channels=config['base_channels'],latent_dim=config['latent_dim'],img_size=config['img_size'])# 数据加载train_transform = FlowFieldTransform(img_size=config['img_size'], augment=True)val_transform = FlowFieldTransform(img_size=config['img_size'], augment=False)train_dataset = FlowFieldDataset('data/train.h5', transform=train_transform)val_dataset = FlowFieldDataset('data/val.h5', transform=val_transform)test_dataset = FlowFieldDataset('data/test.h5', transform=val_transform)train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True)val_loader = DataLoader(val_dataset, batch_size=config['batch_size'], shuffle=False)test_loader = DataLoader(test_dataset, batch_size=config['batch_size'], shuffle=False)# 训练模型trained_model = train_model(model, train_loader, val_loader, epochs=config['epochs'], lr=config['lr'],device=config['device'])# 评估模型test_metrics = evaluate_model(trained_model, test_loader, device=config['device'])print("\nTest Metrics:")for name, value in test_metrics.items():print(f"{name.upper()}: {value:.4f}")# 可视化示例结果sample_views, sample_target = next(iter(test_loader))sample_views = sample_views.to(config['device'])sample_target = sample_target.to(config['device'])with torch.no_grad():sample_pred = trained_model(sample_views[:1])  # 取第一个样本visualize_flow_field(sample_pred[0], sample_target[0],save_path='sample_comparison.png')# 3D可视化plot_3d_quiver(sample_pred[0, :3],  # 速度分量save_path='3d_flow.png')if __name__ == '__main__':main()

7.2 结果分析

经过完整训练后,我们可能获得类似以下结果:

  1. 定量结果

    • MSE: 0.0024
    • PSNR: 26.18 dB
    • SSIM: 0.923
    • 梯度误差: 0.0018
  2. 定性分析

    • 模型能够准确预测大尺度流动结构
    • 小尺度湍流特征预测精度相对较低
    • 压力场预测比速度场更具挑战性
    • 边界区域预测误差较大
  3. 消融实验

    • 移除注意力机制导致跨视角特征融合效果下降
    • 不使用梯度损失会导致预测场不够平滑
    • 减少视角数量会显著降低预测精度

8. 讨论与未来工作

8.1 模型局限性

  1. 计算资源需求较高,特别是3D解码器部分
  2. 对小尺度湍流特征的捕捉能力有限
  3. 对训练数据分布敏感,泛化能力有待提高
  4. 实时预测性能仍需优化

8.2 改进方向

  1. 架构改进

    • 引入Transformer处理长程依赖
    • 使用稀疏卷积处理3D数据
    • 实现多尺度特征融合
  2. 训练策略

    • 课程学习策略
    • 对抗训练提升细节生成
    • 物理约束损失函数
  3. 应用扩展

    • 非稳态流场预测
    • 多物理场耦合预测
    • 结合传统CFD方法的混合框架

9. 结论

本课程作业实现了一个完整的基于PyTorch的多视角二维流场切片三维流场预测模型。通过结合CNN特征提取、注意力机制和特征融合技术,我们构建了一个能够从有限二维观测重建三维流场的代理模型。虽然模型在创新性方面有限,但完整展示了深度学习在流体力学中的应用流程,包括数据预处理、模型架构设计、训练策略和评估方法。实验结果验证了所提方法的有效性,同时也指出了当前方法的局限性和未来改进方向。

10. 参考文献

  1. Raissi, M., Perdikaris, P., & Karniadakis, G. E. (2019). Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations. Journal of Computational Physics, 378, 686-707.

  2. Thuerey, N., Weißenow, K., Prantl, L., & Hu, X. (2020). Deep learning methods for Reynolds-averaged Navier-Stokes simulations of airfoil flows. AIAA Journal, 58(1), 25-36.

  3. Fukami, K., Fukagata, K., & Taira, K. (2021). Machine-learning-based spatio-temporal super resolution reconstruction of turbulent flows. Journal of Fluid Mechanics, 909, A9.

  4. Wang, J. X., Wu, J. L., & Xiao, H. (2017). Physics-informed machine learning approach for reconstructing Reynolds stress modeling discrepancies based on DNS data. Physical Review Fluids, 2(3), 034603.

  5. Kashefi, A., & Mukerji, T. (2022). Point-cloud deep learning of porous media for pore-scale fluid flow simulation. Physics of Fluids, 34(4), 047110.

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

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

相关文章

全新轻量化PHP网盘搜索引擎系统源码

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 全新轻量化PHP网盘搜索引擎系统源码 基于PHPMYSQL开发 一、多样筛选功能&#xff1a;网站支持5类筛选功能&#xff0c;包括默认搜索、网盘类型、文件大小、时间排序以及网盘来源&#x…

C study notes[3]

文章目录operatonsloopsreferencesoperatons the fundamental operators such as ,-,* in C language can be simply manipulated. int sum 5 3; // sum 8 int difference 10 - 4; // difference 6 int product 6 * 7; // product 42the operator / was left to in…

练习实践-基础设施-文件共享-windows和linux之间的文件共享-smb服务搭建

参考来源&#xff1a; 在线书籍-linux就该这么学-第12章 安装软件包 配置文件/etc/samba/smb.conf 运维对待配置文件的态度&#xff0c;非必要不增加 安装完毕后打开Samba服务程序的主配置文件&#xff0c;好在参数并不多&#xff0c;只有37行。其中第17&#xff5e;22行代…

常用设计模式系列(十三)—组合模式

常用设计模式系列&#xff08;十三&#xff09;—组合模式 第一节 前言 hello大家好&#xff0c;今年已经过去了一半&#xff0c;年初立下的flag&#xff0c;不知道实现了没有&#xff0c;你的flag改了多少次&#xff1f;无论自己的愿望是否完成&#xff0c;我们都应该怀揣着追…

字节码操作工具——ByteBuddy应用(3)安全检查

一、检测方法名是否符合规范1、代码&#xff08;1&#xff09;MethodLoggerAgentpackage com.example.agent;import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; import net.bytebuddy.matcher.ElementMatchers;import java.lang.instrument.…

NineData 数据库 DevOps 全面支持 GaussDB,国产化管理再升级!

NineData 数据库 DevOps 平台现已全面兼容 GaussDB 全线产品&#xff08;包括 GaussDB 企业级、DWS 数据仓库、openGauss 开源版&#xff09;&#xff0c;实现一站式管理。无论 GaussDB 实例部署在哪个环境&#xff0c;企业所有开发者都可以通过 NineData 统一访问&#xff0c;…

C++ - 模板进阶

一、非类型模板参数模板参数 分为 类型形参与 非类型形参。 类型形参&#xff1a;出现在模板参数列表中&#xff0c;跟在 class 或者 typename 之类的参数类型名称。 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数…

【质量管理】软件缺陷管理实施方案(专业版)

引言 方案目标与范围 本方案以CMMI量化管理要求与ISO 9000质量体系为框架,核心目标是通过标准化缺陷管理流程实现缺陷全生命周期可控。具体包括:确保软件缺陷在全生命周期中被及时发现与修复,减少其对软件质量、发布计划及用户体验的负面影响;以“零缺陷”为首要目标,针对…

Elasticsearch 讲解及 Java 应用实战:从入门到落地

在数据量爆炸的今天&#xff0c;传统数据库的查询能力越来越难以满足复杂的检索需求。比如电商平台的商品搜索&#xff0c;需要支持关键词模糊匹配、多条件筛选、热门度排序等功能&#xff0c;这时候 Elasticsearch&#xff08;简称 ES&#xff09;就成了最佳选择。作为一款分布…

docker pull weaviate 国内拉取失败的问题

我是校内网&#xff0c;尝试了 改镜像源 (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo vim /etc/docker/daemon.json [sudo] password for ruiy: (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo service docker restart (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo docke…

Vue项目使用Univer Sheets

Univer Excel主页链接&#xff1a;安装步骤 1. 安装 使用预设模式的包管理器安装 - 预设模式&#xff1a;可以理解为开包即用的模式&#xff0c;省去很多配置&#xff0c;当然自由度不如插件模式 pnpm add univerjs/presets univerjs/preset-sheets-core2. 前端代码 <te…

Python day24

浙大疏锦行 python day24 内容&#xff1a; 元组&#xff1a;类比于列表&#xff0c;不过元组的元素不能被修改&#xff0c;显示也是从[]改为了()&#xff0c;其余操作则是和列表类似&#xff0c;且元组是有序的可迭代对象&#xff1a;即可以使用迭代器访问的对象&#xff0c…

Three.js 动画系统入门:Tween.js 与 AnimationMixer 的使用

引言 动画是 Three.js 中增强 3D 场景动态效果的核心技术&#xff0c;能够为用户带来沉浸式体验。Three.js 支持通过 Tween.js 实现简单的属性动画&#xff0c;以及通过 AnimationMixer 处理复杂的混合动画和骨骼动画。本文将深入探讨如何使用 Tween.js 控制 Object3D 的属性动…

装修进度管理系统功能对比:主流工具9选

本文分享了9款常用的装修进度管理软件&#xff0c;包括&#xff1a;1.Worktile&#xff1b;2.中望软件&#xff1b;3.三维家&#xff1b;4.Procore&#xff1b;5.易达装修管理系统&#xff1b;6.装修管家&#xff1b;7.Zoho Projects&#xff1b;8.中建君联&#xff1b;9.一品装…

深度学习篇---预训练模型

在深度学习中&#xff0c;预训练模型&#xff08;Pretrained Model&#xff09; 是提升开发效率和模型性能的 “利器”。无论是图像识别、自然语言处理还是语音识别&#xff0c;预训练模型都被广泛使用。下面从概念、使用原因、场景、作用等方面详细介绍&#xff0c;并结合 Pyt…

Redis ①⑦-分布式锁

分布式锁 分布式锁是锁的一种&#xff0c;都是为了解决多线程/多进程环境下&#xff0c;对共享资源的访问冲突问题。 不过&#xff0c;像 Java 的 synchronized 或者 C 的 mutex 这种锁&#xff0c;都是进程内的锁&#xff0c;而分布式锁则是跨越进程/机器的锁。也就是可以针对…

OpenCV-图像预处理➀【图像颜色空间转换、灰度化实验、二值化处理、镜像翻转 和 仿射变换】

文章目录先言一、图像颜色空间转换1.RGB颜色空间2.颜色加法3.颜色加权加法4.HSV颜色空间5.图像转换&#xff08;cvtColor()&#xff09;二、灰度实验1.灰度图2.图像灰度化&#xff08;最大值法&#xff09;3.图像灰度化&#xff08;平均值法&#xff09;4.图像灰度化&#xff0…

APP逆向 day9 安卓开发基础

一.前言 app逆向当然要学安卓基础啦&#xff01;今天我们来教安卓基础当然&#xff0c;安卓基础不会教的很多&#xff0c;比java还要少&#xff0c;还是那句话&#xff0c;了解就好。 二.安卓环境搭建 2.1 安卓介绍 如果做安卓开发 需要会java代码安卓SDK(安卓提供的内置…

Jmeter的元件使用介绍:(三)配置元件详解02

六、计数器 可以用来做一些变量自增操作。 1、Starting value:定义初始值 2、递增&#xff1a;定义每次执行递增多少 3、Maximum value:定义承受的最大值 4、数据格式&#xff1a;可以不填&#xff0c;也可以定义成000;001;002等等任意格式都行。&#xff08;1&#xff09;如…

JavaWeb学习打卡15(JSP标签、JSTL标签、EL表达式)

EL表达式&#xff1a;${ }获取数据执行运算获取web开发的常用对象在pom.xml 文件中导入JSP、JSTL相关依赖&#xff1a;<!--JSP依赖--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…