我需要在Eigen VectorXi上执行一个操作,这相当于MATLAB的changem():
http://www.mathworks.com/help/map/ref/changem.html
目前,我这样做的方法是循环遍历数组中的值并使用switch / case块执行重映射。我猜这不是特别有效。
有没有一种快速的方法可以用Eigen做到这一点?速度对我的应用至关重要。
答案 0 :(得分:1)
开关/外壳将特别慢且不灵活。
changem采用矩阵和两个值的向量,新旧。如果在旧列表中找到条目,则它将被新列表中的相应条目替换。因此它本身会变得相当慢,你需要传递整个矩阵,搜索旧列表,如果找到并输入了条目,则用新列表替换。 你怎么能加快速度呢?首先,不要将硬编码作为开关/案例。现代编译器可能会优化循环而不是大量跳转,但我不能保证它。这种方法不灵活。 其次,你可以对" old"矢量并使用二进制搜索而不是线性搜索。只有旧矢量很长时,这才会有很大帮助。 第三,您可以利用您对矩阵的了解。旧的价值是否局限于某些地区?是否有一个绝对可能的值,可以先测试?您能否快速排除旧列表中不允许的某些值(太大,太小,不是整数)。
旧值是否为整数,是否可以使用索引?或者将其概括为散列。这比二进制搜索更快,但散列的开销更大。 你能用另一种方法解决问题,并按值保持矩阵xy坐标的索引吗?
有很多方法。但是只需在C中天真地实现Matlab函数作为第一步。它可能足够快。