H, W, R, V являются матрицами и уже инициализированы соответствующими размерами. "beta" - это int, "myeps" - это float. Для реализации матрицы я в настоящее время использовал Eigen-библиотеку. Однако я не уверен в синтаксисе для успешного преобразования этого кода Matlab в код на основе Eigen C++.
Код Matlab
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);
Правильно ли этот код?
FYI - это шаг в алгоритме 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
Как вы можете видеть, этот Розеттский камень может помочь вам перевести свои выражения.