def crop_pointcloud(data_crop, x_o, y_o, x_i, y_i, R_o, R_i, z_critical): K_o = R_o ** 2 / range_z K_i = R_i ** 2 / range_z for z in range(range_z): r_o = np.sqrt(z * K_o) data_layer = data_crop[:, :, z] d_o = np.sqrt(x_o ** 2 + y_o ** 2) d_i = np.sqrt(x_i ** 2 + y_i ** 2) if z < z_critical: r_i = 0 else: r_i = np.sqrt(z * K_i) data_crop[:, :, z] = np.where((d_o > r_o) | (d_i <= r_i), 0, data_layer) return data_crop 转C++ data_crop的数据类型为Eigen::Tensor<uint8_t, 3, Eigen::RowMajor>
时间: 2024-03-20 19:40:24 浏览: 60
Crop_it.zip_I AM
以下是将给定的 Python 代码转换为 C++ Eigen 的代码,其中 `Eigen::Tensor<uint8_t, 3, Eigen::RowMajor>` 表示一个动态大小的三维张量,数据类型为 `uint8_t`,存储顺序为行优先。
```cpp
#include <cmath>
#include <Eigen/Tensor>
Eigen::Tensor<uint8_t, 3, Eigen::RowMajor> crop_pointcloud(Eigen::Tensor<uint8_t, 3, Eigen::RowMajor> data_crop, double x_o, double y_o, double x_i, double y_i, double R_o, double R_i, int range_z, double z_critical) {
double K_o = std::pow(R_o, 2) / range_z;
double K_i = std::pow(R_i, 2) / range_z;
for (int z = 0; z < range_z; ++z) {
double r_o = std::sqrt(z * K_o);
Eigen::Tensor<uint8_t, 2, Eigen::RowMajor> data_layer = data_crop.chip(z, 2);
double d_o = std::sqrt(std::pow(x_o, 2) + std::pow(y_o, 2));
double d_i = std::sqrt(std::pow(x_i, 2) + std::pow(y_i, 2));
double r_i = (z < z_critical) ? 0 : std::sqrt(z * K_i);
data_crop.chip(z, 2) = (d_o > r_o) || (d_i <= r_i) ? Eigen::Tensor<uint8_t, 2, Eigen::RowMajor>::Zero(data_layer.dimensions()) : data_layer;
}
return data_crop;
}
```
其中,`.chip` 表示提取一个张量的某个维度,`.dimensions` 表示获取张量的维度,`Eigen::Tensor<uint8_t, 2, Eigen::RowMajor>::Zero` 表示一个指定大小的全零张量。
阅读全文