我需要对 Eigen VectorXi 执行操作,这相当于 MATLAB 的 changem():
http://www.mathworks.com/help/map/ref/changem.html
目前,我这样做的方式是遍历数组中的值并使用 switch/case block 执行重新映射。我猜这不是特别有效。
有没有一种使用 Eigen 的快速方法?速度对我的应用程序至关重要。
最佳答案
开关/外壳会特别慢且不灵活。
changem 采用一个矩阵和两个值 vector ,新值和旧值。如果在旧列表中找到一个条目,则将其替换为新列表中的相应条目。所以它本质上会很慢,你需要遍历整个矩阵,搜索旧列表,如果找到条目,则用新列表替换。 你怎么能加快它?首先,不要硬编码为 switch/case。现代编译器可能会优化循环而不是大量跳转,但我不能保证。而且这种方法是不灵活的。 其次,您可以对“旧” vector 进行排序并使用二进制搜索而不是线性搜索。如果旧 vector 很长,那只会有很大帮助。 第三,您可以利用您对矩阵的了解。旧值(value)观是否仅限于某些地区?有没有一个值是绝对有可能的并且可以首先测试?您能否快速排除旧列表中不允许的某些值(太大、太小、不完整)。
旧值是整数吗?可以使用索引吗?或者将其概括为散列。这会比二分查找更快,尽管散列的开销更大。 你能用另一种方法解决这个问题,并按值保留矩阵 xy 坐标的索引吗?
有很多方法。但作为第一步,只需简单地在 C 中简单地实现 Matlab 函数。它可能足够快。
关于c++ - Eigen:高效等同于 MATLAB 的 changem()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39813286/