0

H、W、R、V 是矩阵,并且已经用各自的大小进行了初始化。“beta”是一个整数,“myeps”是一个浮点数。对于矩阵实现,我目前使用了 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);

这段代码正确吗?

仅供参考 - 这是 NMF 算法中的一个步骤(基于 beta 散度的非负矩阵分解)。

任何帮助将不胜感激。

4

2 回答 2

1

这似乎不正确。*on arrays 相当于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));
于 2013-10-27T20:53:55.507 回答
0

我建议你看看这个快速参考:

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

它包含 Eigen 和 Matlab 之间的映射。

例如:

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

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

如您所见,这款Rosetta Stone可以帮助您翻译您的表达方式。

于 2013-10-26T19:47:27.580 回答