2013-10-26 2 views
0

H, W, R, V являются матрицами и уже инициализированы соответствующими размерами. «beta» - это int, «myeps» - это float. Для реализации матрицы я в настоящее время использовал Eigen-библиотеку. Однако я не уверен в синтаксисе, чтобы успешно преобразовать этот код Matlab в Cigen-код на основе 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 (неотрицательная матричная факторизация на основе бета-расхождения).

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

+2

Итак, что вы пробовали? С чем вы сталкиваетесь? Компонентные операции? – PeterT

+0

До сих пор у меня этот код ... это правильно? WH = W_ * H_; \t \t Eigen :: MatrixXf j = (W_.transpose(). Array() * (WH.array(). Pow ((beta-2)). CwiseProduct (V.array()))); \t \t Eigen :: MatrixXf k = (W_.transpose(). Array() * ((WH.array(). Pow (beta-1)))); \t \t float m = max (k.maxCoeff(), 0.001); \t \t H_ = H_.cwiseProduct (j/m); –

ответ

1

Это не выглядит правильным. * на массивах эквивалентно 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)); 
0

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

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

Он содержит соответствие между Эйгеном и Matlab.

Например:

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

и

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

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