log10 из Vector3f (собственные библиотеки)

Мне нужно рассчитать log10 Vector3f. Я пытался:

Eigen::Vector3f valsingn = svd.singularValues()/svd.singularValues()(0);
valsingn = valsingn.log10();

Но это не работает.

main.cpp:145:27: error: ‘Eigen::Vector3f {aka class Eigen::Matrix<float, 3, 1>}’ has no member named ‘log10’; did you mean ‘log’?
     valsingn = valsingn.log10();

Есть ли способ вычислить log10 с этим вектором?

Благодарю вас!


person JoJo    schedule 06.06.2017    source источник


Ответы (2)


Простой способ, который позволил бы Eigen по-прежнему использовать SIMD (я предполагаю, что он включен), заключался бы в простой смене баз:

valsingn = valsingn.array().log() / log(10.0);

Кроме того, вы можете передать log10 как унарное выражение:

 valsingn.unaryExpr(&log10); // You may have to wrap 
                             // log10 in a function of
                             // your own depending on
                             // the log10 overloads
person Avi Ginsburg    schedule 06.06.2017

Вам нужно перейти в мир массивов для чистых функций с коэффициентами:

Vector3f v, w;
w = v.array().log10();
w = log10(v.array());
Arrayt3f a, b;
b = a.log10();
b = log10(a);
person ggael    schedule 06.06.2017
comment
Это компилируется для вас? Какую версию Eigen вы используете? В каком файле определен log10? - person m7913d; 06.06.2017
comment
@ m7913d log10 был добавлен в Eigen 3.3. - person Avi Ginsburg; 06.06.2017
comment
@ggael Есть ли SIMD log10? Он не указан в dox. - person Avi Ginsburg; 06.06.2017
comment
Нет, но вопрос был для Vector3f, который все равно не векторизован. - person ggael; 07.06.2017