当前位置: 首页 > news >正文

cwiseMax、cwiseMin函数

一、cwiseMax含义
cwiseMax是Eigen库中的一个函数,用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数,但是可以同时处理多个元素,且支持矩阵和向量。
举例:
例如,对于两个向量a和b,cwiseMax函数可以计算出一个新的向量,其中每个元素都是a和b对应元素的最大值,即:

Eigen::VectorXd a(3);
a << 1, 2, 3;
Eigen::VectorXd b(3);
b << 2, 1, 4;
Eigen::VectorXd c = a.cwiseMax(b);
// c = [2, 2, 4]

同样地,cwiseMin函数可以求两个矩阵或向量的逐元素最小值
二、应用

void PID_Cal::PID_Calc(PID *pid, MatrixXd reference, MatrixXd feedback)
{pid->error = A * (reference - feedback); // 计算新errorpid->error_sum += pid->error; //积分// 位置式PI算法MatrixXd pout = pid->kp * pid->error; // 比例MatrixXd iout = pid->ki * pid->error_sum; // 积分MatrixXd dout= pid->kd * (pid->error - pid->lastError);//微分// 计算输出MatrixXd outMatrix = pout + iout + dout;pid->output += outMatrix;// 输出限幅pid->output = pid->output.cwiseMin(pid->maxOutput).cwiseMax(pid->minOutput);//    //输出限幅
//    for (int i = 0; i < pid->output.rows(); i++) {
//        for (int j = 0; j < pid->output.cols(); j++) {
//            if (pid->output(i, j) > pid->maxOutput) {
//                pid->output(i, j) = pid->maxOutput;
//            } else if (pid->output(i, j) < pid->minOutput) {
//                pid->output(i, j) = pid->minOutput;
//            }
//        }
//    }pid->lastError = pid->error; // 将旧error存起来
}

其中pid->output = pid->output.cwiseMin(pid->maxOutput).cwiseMax(pid->minOutput);
//将矩阵pid->output 中的每个元素限制在pid->minOutput和pid->maxOutput之间,即如果某个元素的值小于pid->minOutput,则将其设置为pid->minOutput,如果某个元素的值大于pid->maxOutput,则将其设置为pid->maxOutput,如果某个元素的值在[pid->minOutput, pid->maxOutput]之间,则不进行任何操作。

比注释掉的代码好处在于:

使用cwiseMin和cwiseMax函数可以将限幅操作向量化,避免了循环中对每个元素进行逐一比较和赋值的操作,因此速度可能会更快。具体的速度优势取决于矩阵的大小和计算机硬件的性能,可以通过实验来测试不同方法的运行时间,以确定哪种方法更快。

另外,使用向量化操作还可以提高代码的可读性和简洁性,避免了循环中的大量重复代码,使代码更加清晰易懂

http://www.lryc.cn/news/359959.html

相关文章:

  • 【thinkphp问题栏】tp5.1重写URL,取消路径上的index.php
  • 缓冲字符流
  • Django中使用Celery和APScheduler实现定时任务
  • Kivy.uix.textinput
  • 基于IoTDB 平台的学习和研究
  • nessus plugins目录为空的问题
  • FDW(Foreign Data Wrapper)
  • Flutter开发指南
  • SpringCloud学习笔记万字整理(无广版在博客)
  • c++(七)
  • SQL语言
  • 【PPT】修改新建文本框默认字体
  • 智能办公本如何选择
  • Spark基础:Scala变量与数据类型
  • php 实现:给图片加文字水印,图片水印,压缩图片
  • 免费实现网站HTTPS访问
  • vue3使用vue3-print-nb打印
  • R语言ggplot2包绘制网络地图
  • php获取今天凌晨零点的时间
  • CATIA进阶操作——创成式曲面设计入门(1)线架设计,三维点、直线、平面、曲线
  • thinkphp6中怎么查看ThinkPHP版本号
  • 第十二章 创建Web客户端
  • 调试记录-RK平台用指令开启ADB功能
  • 奇安信_NAC终端安全准入系统(相关问题整理)
  • 在iPhone上恢复已删除的Safari历史记录的最佳方法
  • 【设计模式深度剖析】【7】【结构型】【享元模式】| 以高脚杯重复使用、GUI中的按钮为例说明,并对比Java类库设计加深理解
  • OceanBase 内存研究(OceanBase 3.2.4.5)
  • 麒麟系统 安装xrdp 远程桌面方法记录
  • 解析Java中1000个常用类:SafeVarargs类,你学会了吗?
  • 【数据挖掘】3σ原则识别数据中的异常值(附代码)