论坛网站怎么做跳转,百度云主机做网站,wordpress鼠标点击,常州网上挂号预约平台一、cwiseMax含义 cwiseMax是Eigen库中的一个函数#xff0c;用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数#xff0c;但是可以同时处理多个元素#xff0c;且支持矩阵和向量。 举例#xff1a; 例如#xff0c;对于两个向量a和b#xff0c;cwiseMax…一、cwiseMax含义 cwiseMax是Eigen库中的一个函数用于求两个矩阵或向量的逐元素最大值。它的作用类似于std::max函数但是可以同时处理多个元素且支持矩阵和向量。 举例 例如对于两个向量a和bcwiseMax函数可以计算出一个新的向量其中每个元素都是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函数可以将限幅操作向量化避免了循环中对每个元素进行逐一比较和赋值的操作因此速度可能会更快。具体的速度优势取决于矩阵的大小和计算机硬件的性能可以通过实验来测试不同方法的运行时间以确定哪种方法更快。
另外使用向量化操作还可以提高代码的可读性和简洁性避免了循环中的大量重复代码使代码更加清晰易懂