数值计算库:Eigen与Boost.Multiprecision全方位解析

在科学计算、工程模拟、机器学习等领域,高效的数值计算能力是构建高性能应用的基石。C++作为性能优先的编程语言,拥有众多优秀的数值计算库,其中Eigen和Boost.Multiprecision是两个极具代表性的工具。本文将深入探讨这两个库的核心特性、使用场景及实战技巧,帮助开发者充分发挥C++在数值计算领域的优势。

一、Eigen:高性能线性代数计算库

1.1 Eigen简介与特性

Eigen是一个专注于线性代数计算的C++模板库,具有以下核心特性:

  • 无依赖:仅需C++标准库,无需额外依赖
  • 高效:利用表达式模板技术实现编译期优化
  • 支持多种矩阵类型:密集矩阵、稀疏矩阵、对角矩阵等
  • 丰富的线性代数运算:矩阵乘法、分解、特征值计算等
  • 支持多种数据类型:标量、复数、自定义类型
  • SIMD优化:自动利用SSE、AVX等指令集加速计算
  • 多线程支持:部分运算支持OpenMP并行

Eigen的设计理念是将计算尽可能地推到编译期,通过模板元编程生成高效的机器码,同时保持直观的API设计。

1.2 Eigen基础:矩阵与向量操作

1.2.1 矩阵与向量的定义

Eigen使用模板类Matrix表示矩阵,其原型为:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

常见的预定义类型:

MatrixXd  // 动态大小的双精度矩阵 (Matrix<double, Dynamic, Dynamic>)
Matrix3f  // 3x3单精度矩阵 (Matrix<float, 3, 3>)
Vector4d  // 4维双精度向量 (Matrix<double, 4, 1>)
RowVector3i // 3维整型行向量 (Matrix<int, 1, 3>)

创建矩阵与向量的示例:

#include <Eigen/Dense>
#include <iostream>int main() {// 动态大小矩阵Eigen::MatrixXd mat(3, 3);mat << 1, 2, 3,4, 5, 6,7, 8, 9;// 固定大小矩阵Eigen::Matrix3f mat3f = Eigen::Matrix3f::Zero();  // 全零矩阵// 向量Eigen::Vector3d vec(1, 2, 3);Eigen::RowVector4i rvec = Eigen::RowVector4i::Ones();  // 全1行向量std::cout << "Matrix mat:\n" << mat << "\n";std::cout << "Vector vec:\n" << vec << "\n";return 0;
}
1.2.2 矩阵访问与修改

矩阵元素可通过()运算符访问,支持行列索引:

// 访问元素
double val = mat(1, 2);  // 第2行第3列元素(索引从0开始)// 修改元素
mat(0, 0) = 10.0;// 整块赋值
mat.block(0, 0, 2, 2) = Eigen::Matrix2d::Identity();  // 左上角2x2子矩阵设为单位矩阵// 列向量赋值
mat.col(2) = Eigen::Vector3d(1, 0, 1);
1.2.3 矩阵运算

Eigen重载了常见的数学运算符,支持自然的矩阵运算语法:

// 矩阵加法
Eigen::MatrixXd a = Eigen::MatrixXd::Random(3, 3);
Eigen::MatrixXd b = Eigen::MatrixXd::Random(3, 3);
Eigen::MatrixXd c = a + b;// 矩阵乘法
Eigen::MatrixXd d = a * b;// 点积与叉积(向量)
Eigen::Vector3d v(1, 2, 3);
Eigen::Vector3d w(4, 5, 6);
double dot_product = v.dot(w);  // 点积
Eigen::Vector3d cross_product = v.cross(w);  // 叉积// 矩阵转置与求逆
Eigen::MatrixXd transposed = a.transpose();
Eigen::MatrixXd inverse = a.inverse();// 矩阵与标量运算
Eigen::MatrixXd scaled = a * 2.0;

1.3 高级特性:表达式模板与编译期优化

Eigen的核心优势在于其**表达式模板(Expression Templates)**技术,这是一种编译期元编程技术,可避免不必要的临时对象,生成高效代码。

1.3.1 表达式模板原理

考虑以下代码:

Eigen::Matrix3d a, b, c, d;
// 初始化a, b, c
d = a + b + c;

传统实现会生成两个临时矩阵(a+b(a+b)+c),而Eigen的表达式模板将整个运算链视为一个整体,直接生成等效于以下代码的机器码:

for(int i = 0; i < 3; ++i)for(int j = 0; j < 3; ++j)d(i,j) = a(i,j) + b(i,j) + c(i,j);

这种技术消除了临时对象的开销,尤其在复杂表达式中效果显著。

1.3.2 编译期维度检查

Eigen在编译期检查矩阵维度是否匹配,避免运行时错误:

Eigen::Matrix2d m2;
Eigen::Matrix3d m3;
m2 = m3;  // 编译错误:维度不匹配

对于动态大小矩阵,维度检查发生在运行时:

Eigen::MatrixXd m_dynamic(2, 2);
m_dynamic = Eigen::MatrixXd::Random(3, 3);  // 运行时断言失败
1.3.3 向量化与SIMD优化

Eigen会自动利用CPU的SIMD指令(如SSE、AVX)加速计算:

// 启用向量化优化
Eigen::Matrix4f v1, v2, v3;
v3 = v1 * v2;  // 自动使用SIMD指令并行计算4个浮点数// 强制使用特定SIMD指令集
#ifdef __AVX2__// AVX2优化路径
#endif

通过EIGEN_DONT_VECTORIZEEIGEN_USE_SSE2等宏可以控制向量化行为。

1.4 线性方程组求解与矩阵分解

Eigen提供多种矩阵分解算法和线性方程组求解器:

1.4.1 线性方程组求解
// 求解 Ax = b
Eigen::Matrix3f A;
Eigen::Vector3f b;
// 初始化A和b// 直接求解(LU分解)
Eigen::Vector3f x = A.lu().solve(b);// 对称正定矩阵(Cholesky分解)
Eigen::Matrix3f A_sym = A * A.transpose();  // 确保对称正定
Eigen::Vector3f x_chol = A_sym.ldlt().solve(b);// 最小二乘解(QR分解)
Eigen::MatrixXf A_rect(5, 3);  // 非方阵
Eigen::VectorXf b_rect(5);
Eigen::VectorXf x_ls = A_rect.colPivHouseholderQr().solve(b_rect);
1.4.2 特征值与特征向量计算
Eigen::Matrix3f A;
// 初始化A// 实对称矩阵特征值分解
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eig(A);
Eigen::Vector3f eigenvalues = eig.eigenvalues();  // 特征值
Eigen::Matrix3f eigenvectors = eig.eigenvectors();  // 特征向量// 普通矩阵特征值分解
Eigen::EigenSolver<Eigen::Matrix3f> eig_gen(A);

1.5 稀疏矩阵与高效存储

对于大规模稀疏矩阵(如有限元分析、图算法),Eigen提供专门的稀疏矩阵模块:

#include <Eigen/Sparse>// 定义稀疏矩阵
typedef Eigen::SparseMatrix<double> SpMat;
typedef Eigen::Triplet<double> T;// 创建1000x1000稀疏矩阵
SpMat mat(1000, 1000);
std::vector<T> triplets;// 添加非零元素
triplets.push_back(T(0, 0, 2.0));
triplets.push_back(T(0, 1, -1.0));
triplets.push_back(T(1, 0, -1.0));
// ... 添加更多元素// 设置稀疏矩阵
mat.setFromTriplets(triplets.begin(), triplets.end());// 稀疏矩阵乘法
Eigen::VectorXd x = Eigen::VectorXd::Random(1000);
Eigen::VectorXd b = mat * x;// 稀疏矩阵求解器
Eigen::SimplicialLDLT<SpMat> solver;
solver.compute(mat);
Eigen::VectorXd x_sol = solver.solve(b);

稀疏矩阵使用压缩存储格式(如CSC、CSR),大幅减少内存占用并提高计算效率。

1.6 Eigen实战案例:机器学习中的矩阵运算

在机器学习中,矩阵运算是核心操作。以下是一个使用Eigen实现简单神经网络的案例:

#include <Eigen/Dense>
#include <iostream>
#include <vector>// 简单神经网络层
class Layer {
public:virtual Eigen::MatrixXd forward(const Eigen::MatrixXd& x) = 0;virtual ~Layer() {}
};// 全连接层
class DenseLayer : public Layer {
private:Eigen::MatrixXd weights;Eigen::VectorXd bias;public:DenseLayer(int input_size, int output_size) {// 随机初始化权重weights = Eigen::MatrixXd::Random(output_size, input_size) * 0.1;bias = Eigen::VectorXd::Zero(output_size);}Eigen::MatrixXd forward(const Eigen::MatrixXd& x) override {return weights * x + bias.replicate(1, x.cols());}
};// ReLU激活层
class ReLULayer : public Layer {
public:Eigen::MatrixXd forward(const Eigen::MatrixXd& x) override {return x.cwiseMax(0.0);}
};// 神经网络
class NeuralNetwork {
private:std::vector<std::shared_ptr<Layer>> layers;public:void addLayer(std::shared_ptr<Layer> layer) {layers.push_back(layer);}Eigen::MatrixXd forward(const Eigen::MatrixXd& x) {Eigen::MatrixXd output = x;for (auto& layer : layers) {output = layer->forward(output);}return output;}
};int main() {// 创建神经网络NeuralNetwork nn;nn.addLayer(std::make_shared<DenseLayer>(2, 3));nn.addLayer(std::make_shared<ReLULayer>());nn.addLayer(std::make_shared<DenseLayer>(3, 1));// 输入数据Eigen::MatrixXd input(2, 5);  // 5个样本,每个2维input << 0, 1, 2, 3, 4,5, 6, 7, 8, 9;// 前向传播Eigen::MatrixXd output = nn.forward(input);std::cout << "Output:\n" << output << "\n";return 0;
}

二、Boost.Multiprecision:高精度数值计算库

2.1 Boost.Multiprecision简介

Boost.Multiprecision是Boost库中的一个组件,提供任意精度数值计算能力,支持以下特性:

  • 多种高精度类型:cpp_int(任意精度整数)、cpp_dec_float(任意精度十进制浮点数)、cpp_bin_float(任意精度二进制浮点数)
  • 与标准库兼容:支持标准算术运算符和数学函数
  • 自定义精度:可指定计算所需的精度位数
  • 高性能:基于GMP、MPFR等底层库实现,或纯C++实现
  • 表达式模板优化:减少临时对象,提高计算效率

2.2 基本类型与使用

2.2.1 高精度整数:cpp_int
#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>using namespace boost::multiprecision;int main() {// 任意精度整数cpp_int a = "12345678901234567890";cpp_int b = "98765432109876543210";// 基本运算cpp_int sum = a + b;cpp_int product = a * b;std::cout << "Sum: " << sum << "\n";std::cout << "Product: " << product << "\n";// 位运算cpp_int c = a << 10;  // 左移10位std::cout << "Shifted: " << c << "\n";return 0;
}
2.2.2 高精度浮点数:cpp_dec_float与cpp_bin_float
#include <boost/multiprecision/cpp_dec_float.hpp>
#include <boost/multiprecision/cpp_bin_float.hpp>
#include <iostream>
#include <iomanip>using namespace boost::multiprecision;int main() {// 50位十进制精度浮点数cpp_dec_float_50 a = "3.141592653589793238462643383279502884197169399375";cpp_dec_float_50 b = "2.718281828459045235360287471352662497757247093699";// 基本运算cpp_dec_float_50 sum = a + b;cpp_dec_float_50 product = a * b;cpp_dec_float_50 sqrt_a = sqrt(a);// 输出控制std::cout << std::setprecision(std::numeric_limits<cpp_dec_float_50>::digits10);std::cout << "Sum: " << sum << "\n";std::cout << "Product: " << product << "\n";std::cout << "Sqrt(a): " << sqrt_a << "\n";// 100位二进制精度浮点数cpp_bin_float_100 c = 1.0 / 3.0;std::cout << "1/3 (100 bits): " << c << "\n";return 0;
}

2.3 后端选择与性能优化

Boost.Multiprecision支持多种后端实现:

  1. 纯C++实现:无需外部依赖,但性能较低
  2. GMP/MPFR后端:基于GNU Multiple Precision Arithmetic Library,性能更高
  3. Intel TBB后端:支持并行计算
// 使用GMP后端(需要链接GMP库)
#include <boost/multiprecision/gmp.hpp>using namespace boost::multiprecision;int main() {// GMP任意精度整数mpz_int a = 123456789;mpz_int b = 987654321;mpz_int c = a * b;// GMP任意精度浮点数mpf_float_50 d = "3.14159265358979323846";mpf_float_50 e = "2.71828182845904523536";mpf_float_50 f = d * e;std::cout << "c = " << c << "\n";std::cout << "f = " << f << "\n";return 0;
}

编译时需链接GMP库:

g++ -o program program.cpp -lmpfr -lgmp

2.4 高级应用:自定义精度与性能平衡

Boost.Multiprecision允许自定义精度位数,平衡计算精度与性能:

// 自定义300位十进制精度
typedef number<cpp_dec_float<300>> my_float;// 计算高精度π值
my_float calculate_pi() {my_float pi = 0;my_float term;int sign = 1;// 使用莱布尼茨级数计算πfor (unsigned i = 0; i < 10000; ++i) {term = sign * my_float(4) / (2 * i + 1);pi += term;sign *= -1;}return pi;
}int main() {my_float pi = calculate_pi();std::cout << std::setprecision(300) << "Pi = " << pi << "\n";return 0;
}

2.5 与标准库的集成

Boost.Multiprecision类型可无缝集成到C++标准库中:

#include <boost/multiprecision/cpp_int.hpp>
#include <vector>
#include <algorithm>
#include <iostream>using namespace boost::multiprecision;int main() {// 使用高精度整数的标准容器std::vector<cpp_int> numbers = {cpp_int(1) << 100,  // 2^100cpp_int(1) << 50,   // 2^50cpp_int(1) << 200   // 2^200};// 排序std::sort(numbers.begin(), numbers.end());// 输出for (const auto& num : numbers) {std::cout << num << "\n";}return 0;
}

2.6 实战案例:密码学中的大整数运算

在密码学中,大整数运算是核心操作。以下是使用Boost.Multiprecision实现RSA加密的简化示例:

#include <boost/multiprecision/cpp_int.hpp>
#include <iostream>
#include <random>using namespace boost::multiprecision;// 生成随机大素数
cpp_int generate_prime(int bits) {std::random_device rd;std::mt19937_64 gen(rd());std::uniform_int_distribution<cpp_int> dist(cpp_int(1) << (bits - 1), (cpp_int(1) << bits) - 1);cpp_int p;do {p = dist(gen);// 简化的素性测试(实际应用中应使用更严格的测试)} while (!miller_rabin_test(p, 25));return p;
}// 扩展欧几里得算法,计算a和b的最大公约数及贝祖系数
cpp_int extended_gcd(cpp_int a, cpp_int b, cpp_int& x, cpp_int& y) {if (b == 0) {x = 1;y = 0;return a;}cpp_int x1, y1;cpp_int gcd = extended_gcd(b, a % b, x1, y1);x = y1;y = x1 - (a / b) * y1;return gcd;
}// 计算模逆元
cpp_int mod_inverse(cpp_int a, cpp_int m) {cpp_int x, y;cpp_int gcd = extended_gcd(a, m, x, y);if (gcd != 1) {throw std::runtime_error("Modular inverse does not exist");}return (x % m + m) % m;
}int main() {// 生成两个大素数cpp_int p = generate_prime(1024);cpp_int q = generate_prime(1024);// 计算n和φ(n)cpp_int n = p * q;cpp_int phi_n = (p - 1) * (q - 1);// 选择公钥指数ecpp_int e = 65537;// 计算私钥指数dcpp_int d = mod_inverse(e, phi_n);// 消息cpp_int message = 123456789;// 加密cpp_int ciphertext = powm(message, e, n);// 解密cpp_int decrypted = powm(ciphertext, d, n);std::cout << "Original message: " << message << "\n";std::cout << "Decrypted message: " << decrypted << "\n";return 0;
}

三、Eigen与Boost.Multiprecision结合应用

在某些场景下,需要同时使用高精度计算和线性代数运算。Eigen与Boost.Multiprecision可以无缝结合:

#include <Eigen/Dense>
#include <boost/multiprecision/cpp_dec_float.hpp>using namespace boost::multiprecision;
using Eigen::Matrix;
using Eigen::Dynamic;typedef cpp_dec_float_100 high_precision;
typedef Matrix<high_precision, Dynamic, Dynamic> MatrixHP;
typedef Matrix<high_precision, Dynamic, 1> VectorHP;int main() {// 创建高精度矩阵MatrixHP A(2, 2);A << high_precision("3.14159265358979323846"), high_precision("2.71828182845904523536"),high_precision("1.41421356237309504880"), high_precision("1.61803398874989484820");// 创建高精度向量VectorHP b(2);b << high_precision("1.0"), high_precision("2.0");// 求解线性方程组VectorHP x = A.fullPivLu().solve(b);// 输出结果std::cout << "Matrix A:\n" << A << "\n\n";std::cout << "Vector b:\n" << b << "\n\n";std::cout << "Solution x:\n" << x << "\n";return 0;
}

四、性能对比与选择建议

4.1 性能对比

操作类型Eigen (double)Boost.MP (cpp_dec_float_50)
矩阵乘法(100x100)约0.5ms约50ms
矩阵求逆(50x50)约1ms约200ms
大整数乘法约0.1μs约10μs

注:性能数据基于Intel i7处理器,具体数值因硬件和编译选项而异。

4.2 选择建议

  1. Eigen适用场景

    • 科学计算和工程模拟
    • 机器学习和深度学习
    • 需要高性能线性代数运算
    • 处理浮点数或固定精度整数
  2. Boost.Multiprecision适用场景

    • 密码学和安全应用
    • 高精度科学计算
    • 金融计算(需要精确小数)
    • 计算理论研究
    • 处理极大或极小数值
  3. 结合使用

    • 需要高精度线性代数运算(如量子计算模拟)
    • 处理需要极高精度的矩阵分解问题
    • 密码学中的矩阵运算

五、常见问题与解决方案

5.1 Eigen常见问题

  1. 编译时间过长

    • 原因:模板实例化导致代码膨胀
    • 解决方案:预编译头文件、减少不必要的模板实例化
  2. 内存对齐问题

    • 现象:程序崩溃或性能下降
    • 解决方案:使用Eigen::aligned_allocator分配内存,或设置EIGEN_MAX_ALIGN_BYTES
  3. 动态内存分配过多

    • 现象:频繁的堆分配影响性能
    • 解决方案:优先使用固定大小矩阵,或通过Eigen::Matrix::resize()预先分配内存

5.2 Boost.Multiprecision常见问题

  1. 性能瓶颈

    • 原因:高精度计算本身开销大
    • 解决方案:尽量减少高精度计算范围,使用合适的精度位数
  2. 链接错误

    • 现象:使用GMP/MPFR后端时链接失败
    • 解决方案:确保正确安装并链接GMP/MPFR库(-lgmp -lmpfr
  3. 转换精度损失

    • 现象:与浮点数互相转换时精度丢失
    • 解决方案:使用字符串初始化高精度类型,避免浮点数中间转换

六、总结与最佳实践

6.1 Eigen最佳实践

  1. 优先使用固定大小矩阵(如Matrix3f)而非动态大小矩阵
  2. 利用表达式模板优化复杂运算,但避免过度复杂表达式
  3. 对性能关键部分,使用noalias()方法避免临时对象
  4. 利用SIMD优化,确保数据对齐
  5. 对稀疏矩阵问题,使用Eigen的稀疏矩阵模块

6.2 Boost.Multiprecision最佳实践

  1. 根据需求选择合适的精度位数,避免不必要的高精度
  2. 优先使用纯C++后端(如cpp_int),除非需要极高性能
  3. 使用GMP/MPFR后端时,确保正确链接相关库
  4. 避免频繁在高精度类型和原生类型间转换
  5. 对性能敏感的应用,考虑并行计算(如使用Intel TBB后端)

6.3 综合建议

  1. 在需要高精度线性代数运算时,结合使用Eigen和Boost.Multiprecision
  2. 对计算密集型任务,考虑使用OpenMP或CUDA加速
  3. 定期使用性能分析工具(如Intel VTune)检测瓶颈
  4. 在保证正确性的前提下,优先选择原生类型以提高性能

通过合理使用Eigen和Boost.Multiprecision,开发者可以在保持C++高性能优势的同时,轻松处理复杂的数值计算问题,无论是线性代数运算还是高精度数值处理,都能获得满意的解决方案。

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

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

相关文章

第十八节:第三部分:java高级:反射-获取构造器对象并使用

Class提供的获取类构造器的方法以及获取类构造器的作用代码&#xff1a;掌握获取类的构造器&#xff0c;并对其进行操作 Cat类 package com.itheima.day9_reflect;public class Cat {private String name;private int age;private Cat(String name, int age) {this.name name;…

集中打印和转换Office 批量打印精灵:Word/Excel/PDF 全兼容,效率翻倍

各位办公小能手们&#xff01;你们平时办公的时候&#xff0c;是不是经常要打印一堆文件&#xff0c;烦得要命&#xff1f;别慌&#xff0c;今天我给大家介绍一款超厉害的神器——Office批量打印精灵&#xff01; 软件下载地址安装包 这玩意儿啊&#xff0c;是专门为高效办公设…

docker的搭建

一、安装docker使用以下命令进行安装dockerapt-get install docker.io docker-compose使用以下命令进行查看docker是否开启systemctl status docker由此可见&#xff0c;docker没有打开&#xff0c;进行使用命令打开。systemctl start docker再次查看是否开启。肉眼可见&#x…

数据库管理-第349期 Oracle DB 23.9新特性一览(20250717)

数据库管理349期 2025-07-17数据库管理-第349期 Oracle DB 23.9新特性一览&#xff08;20250717&#xff09;1 JavaScript过程和函数的编译时语法检查2 不再需要JAVASCRIPT上的EXECUTE权限3 GROUP BY ALL4 使用SQL创建并测试UUID5 IVF索引在线重组6 JSON到二元性迁移器&#xf…

将CSDN文章导出为PDF

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处前言在日常学习和技术积累过程中&#xff0c;我们经常会在 CSDN 等技术博客平台上阅读高质量的技术文章。然而&#xff0c;网页阅读…

macOS - Chrome 关闭自动更新

进入 Google 相关资源文件夹 删除 GoogleSoftwareUpdate 文件夹 open ~/Library/Google 部分教程推荐&#xff0c;在 chrome://flags/ 页面设置&#xff0c;但最近没看到 自动更新相关开关。2025-07-13&#xff08;日&#xff09;

Python 模块化编程全解析:模块、包与第三方库管理指南

模块与包 模块化编程是什么&#xff1f;用生活例子秒懂 想象你在搭乐高积木&#xff1a; 每个小积木块都有特定功能&#xff08;比如轮子、窗户、墙壁&#xff09;—— 这就像模块&#xff08;一个.py 文件&#xff0c;封装了函数或类&#xff09;。把相关的积木块装进一个盒…

小白学Python,网络爬虫篇(2)——selenium库

前言 selenium 库是一种用于 Web 应用程序测试的工具&#xff0c;它可以驱动浏览器执行特定操作&#xff0c;自动按照脚本代码做出单击、输入、打开、验证等操作&#xff0c;支持的浏览器包括 IE、Firefox、Safari、Chrome、Opera 等。 与 requests 库不同的是&#xff0c;se…

Java安全:SpringBoot项目中Fastjson组件的使用与安全实践

前言 Fastjson是阿里巴巴开源的一个高性能Java JSON库&#xff0c;广泛用于Java对象的序列化和反序列化操作。在SpringBoot项目中&#xff0c;Fastjson常被用作JSON处理工具。然而&#xff0c;Fastjson因其高性能而广受欢迎的同时&#xff0c;也因多次爆出的安全漏洞而备受关注…

x的平方根

给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。注意&#xff1a;不允许使用示例 1&#xff1a;输入&#xff1a;x 4 输出&#xff1a;2示例 2&#xff1a;输入&#xff1…

oracle服务器定时备份Windows Server

-- 创建目录对象&#xff08;若未创建&#xff09;&#xff0c;先建立对应文件夹才能用目录对象CREATE OR REPLACE DIRECTORY dp_dirbackup AS D:\BACKUP; --配置路径 GRANT READ, WRITE ON DIRECTORY dp_dirbackup TO 用户名; --配置用户权限-- 备份脚本&#xff08;保存为每…

HTML data-* 属性 自定义属性

data-* 属性用于存储私有页面后应用的自定义数据。 data-* 属性可以在所有的 HTML 元素中嵌入数据。 自定义的数据可以让页面拥有更好的交互体验&#xff08;不需要使用 Ajax 或去服务端查询数据&#xff09;。 data-* 属性由以下两部分组成&#xff1a;1. 属性名不要包含大写字…

Oracle 大页配置use_large_pages 参数解析

一、前因 再给一位客户的Exdata 2 节点 RAC 19C版本创建数据库并配置好优化参数后&#xff0c;客户一天发来一份健康检查报告&#xff0c;打开一看 use_large_pages 配置异常。 回想安装部署时特意确认了在db启动大页已经生效&#xff0c;为何会有此异常告警项&#xff1f; 二…

迅为八核高算力RK3576开发板摄像头实时推理测试 ppyoloe目标检测

RK3576处理器迅为iTOP-3576开发板采用瑞芯微RK3576高性能、低功耗的应用处理芯片&#xff0c;集成了4个Cortex-A72和4个Cortex-A53核心&#xff0c;以及独立的NEON协处理器。它适用于ARM PC、边缘计算、个人移动互联网设备及其他多媒体产品。NPU高达6TOPS算力支持INT4/INT8/INT…

纯CSS轮播

纯CSS轮播 在现代网页设计中&#xff0c;轮播组件是一种常见的用户界面元素&#xff0c;广泛应用于展示图片、产品信息等内容。本文将详细介绍如何使用纯 HTML/CSS 和少量 JavaScript 实现一个功能完备的 CSS Scroll Snap 轮播组件。该组件不仅支持原生左右拖拽滚动&#xff0c…

从零开始的云计算生活——番外3,LVS+KeepAlived+Nginx高可用实现方案

目录 前言 一、环境搭建 1.环境准备 2.安装ipvsadm和keepalived&#xff08;Lvs服务器&#xff09;&#xff0c;nginx服务器安装nginx 3.为两台RS配置虚拟ip&#xff08;nginx服务器&#xff09; 1.配置虚拟网络子接口 2.ARP响应级别与通告行为的概念 3.配置ARP 二、Ke…

100201组件拆分_编辑器-react-仿低代码平台项目

文章目录1 设计UI&#xff0c;组件拆分2 实现关于1 设计UI&#xff0c;组件拆分 编辑器整体如上图所示&#xff0c;重点关注&#xff1a; flex弹性布局 上 左中右 下 左中右 画布居中画布Y轴滚动 2 实现 src/pages/question/Edit/index.tsx代码如下&#xff1a; import { …

CS课程项目设计2:交互友好的五子棋游戏

上次给大家分享了井字棋游戏的设计流程 CS课程项目设计1&#xff1a;交互友好的井字棋游戏-CSDN博客https://blog.csdn.net/weixin_36431280/article/details/149309500?spm1001.2014.3001.5501今天打算再分享进阶版井字棋游戏的版本设计——五子棋游戏。五子棋游戏操作方式与…

如何用山海鲸轻松构建3D智慧大屏?

一、什么是3D可视化大屏&#xff1f; 3D可视化大屏是一种结合了三维&#xff08;3D&#xff09;图形技术与数据可视化技术的信息展示平台&#xff0c;它通过在大型屏幕上以三维立体的形式呈现复杂的数据和信息&#xff0c;为用户提供直观、生动的视觉体验。这种技术将抽象的数…

牛客网 SQL 刷题(全部题目,最优解,复杂题有讲解)

刷题网址&#xff1a;https://www.nowcoder.com/exam/oj?questionJobId10&subTabNameonline_coding_page有时主页显示的题目序号与点进去之后的题目序号有所不同&#xff0c;这里以点进去之后的题目序号为主&#xff0c;如果日后还是有所出入&#xff0c;可以凭题目名称找…