Проблемы преобразования следующего матричного кода в Matlab в Eigen в переполнении стека

H, W, R, V являются матрицами и уже инициализированы с соответствующими размерами. «бета» — это int, «myeps» — это число с плавающей точкой. Для реализации матрицы в настоящее время я использовал библиотеку Eigen. Однако я не уверен в синтаксисе, позволяющем успешно преобразовать этот код Matlab в код C ++ на основе Eigen.

Matlab Code

H = H .* ( (W'*(R.^(beta-2) .* V)) ./ max(W'*R.^(beta-1), myeps) );

Код C ++ (что я пробовал до сих пор)

WH = W_ * H_;

Eigen::MatrixXf j=(W_.transpose().array()*(WH.array().pow((beta2)).cwiseProduct(V.array())));

Eigen::MatrixXf k=(W_.transpose().array()*((WH.array().pow(beta-1))));

float m=max(k.maxCoeff(),0.001);

H_ = H_.cwiseProduct(j/m);

Этот код правильный?

К вашему сведению — это шаг в алгоритме NMF (неотрицательная матричная факторизация на основе бета-дивергенции).

Любая помощь будет принята с благодарностью.

0

Решение

Это не кажется правильным. * на массивах эквивалентно cwiseProduct в то время как вы хотите матричный продукт с W', Предложение:

Eigen::MatrixXf j = (W.transpose() * (R.array().pow(beta-2)*V.array()).matrix());
Eigen::MatrixXf k = (W.transpose() *  R.array().pow(beta-1).matrix());
H = H.cwiseProduct(j/max(k.maxCoeff(),myeps));
1

Другие решения

Я рекомендую вам взглянуть на этот краткий справочник:

http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt

Он содержит отображения между Eigen и Matlab.

Например:

R = P.cwiseProduct(Q);    // R = P .* Q

а также

R.array().square()        // P .^ 2

Как видите, это Розеттский камень может помочь вам перевести ваши выражения.

0

По вопросам рекламы [email protected]