【opencv】教程代码 —ml (主成分分析、支持向量机、非线性支持向量机)

 1. introduction_to_pca.cpp  主成分分析

f413a9b3dcae27dd0c4b4a9ae2bc7e13.png

a8c24e187bf9bdc621952a8f113a27ea.png

811132a96e6e9d6b190226f44e70dd2b.png

/*** @file introduction_to_pca.cpp* @brief 这个程序演示了如何使用OpenCV PCA 提取物体的方向* @author OpenCV团队*/// 包含OpenCV函数库所需要的头文件
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <iostream> // 包含输入输出流的头文件// 使用std和cv的命名空间,这样我们就可以直接使用它们提供的方法,不用每次都写std::和cv::
using namespace std;
using namespace cv;// 函数声明
void drawAxis(Mat&, Point, Point, Scalar, const float);
double getOrientation(const vector<Point> &, Mat&);/*** @function drawAxis* @brief 绘制轴线的函数*/
void drawAxis(Mat& img, Point p, Point q, Scalar colour, const float scale = 0.2)
{//! [visualization1]// 计算以弧度为单位的角度double angle = atan2((double)p.y - q.y, (double)p.x - q.x); // p到q的线段角度// 计算p和q之间的直线的长度double hypotenuse = sqrt((double)(p.y - q.y) * (p.y - q.y) + (p.x - q.x) * (p.x - q.x));// 这里通过缩放因子来延长线段的长度q.x = (int)(p.x - scale * hypotenuse * cos(angle)); // 计算新的q点的x坐标q.y = (int)(p.y - scale * hypotenuse * sin(angle)); // 计算新的q点的y坐标// 绘制p点到新q点的直线,这是主线段line(img, p, q, colour, 1, LINE_AA);// 创建箭头的勾// 根据箭头角度计算箭头勾的端点,并绘制箭头勾的第一部分p.x = (int)(q.x + 9 * cos(angle + CV_PI / 4)); // 计算箭头勾的一个端点的x坐标p.y = (int)(q.y + 9 * sin(angle + CV_PI / 4)); // 计算箭头勾的一个端点的y坐标line(img, p, q, colour, 1, LINE_AA); // 绘制箭头勾的第一部分// 绘制箭头勾的第二部分p.x = (int)(q.x + 9 * cos(angle - CV_PI / 4)); // 计算箭头勾的另一个端点的x坐标p.y = (int)(q.y + 9 * sin(angle - CV_PI / 4)); // 计算箭头勾的另一个端点的y坐标line(img, p, q, colour, 1, LINE_AA); // 绘制箭头勾的第二部分//! [visualization1]
}/*** @function getOrientation* @brief 获取方向的函数*/
double getOrientation(const vector<Point> &pts, Mat &img)
{//! [pca]// 构造PCA分析使用的数据缓冲区, 每个点的x和y坐标为一行int sz = static_cast<int>(pts.size()); // 获取点集的大小Mat data_pts = Mat(sz, 2, CV_64F); // 创建Mat对象用于存储点坐标for (int i = 0; i < data_pts.rows; i++) // 遍历所有点{data_pts.at<double>(i, 0) = pts[i].x; // 将点的x坐标放入Mat对象data_pts.at<double>(i, 1) = pts[i].y; // 将点的y坐标放入Mat对象}// 执行PCA分析PCA pca_analysis(data_pts, Mat(), PCA::DATA_AS_ROW); // 使用点集进行PCA分析// 获取物体的中心点Point cntr = Point(static_cast<int>(pca_analysis.mean.at<double>(0, 0)), // 计算平均值点的x坐标static_cast<int>(pca_analysis.mean.at<double>(0, 1))); // 计算平均值点的y坐标// 储存特征值和特征向量vector<Point2d> eigen_vecs(2); // 创建存储特征向量的向量vector<double> eigen_val(2); // 创建存储特征值的向量for (int i = 0; i < 2; i++) // 只考虑x和y坐标,因此遍历两个维度{eigen_vecs[i] = Point2d(pca_analysis.eigenvectors.at<double>(i, 0), // 获取第i个特征向量的x分量pca_analysis.eigenvectors.at<double>(i, 1)); // 获取第i个特征向量的y分量eigen_val[i] = pca_analysis.eigenvalues.at<double>(i); // 获取第i个特征值}//! [pca]//! [visualization]// 画出主成分,也即特征向量方向circle(img, cntr, 3, Scalar(255, 0, 255), 2); // 在中心点画个小圆标记// 根据特征值和特征向量计算两个特征点的位置Point p1 = cntr + 0.02 * Point(static_cast<int>(eigen_vecs[0].x * eigen_val[0]), static_cast<int>(eigen_vecs[0].y * eigen_val[0]));Point p2 = cntr - 0.02 * Point(static_cast<int>(eigen_vecs[1].x * eigen_val[1]), static_cast<int>(eigen_vecs[1].y * eigen_val[1]));// 画出两个特征向量构成的轴drawAxis(img, cntr, p1, Scalar(0, 255, 0), 1); // 第一个主成分用绿色表示drawAxis(img, cntr, p2, Scalar(255, 255, 0), 5); // 第二个主成分用黄色表示// 计算并返回第一个主成分的方向角度(弧度值)double angle = atan2(eigen_vecs[0].y, eigen_vecs[0].x); // orientation in radians//! [visualization]return angle; // 返回物体的定向角度
}/*** @function main* @brief 主函数*/
int main(int argc, char** argv)
{//! [pre-process]// 加载图像CommandLineParser parser(argc, argv, "{@input | pca_test1.jpg | input image}");parser.about( "This program demonstrates how to use OpenCV PCA to extract the orientation of an object.\n" );parser.printMessage();// 从文件中读取图像Mat src = imread( samples::findFile( parser.get<String>("@input") ) );// 检查图像是否成功加载if(src.empty()){cout << "Problem loading image!!!" << endl;return EXIT_FAILURE;}// 显示原始图像imshow("src", src);// 将图像转换为灰度图Mat gray;cvtColor(src, gray, COLOR_BGR2GRAY);// 将图像转换为二值图Mat bw;threshold(gray, bw, 50, 255, THRESH_BINARY | THRESH_OTSU);//! [pre-process]//! [contours]// 在阈值处理后的图像中查找所有轮廓vector<vector<Point> > contours;findContours(bw, contours, RETR_LIST, CHAIN_APPROX_NONE);for (size_t i = 0; i < contours.size(); i++){// 计算每个轮廓的面积double area = contourArea(contours[i]);// 忽略面积太小或太大的轮廓if (area < 1e2 || 1e5 < area) continue;// 仅用于可视化目的绘制每个轮廓drawContours(src, contours, static_cast<int>(i), Scalar(0, 0, 255), 2);// 获取每个形状的方向getOrientation(contours[i], src);}//! [contours]// 显示处理结果图像imshow("output", src);// 等待用户操作waitKey();// 正常退出程序return EXIT_SUCCESS;
}

该段代码主要演示了如何使用OpenCV里的PCA方法来提取物体的方向。它包括以下几个部分:

  1. 获取轮廓并绘制。

  2. 使用PCA计算轮廓的方向

  3. 在图像上以直观的方式绘制轴线和方向

主要的应用场景是,当你有一些形状,并且你想要定量地分析它们的方向时,可以使用这段代码来帮助你提取每个形状的主要方向。

threshold(gray, bw, 50, 255, THRESH_BINARY | THRESH_OTSU);

e23ade3347998dd29b7ac2fec93afb3a.png

findContours(bw, contours, RETR_LIST, CHAIN_APPROX_NONE);

295a1b26c4872ac92fdc34eca22c5a78.png

2. introduction_to_svm.cpp

57aa078e9b7992dbba8d30148d9850c8.png

0d991dc47fd45002ab70c0c86cfd388d.png

该代码的主要功能是使用支持向量机 (SVM) 对简单的2D数据进行分类,并把结果可视化展示出来。它首先设定了一个简单的二维训练数据集和对应的标签,然后创建了一个SVM分类器,并用线性核函数来训练这些数据。之后创建了一个512x512大小的图像,该图像的每个像素代表一个数据点,通过SVM模型对每个点进行分类,并据此为点涂色(绿色为正类,蓝色为负类)。代码还显示了训练数据点,并用不同的颜色标注支持向量。最终,结果图像会被保存并显示给用户。

# 包含OpenCV库相关头文件
#include <opencv2/core.hpp> // 包含OpenCV内核模块的定义
#include <opencv2/imgproc.hpp> // 包含图像处理功能
#include <opencv2/imgcodecs.hpp> // 包含图像编码解码相关功能
#include <opencv2/highgui.hpp> // 包含图形用户界面相关功能
#include <opencv2/ml.hpp> // 包含机器学习模块的功能// 使用命名空间,简化代码
using namespace cv;
using namespace cv::ml;int main(int, char**)
{// 设置训练数据// [setup1]int labels[4] = {1, -1, -1, -1}; // 定义标签数组,一类用1表示,另一类用-1表示float trainingData[4][2] = { {501, 10}, {255, 10}, {501, 255}, {10, 501} }; // 定义训练数据数组// [setup1]// [setup2]Mat trainingDataMat(4, 2, CV_32F, trainingData); // 将训练数据转换为OpenCV矩阵Mat labelsMat(4, 1, CV_32SC1, labels); // 将标签数据转换为OpenCV矩阵// [setup2]// 训练SVM分类器// [init]Ptr<SVM> svm = SVM::create(); // 创建一个SVM对象svm->setType(SVM::C_SVC); // 设置SVM类型为C-Support Vector Classificationsvm->setKernel(SVM::LINEAR); // 设置SVM核函数为线性核svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6)); // 设置终止条件// [init]// [train]svm->train(trainingDataMat, ROW_SAMPLE, labelsMat); // 用训练数据和标签训练SVM// [train]// 为了可视化,定义图像尺寸和图像矩阵int width = 512, height = 512;Mat image = Mat::zeros(height, width, CV_8UC3);// 展示SVM给出的决策区域// [show]Vec3b green(0,255,0), blue(255,0,0);for (int i = 0; i < image.rows; i++){for (int j = 0; j < image.cols; j++){Mat sampleMat = (Mat_<float>(1,2) << j,i); // 创建一个样本点float response = svm->predict(sampleMat); // 预测样本点的响应if (response == 1)image.at<Vec3b>(i,j)  = green; // 如果预测结果为1,将该点标记为绿色else if (response == -1)image.at<Vec3b>(i,j)  = blue; // 如果预测结果为-1,将该点标记为蓝色}}// [show]// 展示训练数据// [show_data]int thickness = -1; // 设置圆点的厚度为-1,即实心圆点// 在图像中绘制训练数据点circle( image, Point(501,  10), 5, Scalar(  0,   0,   0), thickness );circle( image, Point(255,  10), 5, Scalar(255, 255, 255), thickness );circle( image, Point(501, 255), 5, Scalar(255, 255, 255), thickness );circle( image, Point( 10, 501), 5, Scalar(255, 255, 255), thickness );// [show_data]// 展示支持向量// [show_vectors]thickness = 2; // 设置支持向量圆点的厚度为2Mat sv = svm->getUncompressedSupportVectors(); // 获取未压缩的支持向量// 在图像上绘制支持向量点for (int i = 0; i < sv.rows; i++){const float* v = sv.ptr<float>(i); // 获取每个支持向量的指针circle(image,  Point( (int) v[0], (int) v[1]), 6, Scalar(128, 128, 128), thickness); // 绘制支持向量点}// [show_vectors]imwrite("result.png", image);        // 将图像保存为result.png文件imshow("SVM Simple Example", image); // 将图像显示给用户waitKey(); // 等待用户按键return 0;
}

7aa460acb9344afd65fa1c032c4aa568.png

97eab6acd3192ee8360eaec3d9778f92.png

3.  non_linear_svms.cpp

bfa0ddde9d845aa8f886ef89b5d37d63.png

d1beb52a10993a50b38a8da3e0531b1c.png

#include <iostream> // 引入IO流库
#include <opencv2/core.hpp> // 引入OpenCV核心功能库
#include <opencv2/imgproc.hpp> // 引入图像处理库
#include "opencv2/imgcodecs.hpp" // 引入图像编解码库
#include <opencv2/highgui.hpp> // 引入GUI库
#include <opencv2/ml.hpp> // 引入机器学习库using namespace cv; // 使用cv命名空间
using namespace cv::ml; // 使用cv的机器学习命名空间
using namespace std; // 使用标准命名空间// 声明一个帮助函数,用于显示程序信息
static void help()
{cout<< "\n--------------------------------------------------------------------------" << endl<< "This program shows Support Vector Machines for Non-Linearly Separable Data. " << endl<< "--------------------------------------------------------------------------"   << endl<< endl;
}// 主函数入口
int main()
{help(); // 调用帮助函数展示信息// 定义一些SVM训练时使用的常量const int NTRAINING_SAMPLES = 100;         // 每个类的训练样本数const float FRAC_LINEAR_SEP = 0.9f;        // 线性可分部分的样本比例// 用于可视化的数据const int WIDTH = 512, HEIGHT = 512; // 定义可视化图像的宽和高Mat I = Mat::zeros(HEIGHT, WIDTH, CV_8UC3); // 创建一个黑色的可视化图像//--------------------- 1. 随机设置训练数据 ---------------------------------------Mat trainData(2*NTRAINING_SAMPLES, 2, CV_32F); // 创建训练数据矩阵Mat labels   (2*NTRAINING_SAMPLES, 1, CV_32S); // 创建对应的标签矩阵RNG rng(100); // 随机数生成器// 设置线性可分部分的训练数据int nLinearSamples = (int) (FRAC_LINEAR_SEP * NTRAINING_SAMPLES);// 类别1的随机点生成Mat trainClass = trainData.rowRange(0, nLinearSamples);// x坐标的范围是[0, 0.4)Mat c = trainClass.colRange(0, 1);rng.fill(c, RNG::UNIFORM, Scalar(0), Scalar(0.4 * WIDTH));// y坐标的范围是[0, 1)c = trainClass.colRange(1,2);rng.fill(c, RNG::UNIFORM, Scalar(0), Scalar(HEIGHT));// 类别2的随机点生成trainClass = trainData.rowRange(2*NTRAINING_SAMPLES-nLinearSamples, 2*NTRAINING_SAMPLES);// x坐标的范围是[0.6, 1]c = trainClass.colRange(0 , 1);rng.fill(c, RNG::UNIFORM, Scalar(0.6*WIDTH), Scalar(WIDTH));// y坐标的范围是[0, 1)c = trainClass.colRange(1,2);rng.fill(c, RNG::UNIFORM, Scalar(0), Scalar(HEIGHT));//------------------ 生成非线性可分部分的训练数据 ---------------// 为类别1和2的生成随机点trainClass = trainData.rowRange(nLinearSamples, 2*NTRAINING_SAMPLES-nLinearSamples);// x坐标的范围是[0.4, 0.6)c = trainClass.colRange(0,1);rng.fill(c, RNG::UNIFORM, Scalar(0.4*WIDTH), Scalar(0.6*WIDTH));// y坐标的范围是[0, 1)c = trainClass.colRange(1,2);rng.fill(c, RNG::UNIFORM, Scalar(0), Scalar(HEIGHT));//------------------------ 生成类别的标签 ---------------------------------labels.rowRange(                0,   NTRAINING_SAMPLES).setTo(1);  // 类别1labels.rowRange(NTRAINING_SAMPLES, 2*NTRAINING_SAMPLES).setTo(2);  // 类别2//------------------------ 2. 设置支持向量机的参数 -------------------------cout << "Starting training process" << endl;Ptr<SVM> svm = SVM::create(); // 创建一个SVM对象svm->setType(SVM::C_SVC); // 设置SVM类型为C-SVCsvm->setC(0.1); // 设置C参数svm->setKernel(SVM::LINEAR); // 设置核函数为线性核svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, (int)1e7, 1e-6)); // 设置终止条件//------------------------ 3. 训练svm --------------------------------------svm->train(trainData, ROW_SAMPLE, labels); // 使用训练数据和标签训练SVMcout << "Finished training process" << endl;//------------------------ 4. 显示决策区域-----------------------------------Vec3b green(0,100,0), blue(100,0,0);for (int i = 0; i < I.rows; i++){for (int j = 0; j < I.cols; j++){// 对于图像中的每个点,使用SVM进行预测Mat sampleMat = (Mat_<float>(1,2) << j, i);float response = svm->predict(sampleMat);// 根据预测结果把点对应的颜色涂上if      (response == 1) I.at<Vec3b>(i,j) = green;else if (response == 2) I.at<Vec3b>(i,j) = blue;}}//----------------------- 5. 显示训练数据 -----------------------------------int thick = -1;float px, py;// 类别1的数据for (int i = 0; i < NTRAINING_SAMPLES; i++){px = trainData.at<float>(i,0);py = trainData.at<float>(i,1);// 在图像上画圆来代表数据点circle(I, Point( (int) px,  (int) py ), 3, Scalar(0, 255, 0), thick);}// 类别2的数据for (int i = NTRAINING_SAMPLES; i <2*NTRAINING_SAMPLES; i++){px = trainData.at<float>(i,0);py = trainData.at<float>(i,1);circle(I, Point( (int) px, (int) py ), 3, Scalar(255, 0, 0), thick);}//------------------------- 6. 显示支持向量 ---------------------------------thick = 2;Mat sv = svm->getUncompressedSupportVectors(); // 获取支持向量for (int i = 0; i < sv.rows; i++){const float* v = sv.ptr<float>(i);// 画出支持向量circle(I,  Point( (int) v[0], (int) v[1]), 6, Scalar(128, 128, 128), thick);}imwrite("result.png", I);                      // 保存生成的图像imshow("SVM for Non-Linear Training Data", I); // 展示图像waitKey(); // 等待键盘输入return 0;
}

本段代码演示了如何使用支持向量机(SVM)对非线性可分数据进行分类。具体包括以下步骤:

  1. 随机生成两个类的训练数据和对应的标签;

  2. 设置支持向量机的参数并进行训练;

  3. 显示SVM的决策区域;

  4. 在图像上用不同颜色显示两个类的数据点;

  5. 在图像上显示支持向量。

代码运行完成后将会产生一张图像,展示了决策区域和支持向量机如何区分两个类的数据点。

53754b59c43c29850485e4c44ba4099a.png

16f88db0ea512ca9a0f3eb42c6f88a83.png

95fbf2b70055fa384efe64ae0951e391.png

90796e788ecbee799d67c7ca58e05197.png

c35fc34a86a0716435cde128fab3b626.png

circle(I, Point((int)px, (int)py), 3, Scalar(255, 0, 0), thick);

fedcf01d0f9f2915b0aff89e316b2a7f.png

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

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

相关文章

[VulnHub靶机渗透] pWnOS 2.0

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

LeetCode刷题实战1:两数之和

从今天开始加入刷题大军&#xff0c;把算法题刷爆&#xff0c;我们直接进入主题。 题目内容 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…

160 Linux C++ 通讯架构实战14,epoll 反应堆模型

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

CSS - 你实现过0.5px的线吗

难度级别:中级及以上 提问概率:75% 我们知道在网页显示或是网页打印中,像素已经是最小单位了,但在很多时候,即便是最小的1像素,精度却不足以呈现所需的线条精度和细节。因此,为了在网页显示和网页打印中呈现更加细致的线条,为了在视觉…

Prometheus+grafana环境搭建Nginx(docker+二进制两种方式安装)(六)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前五篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

自动驾驶涉及相关的技术

当科幻走进现实&#xff0c;当影视照进生活&#xff0c;无数次憧憬的自动驾驶&#xff0c;正在慢慢的梦想成真。小时候天马星空的想象&#xff0c;现在正悄无声息的改变着我们的生活。随着汽车电动化进程的加快&#xff0c;自动驾驶技术映入眼帘&#xff0c;很多人可能感觉遥不…

Jupyter Notebook安装使用(一)

1. 简介 Jupyter Notebook 是一个非常强大的工具&#xff0c;它允许用户创建和共享包含实时代码、方程式、可视化和叙事文本的文档。这种工具特别适合数据清理和转换、数值模拟、统计建模、数据可视化、机器学习等多种应用领域。 2. 安装Jupyter Notebook 2.1. 使用 Anaconda…

Gson的用法

1. 导入依赖 <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.6</version> </dependency> 2. 使用Gson进行解析 2.1 Gson解析普通对象 package com.jiang.partnetbackend.…

利用Idea实现Ajax登录(maven工程)

一、新建一个maven工程&#xff08;不会建的小伙伴可以参考Idea引入maven工程依赖(保姆级)-CSDN博客&#xff09;&#xff0c;工程目录如图 ​​​​​​​ js文件可以上up网盘提取 链接&#xff1a;https://pan.baidu.com/s/1yOFtiZBWGJY64fa2tM9CYg?pwd5555 提取码&…

Chatgpt掘金之旅—有爱AI商业实战篇|专业博客|(六)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业博客领域有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随着AI技…

ABBYY FineReader15免费电脑OCR图片文字识别软件

产品介绍&#xff1a;ABBYY FineReader 15 OCR图片文字识别软件 ABBYY FineReader 15是一款光学字符识别&#xff08;OCR&#xff09;软件&#xff0c;专门设计用于将扫描的文档、图像和照片中的文本转换成可编辑和可搜索的格式。这款软件利用先进的OCR技术&#xff0c;能够识别…

递归算法解读

递归&#xff08;Recursion&#xff09;是计算机科学中的一个重要概念&#xff0c;它指的是一个函数&#xff08;或过程&#xff09;在其定义中直接或间接地调用自身。递归函数通过把问题分解为更小的相似子问题来解决原问题&#xff0c;这些更小的子问题也使用相同的解决方案&…

微信小程序短链接工具推荐

现在微信小程序大行其道&#xff0c;但工作中大部分人选择了短链接的方式来推广微信小程序&#xff0c;那么微信小程序短链接工具哪个好?今天就分享一篇从网上看到的关于《微信小程序短链接工具推荐》文&#xff0c;作者是souki&#xff0c;一起来看看吧! 一、缩链 1、生成方…

Memcached 教程之 PHP 连接 Memcached 服务(十)

PHP 连接 Memcached 服务 在前面章节中我们已经介绍了如何安装 Memcached 服务&#xff0c;接下来我们为大家介绍 PHP 如何使用 Memcached 服务。 PHP Memcache 扩展安装 PHP Memcache 扩展包下载地址&#xff1a;PECL :: Package :: memcache&#xff0c;你可以下载最新稳定…

【VASP学习】在Ubuntu系统安装vasp.5.4.4的全过程(包括VASP官方学习资料、安装过程中相关编辑器的配置、VASP的编译及VASP的测试)

在Ubuntu系统安装vasp.5.4.4的全过程 VASP的简介与相关学习资料安装前的准备工作及说明安装过程intel编译器的安装VASP的编译VASP的测试 参考来源 VASP的简介与相关学习资料 VASP(Vienna Ab initio Simulation Package)是基于第一性原理对原子尺度的材料进行模拟计算的软件。比…

【Linux】线程概念及线程互斥

目录 线程概念 线程优点 线程缺点 线程异常 线程系统编程接口 线程创建及终止 线程等待 使用线程系统接口封装一个小型的C线程库并实现一个抢票逻辑 线程互斥 互斥量的接口 线程互斥实现原理 使用系统加锁接口封装LockGuard 实现自动化加锁 线程安全和可重入函数 …

HTML1:html基础

HTML 冯诺依曼体系结构 运算器 控制器 存储器 输入设备 输出设备 c/s(client客户端) 客户端架构软件 需要安装,更新麻烦,不跨平台 b/s(browser浏览器) 网页架构软件 无需安装,无需更新,可跨平台 浏览器 浏览器内核: 处理浏览器得到的各种资源 网页: 结构 HTML(超…

【Rust】生命周期

Rust 生命周期机制是与所有权机制同等重要的资源管理机制。 之所以引入这个概念主要是应对复杂类型系统中资源管理的问题。 引用是对待复杂类型时必不可少的机制&#xff0c;毕竟复杂类型的数据不能被处理器轻易地复制和计算。 但引用往往导致极其复杂的资源管理问题&#x…

Elasticsearch:我们如何演化处理二进制文档格式

作者&#xff1a;来自 Elastic Sean Story 从二进制文件中提取内容是一个常见的用例。一些 PDF 文件可能非常庞大 — 考虑到几 GB 甚至更多。Elastic 在处理此类文档方面已经取得了长足的进步&#xff0c;今天&#xff0c;我们很高兴地介绍我们的新工具 —— 数据提取服务&…

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测

SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现NGO-TCN-BiGRU-Attention北方苍鹰算法优化时间卷积双向门控循环单元融合注意力机制多变量时间序列预测预测效果基本介绍模型…