矩阵运算提速——玩转opencv::Mat
介绍:用Eigen或opencv::Mat进行矩阵的运算,比用cpp的vector或vector进行矩阵运算要快吗?
使用 Eigen 或 OpenCV 的 cv::Mat
进行矩阵运算通常比使用 std::vector<int>
或 std::vector<double>
更快。这主要有以下几个原因:
-
优化的底层实现:Eigen 和 OpenCV 都是为高效的矩阵运算而设计的库,内部实现了许多优化,例如使用 SIMD(单指令多数据)指令、并行计算等。这些优化可以显著提高计算速度。
-
内存布局:Eigen 和 OpenCV 在内存布局上进行了优化,通常使用连续的内存块来存储矩阵数据,这样可以提高缓存命中率,从而加快访问速度。
-
专用的算法:这些库提供了许多专用的算法和函数,能够高效地执行常见的矩阵运算(如乘法、求逆、特征值分解等),而使用
std::vector
进行这些操作时,通常需要手动实现算法,效率较低。 -
类型安全和表达能力:Eigen 提供了强类型的矩阵和向量类,能够在编译时进行更多的检查,减少运行时错误,同时也使得代码更易于阅读和维护。
因此,如果你的应用涉及大量的矩阵运算,建议使用 Eigen 或 OpenCV 这样的专用库,而不是直接使用 std::vector
。
构造
link1
索引
访问Mat的通道数
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 创建一个3通道的彩色图像(例如,BGR格式)cv::Mat colorImage = cv::Mat::zeros(100, 100, CV_8UC3);// 创建一个单通道的灰度图像cv::Mat grayImage = cv::Mat::zeros(100, 100, CV_8UC1);// 获取通道数int colorChannels = colorImage.channels();int grayChannels = grayImage.channels();// 输出通道数std::cout << "彩色图像的通道数: " << colorChannels << std::endl; // 应该输出3std::cout << "灰度图像的通道数: " << grayChannels << std::endl; // 应该输出1return 0;
}
定义4维Mat
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 定义4维矩阵,大小为2x3x4x5,数据类型为CV_32F(32位浮点数)cv::Mat mat4D(2, new int[4]{3, 4, 5}, CV_32F);// 填充矩阵for (int i = 0; i < 2; ++i) {for (int j = 0; j < 3; ++j) {for (int k = 0; k < 4; ++k) {for (int l = 0; l < 5; ++l) {mat4D.at<float>(i, j, k, l) = static_cast<float>(i * 1000 + j * 100 + k * 10 + l);}}}}// 输出矩阵的形状和内容std::cout << "4维矩阵的大小: " << mat4D.size << std::endl;std::cout << "4维矩阵的内容:" << std::endl;for (int i = 0; i < 2; ++i) {for (int j = 0; j < 3; ++j) {for (int k = 0; k < 4; ++k) {for (int l = 0; l < 5; ++l) {std::cout << mat4D.at<float>(i, j, k, l) << " ";}std::cout << std::endl;}std::cout << std::endl;}}// 释放动态分配的内存delete[] mat4D.size;return 0;
}
取某一行
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 创建一个 3x3 的矩阵cv::Mat mat = (cv::Mat_<float>(3, 3) << 1, 2, 3,4, 5, 6,7, 8, 9);// 获取第 3 行(索引为 2)的所有元素cv::Mat thirdRow = mat.row(2); // 行索引从 0 开始// 输出结果std::cout << "第三行的元素是:" << std::endl;std::cout << thirdRow << std::endl;return 0;
}
提取块
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 创建一个 5x5 的矩阵cv::Mat mat = (cv::Mat_<float>(5, 5) << 1, 2, 3, 4, 5,6, 7, 8, 9, 10,11, 12, 13, 14, 15,16, 17, 18, 19, 20,21, 22, 23, 24, 25);// 定义要提取的块的起始位置和大小int startRow = 1; // 起始行索引int startCol = 1; // 起始列索引int blockRows = 3; // 块的行数int blockCols = 3; // 块的列数// 提取块cv::Mat block = mat(cv::Range(startRow, startRow + blockRows), cv::Range(startCol, startCol + blockCols));// 输出结果std::cout << "提取的块是:" << std::endl;std::cout << block << std::endl;return 0;
}
访问某行某列的元素
在C++中,使用OpenCV库的cv::Mat类来表示图像或矩阵。要访问cv::Mat中的特定行和列的元素,可以使用at(row, col)方法,其中type是元素的数据类型。
#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 创建一个3x3的矩阵,类型为CV_8UC1(单通道8位无符号整数)cv::Mat mat = (cv::Mat_<uchar>(3, 3) << 1, 2, 3,4, 5, 6,7, 8, 9);// 输出整个矩阵std::cout << "矩阵内容:\n" << mat << std::endl;// 访问特定行和列的元素int row = 1; // 第二行(索引从0开始)int col = 2; // 第三列(索引从0开始)// 使用at方法访问元素uchar value = mat.at<uchar>(row, col);std::cout << "元素在 (" << row << ", " << col << ") 的值: " << (int)value << std::endl;// 修改特定行和列的元素mat.at<uchar>(row, col) = 10;std::cout << "修改后的矩阵内容:\n" << mat << std::endl;return 0;
}
示例输出:
矩阵内容:
[1, 2, 3;
4, 5, 6;
7, 8, 9]
元素在 (1, 2) 的值: 6
修改后的矩阵内容:
[1, 2, 3;
4, 5, 10;
7, 8, 9]
运算
矩阵乘法和Hamornoid积
#include <iostream>
#include <opencv2/opencv.hpp>int main() {// 创建两个相同维度的矩阵cv::Mat mat1 = (cv::Mat_<float>(2, 2) << 1, 2,3, 4);cv::Mat mat2 = (cv::Mat_<float>(2, 2) << 5, 6,7, 8);// 输出原始矩阵std::cout << "矩阵1:\n" << mat1 << std::endl;std::cout << "矩阵2:\n" << mat2 << std::endl;// 方法1:使用 cv::multiplycv::Mat result1;cv::multiply(mat1, mat2, result1);std::cout << "矩阵乘法 (使用 cv::multiply):\n" << result1 << std::endl;// 方法2:使用 cv::mulcv::Mat result2 = mat1.mul(mat2); // 也可以使用 result2 = mat1 * mat2;std::cout << "矩阵乘法 (使用运算符 *):\n" << result2 << std::endl;// 方法3:使用运算符 *cv::Mat result3 = mat1*mat2; // 也可以使用 result2 = mat1 * mat2;std::cout << "逐元素相乘结果 (使用运算符 *):\n" << result3 << std::endl;return 0;
}
类型一致
- opencv::Mat之间的加减乘除必须保证类型相同
- 比如cv::divide()运算
cv::divide(new_cen, cen_index[cen_id].size(), new_cen);
- opencv::Mat的类型有如下几种:
* 可在初始化时指定
Mat new_cen=Mat::zeros(1,128,CV_32FC1);
opencv::Mat是继承Eigen的实现吗?
cv::Mat
并不是继承自Eigen库的实现。OpenCV和Eigen是两个独立的库,它们各自有自己的数据结构和实现方式。
OpenCV的cv::Mat
:
cv::Mat
是OpenCV中用于表示图像和矩阵的主要数据结构。它提供了多种功能,包括图像处理、矩阵运算、图像读取和写入等。cv::Mat
支持多维数组,能够处理不同的数据类型(如8位无符号整数、浮点数等),并且可以表示单通道和多通道图像(如RGB图像)。- OpenCV的设计目标是高效处理图像和视频数据,特别是在计算机视觉和图像处理领域。
Eigen库:
- Eigen是一个用于线性代数的C++模板库,提供了矩阵和向量的高效操作。它专注于数学运算,特别是线性代数、几何变换和数值计算。
- Eigen的设计目标是提供高性能的数学运算,同时保持易用性和灵活性。
结论:
虽然OpenCV和Eigen都涉及矩阵和线性代数的概念,但它们是独立的库,cv::Mat
并不继承自Eigen的实现。实际上,OpenCV和Eigen可以一起使用,开发者可以在OpenCV中处理图像数据,然后使用Eigen进行更复杂的数学运算,或者反之亦然。两者之间的结合可以利用各自的优势。
相关文章:
矩阵运算提速——玩转opencv::Mat
介绍:用Eigen或opencv::Mat进行矩阵的运算,比用cpp的vector或vector进行矩阵运算要快吗? 使用 Eigen 或 OpenCV 的 cv::Mat 进行矩阵运算通常比使用 std::vector<int> 或 std::vector<double> 更快。这主要有以下几个原因: 优化的底层实现…...
vue请求后端需要哪些问题
在使用 Vue 前端框架请求后端服务时,需要考虑和解决的问题有很多。以下是一个详细的讲解: 1. **API 设计与文档** - **明确 API 端点**:了解后端提供的 API 端点(URL),包括资源的路径和操作方法(…...
QML Image详解
1. 概述 Image 是 QML 中用于显示图片的基本组件。它允许开发者加载和显示各种格式的图像文件(如 PNG, JPEG, GIF 等),并提供了多种配置选项来控制图片的显示方式和行为。Image 元素支持各种图像处理功能,比如缩放、裁剪、模糊等…...
Chapter4.1 Coding an LLM architecture
文章目录 4 Implementing a GPT model from Scratch To Generate Text4.1 Coding an LLM architecture 4 Implementing a GPT model from Scratch To Generate Text 本章节包含 编写一个类似于GPT的大型语言模型(LLM),这个模型可以被训练来生…...
Linux 端口知识全解析
Linux 端口知识全解析 在 Linux 系统的网络世界里,端口如同一个个小小的“窗口”,数据的进出都依赖它们有条不紊地运作。理解 Linux 端口知识,无论是对于系统管理员排查网络故障,还是开发者进行网络编程,都至关重要。…...
《Armv8-A virtualization》学习笔记
1.MAIR 的全称是 Memory Attribute Indirection Register。它是ARM架构中的一种寄存器,用于定义内存的属性,并提供一种间接访问内存属性的机制。MAIR寄存器包含多个字段,这些字段指示不同类型内存的属性,例如是否可以缓存、是否为…...
23. 【.NET 8 实战--孢子记账--从单体到微服务】--记账模块--预算
在每个月发工资后很多人会对未来一个月的花销进行大致的计划,这个行为叫做预算。那么在这篇文章中我们将一起开发预算服务。 一、需求 预算需求就是简单的增删改查,虽然比较简单,但是也有几点需要注意。 编号需求说明1新增预算1. 针对每种…...
DOS攻击的原理和实现 (网络安全)hping3和Slowloris的运用
DoS攻击的原理和实现 DoS攻击(Denial of Service Attack,拒绝服务攻击)是指通过恶意手段使目标服务器、服务或网络资源无法正常提供服务,从而影响正常用户的访问。DoS攻击通常通过消耗目标系统的资源(如带宽、内存、处…...
十三、Vue 过渡和动画
文章目录 一、Vue过渡和动画概述1. 过渡的基本原理2. 动画的基本原理二、使用 CSS 过渡1. 单元素过渡2. 过渡模式in - out 模式out - in 模式三、使用 CSS 动画1. 单元素动画2. 动画结合过渡四、JavaScript 钩子函数实现过渡和动画1. 基本概念2. 示例五、列表过渡1. 基本原理2.…...
Dubbo 关键知识点解析:负载均衡、容错、代理及相关框架对比
1.Dubbo 负载均衡策略? Dubbo 是一个分布式服务框架,它提供了多种负载均衡策略来分发服务调用。在 Dubbo 中,负载均衡的实现是基于客户端的,即由服务消费者(Consumer)端决定如何选择服务提供者(…...
仿生的群体智能算法总结之三(十种)
群体智能算法是一类通过模拟自然界中的群体行为来解决复杂优化问题的方法。以下是30种常见的群体智能算法,本文汇总第21-30种。接上文 : 编号 算法名称(英文) 算法名称(中文) 年份 作者 1 Ant Colony Optimization (ACO) 蚁群优化算法 1991 Marco Dorigo 2 Particle Swar…...
《量子比特大阅兵:不同类型量子比特在人工智能领域的优劣势剖析》
在科技的前沿,量子比特与人工智能的融合正开启一扇全新的大门。不同类型的量子比特,如超导、离子阱、光量子等,在与人工智能结合时展现出独特的优势与劣势。 超导量子比特 超导量子比特是目前应用较为广泛且研究相对成熟的量子比特类型。它…...
el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
需求:一个输入框字段需要支持多次输入,最后传输给后台的字段值以逗号分割 解决方案:结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...
机器人领域的一些仿真器
模拟工具和环境对于开发、测试和验证可变形物体操作策略至关重要。这些工具提供了一个受控的虚拟环境,用于评估各种算法和模型的性能,并生成用于训练和测试数据驱动模型的合成数据。 Bullet Physics Library 用于可变形物体模拟的一个流行的物理引擎是 B…...
前端-动画库Lottie 3分钟学会使用
目录 1. Lottie地址 2. 使用html实操 3. 也可以选择其他的语言 1. Lottie地址 LottieFiles: Download Free lightweight animations for website & apps.Effortlessly bring the smallest, free, ready-to-use motion graphics for the web, app, social, and designs.…...
腾讯云智能结构化 OCR:驱动多行业数字化转型的核心引擎
在当今数字化时代的汹涌浪潮中,数据已跃升为企业发展的关键要素,其高效、精准的处理成为企业在激烈市场竞争中脱颖而出的核心竞争力。腾讯云智能结构化 OCR 技术凭借其前沿的科技架构与卓越的功能特性,宛如一颗璀璨的明星,在交通、…...
【开源免费】基于SpringBoot+Vue.JS精品在线试题库系统(JAVA毕业设计)
本文项目编号 T 115 ,文末自助获取源码 \color{red}{T115,文末自助获取源码} T115,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
c# CodeFirst生成表字段加注释
前置:ORM框架工具使用的FreeSql 背景:开发环境中运行接口,所有的表字段以及备注会自动加上,但是在测试环境时运行就只生成了表,没有把每个字段的注释加上 问题检查: FreeSql CodeFirst 支持将 c# 代码内的注…...
MySQL8.0复制原理和部署配置步骤
1. mysql 主从复制原理 在从库上执行change master to;会将主库的信息保存到从库中的master.info文件中在从库执行start slave;开启io_thread, sql_thread线程;io_thread工作;io_thread通过master.info文件中主库的连接信息去连接主库;连接成…...
Unity热更新文件修改后缀并拷贝到指定路径的工具类
最近在学习Hybrid热更新。每次编译完,需要修改后缀名和拷贝到特定路径覆盖旧文件,就叫AI写了个工具类。现在记录一下,毕竟ai写完还需要修改。 代码如下,放到Assets/Editor/路径下即可。 可根据需求自行改变路径和文件名。 using…...
前端vue+el-input实现输入框中文字高亮标红效果(学习自掘金博主文章)
学习自掘金文章https://juejin.cn/post/7295169886177918985 该博主的代码基于原生textarea控件和js实现,基于该博主的代码和思路,在vue下实现了相应功能 思路 生成html字符串来实现文字高亮标红效果,但是input输入控件不能渲染html字符串…...
SAP系统中的标准价、移动平均价是什么?有何区别?物料分类账的优点
文章目录 前言一、SAP系统中的价格控制二、移动平均价、标准价是什么?三、S价(标准价)的优势四、S价(标准价)的劣势五、V价(移动平均价)的优势六、V价(移动平均价)的劣势…...
通往O1开源之路
“Scaling of Search and Learning: A Roadmap to Reproduce o1 from Reinforcement Learning Perspective”由复旦大学和上海人工智能实验室的研究者撰写。该论文从强化学习视角出发,深入分析了实现类似OpenAI o1模型性能的路线图,聚焦于策略初始化、奖…...
【QT】实现RestFul接口
在这个教程中,我们将介绍如何在 Qt 中使用 QHttpServer 类来创建一个简单的 HTTP 服务器。QHttpServer 是 Qt 6 引入的新类,用于提供 HTTP 服务。这个类非常适合快速开发restful接口。 准备工作 确保你的 Qt 版本是 Qt 6 或更高版本,因为 Q…...
ARP攻击的原理和实现 (网络安全)
ARP攻击的原理和实现 ARP(Address Resolution Protocol,地址解析协议)是一种网络协议,用于在局域网内将IP地址映射到MAC地址。在以太网中,设备通过广播ARP请求来查询目标IP地址对应的MAC地址,从而建立通信…...
大脑特训,自信 “满格”
编辑:念小艺 在追求自信的漫漫长路上,诸多因素如同闪耀的星光,为人们指引着方向。保持良好的饮食习惯,让身体摄取充足且均衡的营养,为精神的饱满提供坚实后盾;持续投身于锻炼之中,在挥洒汗水的…...
如何备份和恢复 PostgreSQL 数据库 ?
对于数据库管理员和开发人员来说,在 PostgreSQL 中创建数据库副本是一项至关重要的任务。此过程对于测试、备份、数据分析等都是必不可少的。在本指南中,我们将深入研究创建 PostgreSQL 数据库副本的步骤,以确保数据完整性和系统性能。 必要…...
逆向入门(6)汇编篇-外挂初体验
代码分析部分 游戏里面还是体验了不少自己CV来的外挂的,自己编写的程序还是头一次体验,程序源码如下 void startAcctack() {printf("开始攻击\n");// 获取当前系统时间time_t now time(0); // 获取当前时间的时间戳struct tm *local_time …...
HTML——77.网页编码及乱码处理
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>网页编码及乱码处理</title></head><body><!--网页编码:指网页中特定的字符编码,通过解析编码成为我们知道的文字--><!-…...
(leetcode算法题)382. 链表随机节点
如果给你一个 智能记录 k行内容的小笔记本,从一本你也不知道有多少行的 C Primer 中进行摘抄,你应该怎么做才能让抄写的时候能让书中的每一行都等概率的出现在小笔记本中? 答:准备好一个公平的轮盘和一个巨大的摇奖机,…...
Git 如何在IDEA中进行使用
1. 2. 3....
【Pytorch报错】AttributeError: cannot assign module before Module.__init__() call
代码: import torch.nn as nnclass Model(nn.Module):def __init__(self, input_dim, output_dim):self.linear nn.Linear(input_dim, output_dim) def forward(self, x):out self.linear(x)return outmodel Model(1, 1)报错: --------------------…...
深入理解计算机系统—虚拟内存(一)
一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成特殊的挑战。随着对 CPU 需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。 为了更加有效地管理内…...
[Qt] 输入控件 | Line | Text | Combo | Spin | Date | Dial | Slider
目录 输入类控件 1、Line Edit 录入个人信息 使用正则表达式验证输入框的数据 验证两次输入的密码一致 切换显示密码 2、Text Edit 获取多行输入框的内容 验证输入框的各种信号 3、Combo Box 使用下拉框模拟麦当劳点餐 从文件中加载下拉框的选项 4、Spin Box 调整…...
【信息系统项目管理师】高分论文:论信息系统项目的风险管理(数字化联合审查管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文一、全盘考虑,编制项目风险管理计划二、务实高效,做好项目的风险识别三、客观严谨,进行定性风险分析四、客观严谨,进行定量风险分析五、未雨绸缪,做好规划风险应对六、控制执行,实施风险应对七、做好…...
设计模式 结构型 外观模式(Facade Pattern)与 常见技术框架应用 解析
外观模式(Facade Pattern)是一种结构型设计模式,它的核心思想是将一个复杂的子系统封装在一个外观类中,为子系统提供一个统一的接口。通过这个接口,客户端可以简化对子系统的访问,而无需直接与子系统中的各…...
《learn_the_architecture_-_generic_interrupt_controller_v3_and_v4__lpisn》学习笔记
1.LPI(Locality-specific Peripheral Interrupts)是一种基于消息的中断(Message Signaled Interrupt,MSI),由中断翻译服务(ITS)提供翻译。这是因为LPI的设计目标是为系统中大量的设备提供高效的中断管理&am…...
java 常量池详解
目录 java 常量池详解一 静态常量池(Static Constant Pool)1.1 概述1.2 存储内容1.3 特点1.4 示例 二 运行时常量池(Runtime Constant Pool)2.1 概述2.2 存储内容2.3 特点2.4 示例 三 基础类型常量池(Primitive Type C…...
aardio —— 虚表 —— 模拟属性框
写了个简单的属性框例程,抛砖引玉,期待你做出更丰富强大的功能。 可折叠行、可输入文本、可下拉选择、支持下拉选择图片、颜色等功能。 只有想不到,没有做不到,发挥你的想象力吧。 import win.ui; import godking.comboboxEx im…...
企业微信——智能表格学习
智能表格 应用限制条件 获取 token https://developer.work.weixin.qq.com/document/10013#%E5%BC%80%E5%8F%91%E6%AD%A5%E9%AA%A4 开发步骤 你可以通过以下步骤,使用access_token来访问企业微信的接口。需要注意的是,所有的接口需使用Https协议、Js…...
2501d,jingo优化
原文 大家好,我重构和优化了一下jin.go这里: 我去掉了vibe.d依赖,因为它又慢又大,而且我无法与2版本交朋友.当仅运行1000个vibe纤程时,不仅应用崩溃,甚至图形系统驱动也崩溃一次,这需要重启笔记本电脑. 当前,我用小栈大小的本地流(4kb)解决. 我真很期待photon的稳定性,以恢复支…...
实景三维点云处理专业软件ArcGIS根据DSM生成地表点云集
常见的实景三维处理软件及其特色功能如下: 一、专业实景三维建模软件 Agisoft Metashape 高精度建模:能够生成高精度的三维模型,精度可以达到厘米级甚至毫米级,适用于需要详细测量和分析的项目,如文物保护和建筑测量。…...
山东大学人工智能导论期末复习概念汇总
人工智能概念汇总V2 —Nevertheless 简介 [!NOTE] 本文是在原版的基础上,面向期末而进行的删减版本 建议使用pdf版本,排版和图片显示完全。如有需要,可私信发送邮箱地址 PDF版本: 山东大学人工智能导论概念汇总pdf版 山东大学软…...
Ubuntu下安装Android Sdk
下载android sdk命令行工具 https://developer.android.com/studio?hlzh-cn#command-tools mkdir android-sdk cd android-sdk unzip commandlinetools-linux-11076708_latest.zip 添加环境变量到~/.bashrc export ANDROID_HOME$HOME/android-sdk export PATH$PATH:$ANDRO…...
c语言中GHashTable的使用
前言:最近在c代码中需要用到键值对的存储,由于没有map,需要自己实现或者使用库函数,g_hash_table_new是GLib中的库函数,但使用起来会有很多坑,记录一下 构建hash表g_hash_table_new GHashTable* g_hash_table_new(GH…...
Conda清理缓存
参考:1、2...
【每日学点鸿蒙知识】导入cardEmulation、自定义装饰器、CallState状态码顺序、kv配置、签名文件配置
1、HarmonyOS 无法导入cardEmulation? 在工程entry mudule里的index.ets文件里导入cardEmulation失败 可以按照下面方式添加SystemCapability;在src/main/syscap.json(此文件需要手动创建)中添加如下内容 {"devices": {"gen…...
【从零开始入门unity游戏开发之——C#篇42】C#补充知识——随机数(Random)、多种方法实现string字符串拼接、语句的简写
文章目录 一、随机数1、Random.Next()生成随机整数示例:生成一个随机整数生成指定范围内的随机整数 2、Random.NextSingle生成随机浮点数示例:生成随机浮点数 3、 生成随机字母或字符示例:生成随机字母示例:生成随机小写字母 二、…...
深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...
《Vue3实战教程》35:Vue3测试
如果您有疑问,请观看视频教程《Vue3实战教程》 测试 为什么需要测试 自动化测试能够预防无意引入的 bug,并鼓励开发者将应用分解为可测试、可维护的函数、模块、类和组件。这能够帮助你和你的团队更快速、自信地构建复杂的 Vue 应用。与任何应用一…...