我需要在Eigen VectorXi上执行操作,这等效于MATLAB的changem():

http://www.mathworks.com/help/map/ref/changem.html

目前,我这样做的方法是遍历数组中的值,并使用switch / case块执行重新映射。我猜这不是特别有效。

有使用Eigen进行此操作的快速方法吗?速度对于我的应用程序至关重要。

最佳答案

开关/外壳将特别缓慢且不灵活。

changem接受一个矩阵和两个值的向量,新的和旧的。如果在旧列表中找到条目,则将其替换为新列表中的相应条目。因此,它从本质上来说会很慢,您需要遍历整个矩阵,搜索旧列表,如果找到条目,则用新列表替换。
您如何加快速度?首先,不要硬编码为开关/大小写。现代的编译器可能会优化为一个循环,而不是大量的跳转,但是我不能保证。而且这种方法是不灵活的。
其次,您可以对“旧”向量进行排序,并使用二进制搜索而不是线性搜索。如果旧向量较长,那只会有很大帮助。
第三,您可以利用对矩阵的了解。旧价值观是否局限于某些地区?有没有一个压倒性的价值可以首先测试?您可以快速排除旧列表中不允许的某些值吗(太大,太小,不完整)。

旧值是整数吗,您可以使用索引吗?或将其概括为哈希。这将比二进制搜索甚至更快,但是散列的开销更大。
您能否以其他方式解决问题,并按值保留矩阵xy坐标的索引?

有很多方法。但第一步只是简单地在C中天真地实现Matlab函数。它可能足够快。

09-06 11:10