2016-10-02 4 views
0

Я необходимость выполнить операцию на Эйген VectorXi, что эквивалентно changem MATLAB (в):Eigen: Эффективный эквивалент изменения MATLAB()?

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

На данный момент, как я делаю это цикл по значениям в массиве и выполняет переназначение с помощью блока switch/case. Я предполагаю, что это не особенно эффективно.

Есть ли быстрый способ сделать это с помощью Eigen? Скорость очень важна для моего приложения.

ответ

1

Переключатель/корпус будет особенно медленным и негибким.

changm принимает матрицу и два вектора значений, новые и старые. Если запись найдена в старом списке, она заменяется соответствующей записью в новом списке. Таким образом, это по своей сути будет довольно медленным, вам нужно передать всю матрицу, выполнить поиск в старом списке, и если и запись найдена, замените ее новым списком. Как вы можете ускорить его? Во-первых, не перекодируйте в качестве переключателя/случая. Современный компилятор, возможно, оптимизирует цикл, а не много прыжков, но я бы не стал его гарантировать. И этот подход негибкий. Во-вторых, вы можете сортировать «старый» вектор и использовать двоичный поиск, а не линейный. Это значительно поможет, если старый вектор длинный. В-третьих, вы можете воспользоваться тем, что знаете о матрице. Сохраняются ли старые ценности в определенных регионах? Есть ли одно значение, которое в большинстве случаев вероятнее всего и может быть проверено для первого? Можете ли вы быстро исключить некоторые значения, которые не разрешены в старом списке (слишком большой, слишком маленький, а не интегральный).

Являются ли старые значения целыми числами и вы можете использовать индексирование? Или обобщите это на хеширование. Это было бы даже быстрее, чем двоичный поиск, хотя с большим количеством накладных расходов для хэширования. Можете ли вы решить проблему другим способом и сохранить индекс матрицы xy по значению?

Существует множество подходов. Но просто реализуем функцию Matlab наивно в C как первый шаг. Это может быть достаточно быстро.

+0

Спасибо за ваш комментарий. Я закончил тем, что просто выполнил это как таблицу поиска, так как существует только 8 возможных значений (однако векторы, которые я хочу выполнить для свопа, довольно велики - тысячи элементов). Тем не менее, избавляясь от переключателя/случая и некоторой осторожной реализации, он теперь в 10 раз быстрее. – NOP