H,W,R,V是矩阵,并且已经用各自的大小初始化。"beta“是一个int,”myep“是一个浮点。对于矩阵实现,我目前使用了特征库。但是,我不确定将此Matlab代码成功转换为基于特征的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算法(基于β发散的非负矩阵分解)中的一个步骤.
任何帮助都将不胜感激。
发布于 2013-10-27 20:53:55
这似乎不对。数组上的*相当于一个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-26 19:47:27
我建议您看一下这个快速引用:
http://eigen.tuxfamily.org/dox/AsciiQuickReference.txt
它包含特征和Matlab之间的映射。
例如:
R = P.cwiseProduct(Q); // R = P .* Q和
R.array().square() // P .^ 2正如你所看到的,这个罗塞塔·斯通可以帮你翻译你的表达。
https://stackoverflow.com/questions/19610944
复制相似问题