margnalizeHuberJacibian测试Demo

news2024/11/18 3:21:04

文章目录

    • margnalize
      • 公式及原理:
      • 测试代码及运行结果
        • 解说
        • 代码
        • 编译命令:
        • 运行结果:
    • Huber
      • 原理
      • 代码
    • Jacibian测试
      • 代码
        • 代码解释
        • 代码
        • 编译命令
        • 运行结果

margnalize

公式及原理:

在这里插入图片描述

测试代码及运行结果

解说

/*********************************
变量:a b c 观测:u
[2 3]
 a b
1a+1b = 6 (x y):(1 1) u=6
1a+2b = 8 (x y):(1 2) u=8


e = sum||ri|| = sum||ax+by - u||
J = [x y]
H = [x2 xy] =  [Haa Hab]
    [yx y2]    [Hba Hbb]
b = -JT * ri = [ba, bb]

初始:[a b] = [0 0]

[a b] += H^-1 * b

--
来c,marg a
--

[3 5]
 b c
3a+1b = 14 (y z):(3 1) u=14
1a+2b = 13 (y z):(1 2) u=13


e = sum||ri|| = sum||by+cz - u||

J = [y z]
H = [y2 yz] + Hpr
    [zy z2]
b = -JT * ri + bpr

Hpr = Hbb - Hba*Haa^-1*Hab
bpr = bb - Hba*Haa^-1*ba

初始:[y z] = [b 0]

[b c] += H^-1 * (J*ri)
***************************/

代码

#include <iostream>
#include <random>
#include <vector>
#include <Eigen/Core>
#include <Eigen/Geometry>

using namespace std;
using namespace Eigen;

vector<Vector3d> xyzs;
vector<float> us;

int main()
{
  std::default_random_engine generator(0);
  std::normal_distribution<double> n(0., 1. / 1000.);

  /*第一次观测*/
  //[x y]=[1 1]
  double x = 1 + n(generator);
  double y = 1 + n(generator);
  //u=6
  double u = 5 + n(generator);
  xyzs.push_back(Vector3d(x,y,0));
  us.push_back(u);

  /*第二次观测*/
  //[x y]=[1 2]
  x = 1 + n(generator);
  y = 2 + n(generator);
  //u=8
  u = 8 + n(generator);
  xyzs.push_back(Vector3d(x,y,0));
  us.push_back(u);

  //parameras: a b c : 0 0 0
  //初始:[a b c] = [0 0 0]
  Vector3d p(0,0,0);
  Matrix2d H = Matrix2d::Zero();
  Vector2d b(0,0);

  int iters = 5;
  for (int iter = 0; iter < iters; iter++) {
    H.setZero(); b.setZero();
    double error = 0;
    for (int i = 0; i < us.size(); i++) {

      //J = [x y]
      Vector2d J;
      J << xyzs[i].x(), xyzs[i].y();

      H += J * J.transpose();

      double res = xyzs[i].x() * p[0] + xyzs[i].y() *p[1] - us[i];
      b -= J * res;
      error += res*res;
    }

    Vector2d update = H.inverse() * b;

    cout << "iter: " << iter << " error: " << error << endl;
    cout << "update: \n" << update << endl;

    if (update.norm() < 1e-6) {
      // converge
      break;
    }

    p[0] += update[0];
    p[1] += update[1];
  }

  cout << "P:\n" << p << endl;

  xyzs.clear(); us.clear();
  /*第三次观测*/
  //[y z]=[3 1]
  y = 3 + n(generator);
  double z = 1 + n(generator);
  //u=8
  u = 14 + n(generator);
  xyzs.push_back(Vector3d(0,y,z));
  us.push_back(u);

  /*第四次观测*/
  //[y z]=[1 2]
  y = 1 + n(generator);
  z = 2 + n(generator);
  //u=8
  u = 13 + n(generator);
  xyzs.push_back(Vector3d(0,y,z));
  us.push_back(u);


  //----marg a----/
  //Hpr = Hbb - Hba*Haa^-1*Hab
  //bpr = bb - Hba*Haa^-1*ba
  double hpr = H(1,1) - H(1,0)*(1/H(0,0))*H(0,1);
  double bpr = b[1] - H(1,0)*(1/H(0,0))*b[0];

  cout << "hpr bpr: " << hpr << " " << bpr << endl;

  H.setZero(); b.setZero();
  H(0,0) = hpr;
  b[0] = bpr;
  for (int iter = 0; iter < iters; iter++) {

    H.setZero(); b.setZero();
    double error = 0;
    for (int i = 0; i < us.size(); i++) {

      //J = [x y]
      Vector2d J;
      J << xyzs[i].y(), xyzs[i].z();

      H += J * J.transpose();

      double res = xyzs[i].y() * p[1] + xyzs[i].z() *p[2] - us[i];
      b -= J * res;
      error += res*res;
    }

    Vector2d update = H.inverse() * b;

    cout << "iter: " << iter << " error: " << error << endl;
    cout << "update: \n" << update << endl;

    if (update.norm() < 1e-6) {
      // converge
      break;
    }

    p[1] += update[0];
    p[2] += update[1];
  }


  cout << "truth: 2 3 5" <<< endl;
  cout << "P:\n" << p << endl;

}                                      

编译命令:

g++ marginalize_test.cpp `pkg-config eigen3 --libs --cflags`  

运行结果:

iter: 0 error: 89.0188
update:
2.00557
2.99861
iter: 1 error: 1.14385e-28
update:
-8.87247e-15
8.78737e-16
P:
2.00557
2.99861
0
hpr bpr: 0.502553 4.41612e-16
iter: 0 error: 125.068
update:
0.00475064
4.9929
iter: 1 error: 0
update:
0
0
P:
2.00557
3.00336
4.9929

Huber

原理

常用 Huber 核:
在这里插入图片描述
当误差 r 大于阈值 δ 后,函数增长由二次形式变成了一次形式,相当 于限制了梯度的最大值。同时,Huber 核函数又是光滑的,可以很方便地求导。如下图所示。
在这里插入图片描述
Huber核函数使用说明
设待求解最小二乘问题:
e = ∑ ‖ r i ‖ e=∑‖r_i ‖ e=ri
当加入Huber核,最小二乘问题变为:
e = ∑ ‖ H u b e r ( r i ) ‖ e=∑‖Huber(r_i)‖ e=Huber(ri)
则雅可比矩阵对应变动,设待优化参数为ξ:
r i → H u b e r ( r i ) r_i→Huber(r_i) riHuber(ri) J = ( ∂ r i ) / ∂ ξ → J = ( ∂ H u b e r ( r i ) ) / ∂ ξ J=(∂r_i)/∂ξ → J=(∂ Huber(r_i))/∂ξ J=(ri)/ξJ=(Huber(ri))/ξ
在这里插入图片描述
而后可使用高斯牛顿方法求解:
J i T J i ⋅ ∆ ξ = − J i T ⋅ H u b e r ( r i ) J_i^T J_i \cdot∆ξ=-J_i^T \cdot Huber(r_i) JiTJiξ=JiTHuber(ri)

代码

代码1:

#include <iostream>
#include <vector>
#include <cmath>
#include <Eigen/Dense>
#include <unsupported/Eigen/AutoDiff>

using namespace Eigen;

// Huber loss function
template<typename T>
T huber_loss(T delta, T epsilon) {
    if (std::abs(delta) <= epsilon) {
        return 0.5 * delta * delta;
    } else {
        return epsilon * (std::abs(delta) - 0.5 * epsilon);
    }
}

// Gauss-Newton optimization
template<typename T>
Vector3d gauss_newton_optimization(const Vector3d& initial_estimate, const std::vector<T>& measurements, T epsilon) {
    Vector3d parameters = initial_estimate;

    for (int iter = 0; iter < 10; ++iter) {
        Matrix<T, Dynamic, 3> jacobian(measurements.size(), 3);
        Vector<T, Dynamic> residuals(measurements.size());

        for (size_t i = 0; i < measurements.size(); ++i) {
            AutoDiffScalar<Vector3d> ad_params(parameters);
            AutoDiffScalar<T> ad_meas(measurements[i]);

            residuals(i) = ad_meas - (ad_params[0] * ad_meas * ad_meas + ad_params[1] * ad_meas + ad_params[2]);

            if (std::abs(residuals(i)) <= epsilon) {
                jacobian(i, 0) = -residuals(i) * ad_meas * ad_meas;
                jacobian(i, 1) = -residuals(i) * ad_meas;
                jacobian(i, 2) = -residuals(i);
            } else {
                jacobian(i, 0) = -epsilon * std::copysign(T(1.0), residuals(i)) * ad_meas * ad_meas;
                jacobian(i, 1) = -epsilon * std::copysign(T(1.0), residuals(i)) * ad_meas;
                jacobian(i, 2) = -epsilon * std::copysign(T(1.0), residuals(i));
            }
        }

        Vector3d delta = (jacobian.transpose() * jacobian).ldlt().solve(jacobian.transpose() * residuals);
        parameters += delta;

        if (delta.norm() < 1e-6) {
            break;
        }
    }

    return parameters;
}

int main() {
    std::vector<double> measurements{1.2, 2.3, 3.5, 4.7, 5.9};
    Vector3d initial_estimate(1.0, 1.0, 1.0);
    double epsilon = 0.5;

    Vector3d optimized_parameters = gauss_newton_optimization(initial_estimate, measurements, epsilon);

    std::cout << "Optimized parameters: " << optimized_parameters.transpose() << std::endl;

    return 0;
}

代码2(局部):

          double x = Pc.x();
          double y = Pc.y();
          double z = Pc.z();
          double z_2 = z * z;

          Matrix<double,2,3> PiFunc;
          PiFunc << 1/z, 0, 0, 0, 1/z, 0;
          //经典特征点法:TPw - u (当前帧的图像坐标差) Pc=TPw
          Vector2d res = PiFunc * Pc - it.second;
          //T的导数
            Matrix<double,2,6> jacobian_Ti;

            jacobian_Ti(0, 0) = 1/z;
            jacobian_Ti(0, 1) = 0;
            jacobian_Ti(0, 2) = -x / z_2;
            jacobian_Ti(0, 3) = -x * y / z_2;
            jacobian_Ti(0, 4) = 1 + x * x / z_2;
            jacobian_Ti(0, 5) = -y/z;

            jacobian_Ti(1, 0) = 0;
            jacobian_Ti(1, 1) = 1/z;
            jacobian_Ti(1, 2) = -y / z_2;
            jacobian_Ti(1, 3) = -1 - y * y / z_2;
            jacobian_Ti(1, 4) = x * y / z_2;
            jacobian_Ti(1, 5) = x/z;

            for (int j = 0; j < 2; j++) {
             if (fabs(res[j]) <= epsi) {
               jacobian_Ti.row(j) = res[j] * jacobian_Ti.row(j);
             } else {
               jacobian_Ti.row(j) = epsi * sign(res[j]) * jacobian_Ti.row(j);
             }
           }
           //P的导数
            Matrix<double,2,3> jacobian_uv_Pc;
            jacobian_uv_Pc << 1/z, 0 , -x/z_2, 0, 1/z, -y/z_2;

            Matrix<double,2,3> jacobian_Pj = jacobian_uv_Pc * Rcw;

            for (int j = 0; j < 2; j++) {
              if (fabs(res[j]) <= epsi) {
                jacobian_Pj.row(j) = res[j] * jacobian_Pj.row(j);
              } else {
                jacobian_Pj.row(j) = epsi * sign(res[j]) * jacobian_Pj.row(j);
              }
            }
          
          Vector2d error2 = HuberLoss(res, epsi);
          error += error2.transpose() * error2;

          H += J.transpose() * J;
          b -= J.transpose() * error2;

Jacibian测试

代码

代码解释

以经典特征点法为例:归一化坐标

 10 //P2 = R21 * P1 +t21
 11 //func(\xi) = \pi(R21 * P1 +t21) - p2
 12 //J: (2*6):
 13 //J(0, 0) = 1/z;
 14 //J(0, 1) = 0;
 15 //J(0, 2) = -x / z_2;
 16 //J(0, 3) = -x * y / z_2;
 17 //J(0, 4) = 1 + x * x / z_2;
 18 //J(0, 5) = -y/z;
 19 //J(1, 0) = 0;
 20 //J(1, 1) = 1/z;
 21 //J(1, 2) = -y / z_2;
 22 //J(1, 3) = -1 - y * y / z_2;
 23 //J(1, 4) = x * y / z_2;
 24 //J(1, 5) = x/z;
 25
 26 //value:
 27 //J := func(\xi + \delta) - func(\xi) / \delta
 28
 29 //\pi(): P/P.z
 30 //piFunc << 1/z, 0, 0, 0, 1/z, 0;   piFunc * P

代码

typedef Eigen::Matrix<double, 6, 1> Vector6d;

int main()
{
  std::default_random_engine generator(time(NULL));
  std::uniform_real_distribution<double> xy_rand(-3, 3);
  std::uniform_real_distribution<double> z_rand(2., 6.);

  Vector3d P1(xy_rand(generator), xy_rand(generator), z_rand(generator));
  Vector3d p1 = P1 / P1.z();

  double theta = 2 * M_PI / 30;
  float radius = 8;
  // 绕 z轴 旋转
  Matrix3d R_th;
  R_th = AngleAxisd(theta, Vector3d::UnitZ());
  Vector3d t_th = Vector3d(radius * cos(theta) - radius, radius * sin(theta), 1 * sin(2 * theta));

  Vector3d P2_th = R_th * P1 + t_th;
  Vector3d p2 = P2_th / P2_th.z();


  //T求导值
  Sophus::SE3d T_e = Sophus::SE3d(Eigen::Matrix4d::Identity());
  Vector3d P2_e = T_e * P1;
  double x = P2_e.x();
  double y = P2_e.y();
  double z = P2_e.z();
  double z_2 = z * z;

  //解析值:
  Matrix<double,2,6> jacobian_Ti;
  jacobian_Ti(0, 0) = 1/z;
  jacobian_Ti(0, 1) = 0;
  jacobian_Ti(0, 2) = -x / z_2;
  jacobian_Ti(0, 3) = -x * y / z_2;
  jacobian_Ti(0, 4) = 1 + x * x / z_2;
  jacobian_Ti(0, 5) = -y/z;
  jacobian_Ti(1, 0) = 0;
  jacobian_Ti(1, 1) = 1/z;
  jacobian_Ti(1, 2) = -y / z_2;
  jacobian_Ti(1, 3) = -1 - y * y / z_2;
  jacobian_Ti(1, 4) = x * y / z_2;
  jacobian_Ti(1, 5) = x/z;

  cout << "J: \n" << jacobian_Ti << endl;

  //func(\xi + \delta)
  double eps = 1e-6;
  Vector6d delta;
  delta << eps, 0,0,0,0,0;

  Matrix<double,2,3> PiFunc;

  Vector3d P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  Vector2d p2a = PiFunc * P2a;
  //Vector3d p2a = Sophus::SE3d::exp(delta) * T_e * P1;
  //P2a = p2a / p2a.z();
  Vector3d P2b = T_e * P1;
  z = P2b.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  Vector2d p2b = PiFunc * P2b;
  Vector2d J0 = (p2a - p2b) / eps;


  delta << 0, eps, 0,0,0,0;
  P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2a = PiFunc * P2a;
  P2b = T_e * P1;
  z = P2b.z();

  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2b = PiFunc * P2b;

  Vector2d J1 = (p2a - p2b) / eps;

  delta << 0, 0, eps,0,0,0;
  P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2a = PiFunc * P2a;
  P2b = T_e * P1;
  z = P2b.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2b = PiFunc * P2b;

  Vector2d J2 = (p2a - p2b) / eps;

  delta << 0, 0, 0, eps, 0,0;
  P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2a = PiFunc * P2a;
  P2b = T_e * P1;
  z = P2b.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2b = PiFunc * P2b;

  Vector2d J3 = (p2a - p2b) / eps;

  delta << 0, 0, 0, 0, eps, 0;
  P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2a = PiFunc * P2a;
  P2b = T_e * P1;
  z = P2b.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2b = PiFunc * P2b;

  Vector2d J4 = (p2a - p2b) / eps;

  delta << 0, 0, 0, 0, 0, eps;
  P2a = Sophus::SE3d::exp(delta) * T_e * P1;
  z = P2a.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2a = PiFunc * P2a;
  P2b = T_e * P1;
  z = P2b.z();
  PiFunc << 1/z, 0, 0, 0, 1/z, 0;
  p2b = PiFunc * P2b;

  Vector2d J5 = (p2a - p2b) / eps;

  cout << "value compute: \n" << J0[0] << " " << J0[1] << endl
  << J1[0] << " " << J1[1] << endl
  << J2[0] << " " << J2[1] << endl
  << J3[0] << " " << J3[1] << endl
  << J4[0] << " " << J4[1] << endl
  << J5[0] << " " << J5[1] << endl;
}

编译命令

g++ jacobian_test.cpp -L ~/Download/softpackages/Sophus/build -I ~/Download/softpackages/Sophus `pkg-config eigen3 --libs --cflags`

运行结果

J:
0.258424 0 0.0200104 -0.0521547 1.006 0.673549
0 0.258424 0.174061 -1.45367 0.0521547 -0.0774327
value compute:
0.258424 0
0 0.258424
0.0200104 0.174061
-0.0521548 -1.45367
1.006 0.0521544
0.673549 -0.0774323

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

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

相关文章

python 包管理工具poetry和异步sanic web框架实践+配置镜像源

上传源码到服务器&#xff0c;然后执行poetry install安装依赖。 多进程启动脚本run.sh内容&#xff1a; #!/bin/bash #应用入口文件 APP_NAME/www/wwwroot/python-sanic/main.py #进程关键字 PROCESS_KEYWORDpython-sanic #使用说明&#xff0c;用来提示输入参数 usage(){…

潮玩数藏App:数字时代下的潮流收藏新体验

随着数字时代的到来&#xff0c;潮流收藏成为了一种新型的文化现象&#xff0c;并在年轻人中迅速流行起来。为了满足这一需求&#xff0c;潮玩数藏App应运而生&#xff0c;为用户提供了一个专业、便捷的潮流收藏平台。本文将深入探讨潮玩数藏App的专业性、思考深度以及逻辑性&a…

“爱在七夕,情暖人间”店口志愿者开展敬老助残服务活动

在这个充满爱心的世界里&#xff0c;让志愿服务燃烧我们的人生。 8月22日七夕节&#xff0c;诸暨市爱心助残协会联合牛皋社区党支部、老年协会、店口镇义工协会、店口镇残疾人之家、诸暨凯客蛋糕、诸暨中康医院、杨琼发艺工作室、国芬理发店等爱心团队在店口残疾人之家开展了“…

好用的电容笔有哪些推荐?开学季便宜好用电容笔推荐

开学马上要来了&#xff0c;想必很多学生党都在为开学而做准备&#xff0c;要知道&#xff0c;原装的Apple Pencil&#xff0c;虽然功能很强&#xff0c;但是价格却很贵&#xff0c;不是一般人能够承受得起的。所以&#xff0c;是否也有类似于Apple Pencil这样的电容笔&#xf…

直播app源码,会话描述协议SDP:高质量平台

摘要&#xff1a; SDP协议又称为会话描述协议&#xff0c;在直播app源码平台中&#xff0c;通过定义实时通信参数&#xff0c;管理会话信息和媒体数据&#xff0c;来为用户提供实时通信服务&#xff0c;确保通信的质量与稳定&#xff0c;例如:在直播app源码平台的直播间中&…

每年节约3千万!微信实验平台Iceberg湖仓一体架构改造

# 关注并星标腾讯云开发者 # 每周3 | 谈谈我在腾讯的架构设计经验 # 第4期 | 黄延岩&#xff1a;微信实验平台 - 全面拥抱湖仓时代 微信实验平台简介 微信实验平台主要提供微信内部各个业务场景&#xff08;视频号、直播、搜一搜、公众号等&#xff09;下的各类实验场景的支持&…

苍穹外卖 day1 搭建成功环境

引入 idea找不到打包生成的文件目录怎么办&#xff0c;首先点击这个小齿轮 show ecluded files然后就能找到隐藏的文件 这个jar包内含tomcat&#xff0c;可以直接丢在linux上用 开发环境&#xff1a;开发人员在开发阶段使用的环境&#xff0c;一般外部用户无法访问 测试环…

清华源的链接太多老崩溃,我把它拷过来,需要什么点什么

建议按照字母分个类可能会好点 把链接这里改为 哈哈就不卡了&#xff0c;浏览器也不崩溃了还能很快就链接成功 Links for pandas这是链接 这个小技巧教给大家请给我点个赞

uniapp 实现切换tab锚点定位到指定位置

1.主要使用uniapp scroll-view 组件的scroll-into-view属性实现功能 2.代码如下 <scroll-view:scroll-into-view"intoView"><u-tabsclass"tabs-list"change"tabChange":list"tabList"></u-tabs><view id"1&…

Wireshark流量分析例题

目录 前言 一、题目一(1.pcap) 二、题目二(2.pcap) 三、题目三(3.pcap) 四、题目四(4.pcap) 前言 Wireshark流量包分析对于安全来说是很重要的&#xff0c;我们可以通过Wireshark来诊断网络问题&#xff0c;检测网络攻击、监控网络流量以及捕获恶意软件等等 接下来我们…

pyqt5-自定义停靠栏头部

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import *class CustomDock(QDockWidget):def __init__(self, title: str, parentNone):super().__init__(title, parent)"""停靠栏的头部"""h_layout Q…

柔性数组详解

柔性数组 1.前言 在c99标准中&#xff1a;允许结构体的最后一个变量是未知大小的数组&#xff0c;这就是柔性数组的来源。 例如&#xff1a; typedef struct type_a{ int i;int a[0];//柔性数组成员 }type_a;有些编译器可能会报错&#xff0c;那就使用下面这一种定义方式&…

数据驱动洞察:各种词频分析技术挖掘热点数据

一、引言 随着信息时代的发展&#xff0c;人们的关注点日益复杂多样。社交媒体、新闻网站和论坛等平台上涌现了大量的信息&#xff0c;这使得热点分析成为了解社会热点话题和舆情动向的重要手段。词频统计是热点分析的基础&#xff0c;本文将分别介绍基于ElasticSearch、基于S…

C++动态规划经典案例解析之合并石子

1. 前言 区间类型问题&#xff0c;指求一个数列中某一段区间的值&#xff0c;包括求和、最值等简单或复杂问题。此类问题也适用于动态规划思想。 如前缀和就是极简单的区间问题。如有如下数组&#xff1a; int nums[]{3,1,7,9,12,78,32,5,10,11,21,32,45,22}现给定区间信息[…

中国区域地表净辐射数据集(1982-2017)

摘要 地表净辐射(Rn) 是陆地生态系统水、热、碳循环过程中的重要参数,准确地估算Rn并分析其时空变化特征对气候变化和能量平衡等研究具有重要意义。本文基于CMFD再分析资料和GLASS地表反照率数据集估算1982~2017年中国区域逐日Rn。本数据集将逐日Rn统计为每月Rn,空间分辨率…

诚迈科技携数智成果亮相南京软博会,交出数实融合圆满答卷

8月20-23日&#xff0c;南京软博会在南京国际博览中心盛大举行。诚迈科技聚焦数字中国建设需求和万物智联时代关键软件技术发展趋势&#xff0c;全方位展示了一系列操作系统产品和数智化解决方案成果&#xff0c;旨在推动数实融合创新。此外&#xff0c;诚迈科技受邀出席中国工…

【业务功能篇74】三高微服务项目springboot-springcloud

三高指的是&#xff1a;高性能、高并发、高可用 2.项目架构 2.1 系统架构图 整体的项目架构图如下 2.2 业务组成 整体的项目业务组成如下

Elasticsearch简介及安装

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

指针与引用详解

博文内容&#xff1a; 指针与引用 指针和引用的区别&#xff1f; 这个问题主要还是仁者见仁&#xff0c;智者见智。 主要就是对于俩者的出现时间来看&#xff0c;对于指针来说&#xff0c;早在C语言那会就已经出现&#xff0c;C是后于C语言的&#xff0c;所以C的出现会多少在使…

美创科技“签”手柠檬文才学堂,共推高校数据安全建设

近日&#xff0c;由柠檬文才学堂联合中国教育在线、东北财经大学网络教育学院共同主办的“三教统筹下高校继续教育数字化转型研讨”顺利召开。 国内高等院校&#xff08;高职院校&#xff09;继续教育分管领导&#xff0c;继续教育学院领导及继续教育信息化、教学教务管理、课程…