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 (неотрицательная матричная факторизация на основе бета-дивергенции).
Любая помощь будет принята с благодарностью.
Это не кажется правильным. *
на массивах эквивалентно 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));
Я рекомендую вам взглянуть на этот краткий справочник:
http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt
Он содержит отображения между Eigen и Matlab.
Например:
R = P.cwiseProduct(Q); // R = P .* Q
а также
R.array().square() // P .^ 2
Как видите, это Розеттский камень может помочь вам перевести ваши выражения.