Вам не нужно .select()
. Вам просто нужно преобразовать массив bool
в массив типа компонента H
.
H = ((K * W).array() > 0.0).cast<double>();
Ваша первоначальная попытка не удалась, поскольку размер вашего постоянного массива 1/0 не соответствует размеру H
. Использование VectorXd::Constant
не является хорошим выбором, когда H
равно MatrixXd
. У вас также есть проблема со скобками. Я думаю, вы хотите *
, а не .*
в нотации Matlab.
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
int main() {
const int p = 5;
const int b = 10;
MatrixXd H(p, b), K(p, p), W(p, b);
K.setRandom();
W.setRandom();
H = ((K * W).array() > 0.0).cast<double>();
std::cout << H << std::endl << std::endl;
H = ((K * W).array() > 0).select(MatrixXd::Constant(p, b, 1),
MatrixXd::Constant(p, b, 0));
std::cout << H << std::endl;
return 0;
}
При вызове функции-члена шаблона в шаблоне необходимо использовать ключевое слово template
.
#include <iostream>
#include <Eigen/Eigen>
using namespace Eigen;
template<typename Mat, typename Vec>
void createHashTable(const Mat &K, Eigen::MatrixXi &H, Mat &W, int b) {
Mat CK = K;
H = ((CK * W).array() > 0.0).template cast<int>();
}
int main() {
const int p = 5;
const int b = 10;
Eigen::MatrixXi H(p, b);
Eigen::MatrixXf W(p, b), K(p, p);
K.setRandom();
W.setRandom();
createHashTable<Eigen::MatrixXf, Eigen::VectorXf>(K, H, W, b);
std::cout << H << std::endl;
return 0;
}
См. это для некоторого объяснения.
Приведение типов C++ Eigen::Matrix через шаблоны
person
kangshiyin
schedule
14.07.2016