Почему Eigen делает противоречивые предположения по умолчанию о псевдонимах? - PullRequest
6 голосов
/ 16 мая 2019

Как новичок в Eigen, я с чем-то пытаюсь смириться.

С умножением матрицы Eigen по умолчанию создает временное, чтобы избежать проблем с наложением:

matA = matA * matA; // works fine (Eigen creates a temporary before assigning)

Если можно предположить, что нет псевдонимов, мы можем использовать .noalias() для оптимизации:

matB = matA * matA; // sub-optimal (due to unnecessary temporary)
matB.noalias() = matA * matA; // more efficient

Таким образом, Eigen здесь по умолчанию избегает небезопасных допущений, если явно не сказано, что безопасно предполагать отсутствие псевдонимов. Пока все хорошо.

Однако для многих других выражений, таких как a = a.transpose(), Eigen по умолчанию делает небезопасное предположение (что нет проблем с наложением) и нуждается в явном вмешательстве, чтобы избежать этого небезопасного предположения:

a = a.transpose().eval(); // or alternatively: a.transposeInPlace()

Так что, если мы обеспокоены эффективностью, недостаточно быть осторожным, когда существует потенциальный псевдоним, и недостаточно быть осторожным, когда нет потенциального псевдонима. Мы должны быть осторожны и , когда есть потенциальное алиасирование, и , когда нет потенциального алиасинга, и решить, оправдано ли специальное вмешательство, основываясь на том, включает ли выражение умножение матрицы или не. Есть ли в Eigen какое-то обоснование для этой «смеси ожиданий по умолчанию» в интерфейсе Eigen?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...