特征:累积可变大小的数组
Eigen: Accumulating arrays of variable size
我有一个保存 Eigen::Array 数据数组的类和一个通过沿第一个轴附加到数组来添加新数据(行数可能会有所不同(的方法。我通过创建一个大小合适的新数组并使用旧数据和新数据初始化它来解决累积问题。
typedef Eigen::Array<double, Eigen::Dynamic, 3> DataArray
class Accumulator {
void add(DataArray &new_data) {
DataArray accu(accumulated_data_.rows() + new_data.rows(), 3)
accu << accumulated_data_, new_data;
accumulated_data_ = accu;
}
DataArray accumulated_data_;
}
这样做有什么不对吗?还是首选调整累积数据数组的大小:
-
.resize()
和复制新旧 - 或
.conservative_resize()
并复制新数据(如果新数据超过 1 行,则需要进行块操作(
首先,当前实现存在两个易于修复的缺陷:
-
默认情况下,Eigen 以列主顺序存储数组(和矩阵(,因此如果要追加行,则应首选
RowMajor
存储顺序:Eigen::Array<double, Eigen::Dynamic, 3, Eigen::RowMajor>
-
由于
accu
将不再使用,因此应将其移至累加器:accumulated_data_ = std::move(accu);
如果您使用的是 C++11 之前的版本,您还可以交换数据:
accumulated_data_.swap(accu);
那么你的方法几乎等同于
accumulated_data_.conservativeResize(accumulated_data_.rows() + new_data.rows(), 3);
accumulated_data_.bottomRows(new_data.rows()) = new_data;
在每次调用时,您仍将拥有内存(重新(分配和内存副本。
更有效的方法是仅偶尔调整accumulated_data_
的大小(理想情况下仅在开始时调整一次(,并跟踪当前实际有效的内容:
typedef Eigen::Array<double, Eigen::Dynamic, 3, Eigen::RowMajor> DataArray;
class Accumulator {
public:
Accumulator(Eigen::Index initialCapacity=10000) : accumulated_data_(initialCapacity, 3), actual_rows_(0) {}
void add(DataArray &new_data) {
if(actual_rows_+new_data.rows() > accumulated_data_.rows())
{ // TODO adapt memory-growing to your use case
accumulated_data_.conservativeResize(2*actual_rows_+new_data.rows(), 3);
}
accumulated_data_.midRows(actual_rows, new_data.rows()) = new_data;
actual_rows_+=new_data.rows();
}
DataArray accumulated_data_;
Eigen::Index actual_rows_;
};
相关文章:
- 具有 2 个分量的数组的特征映射到 3 的向量
- 特征 3 方形数组除以列数组
- 计算数组的特征值/向量,而不是使用特征 3 计算矩阵
- 特征获取索引数组,其中向量中的值为真(不需要循环)
- 消除中间特征数组
- 特征:从数组类型中获取标量类型是否记录?
- 来自 2D 数组的特征图
- C++ char 数组特征:为什么字符串在数组结束之前停止?
- 将特征数组行保存在变量中
- 特征:累积可变大小的数组
- 为什么我不能将 op 结果乘以常量特征张量数组
- C++特征动态大小矩阵的数组
- 蓝牙LE:设置字节数组的特征会发送错误的值
- 特征:将数组映射到矩阵大小未知的矩阵
- 将特征向量复制到 C 数组
- 如何在特征中对二维数组的列执行简单的算术运算
- 如何将数据从数组复制到C++特征矩阵或向量
- 将数组复制C++作为特征矩阵的向量
- 在带有单元格数组的C 特征矩阵和MATLAB MXARRAY之间传递数据
- 数组特征导致模板参数推断失败