Как новичок в 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?