没有从“const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<double>,Eigen::Array<double,-1,1,0,-1,1>>”到“const Eigen::Block<const Derived,-1,1,true>”的转换 with [ Derived=Eigen::Array<double,-1,-1,0,-1,-1> ] ..\octDemo\algorithm.cpp(365): note: 没
时间: 2024-03-16 18:41:27 浏览: 99
这个错误的原因是在使用select()方法时,第一个参数应该是一个与被选择矩阵相同形状的矩阵,而不是一个标量值。因此,需要使用一个形状相同的矩阵来代替0。下面是修正后的代码:
```cpp
#include <Eigen/Core>
#include <cmath>
Eigen::ArrayXXd crop_pointcloud(Eigen::ArrayXXd data_crop, double x_o, double y_o, double x_i, double y_i, double R_o, double R_i, int z_critical)
{
const int range_z = 400;
const double K_o = std::pow(R_o, 2) / range_z;
const double K_i = std::pow(R_i, 2) / range_z;
for (int z = 0; z < range_z; ++z)
{
const double r_o = std::sqrt(z * K_o);
Eigen::ArrayXXd data_layer = data_crop.block(0, 0, data_crop.rows(), data_crop.cols()).col(z);
const double d_o = std::sqrt(std::pow(x_o, 2) + std::pow(y_o, 2));
const double d_i = std::sqrt(std::pow(x_i, 2) + std::pow(y_i, 2));
double r_i = 0;
if (z >= z_critical)
{
r_i = std::sqrt(z * K_i);
}
Eigen::ArrayXXd mask = Eigen::ArrayXXd::Zero(data_layer.rows(), data_layer.cols());
data_crop.block(0, 0, data_crop.rows(), data_crop.cols()).col(z) = (d_o > r_o || d_i <= r_i).select(mask, data_layer);
}
return data_crop;
}
```
在这个修正后的版本中,我们使用Eigen::ArrayXXd::Zero()方法创建了一个与数据层相同形状的矩阵,并将其用作select()方法的第一个参数。
阅读全文