2013-10-26 2 views
0

H, W, R, V는 행렬이며 각 크기로 이미 초기화되어 있습니다. "베타"는 int이고, "myeps"는 실수입니다. 매트릭스 구현을 위해 나는 현재 Eigen 라이브러리를 사용했다. 그러나이 Matlab 코드를 Eigen 기반 C++ 코드로 성공적으로 변환하는 구문에 대해서는 잘 모르겠습니다.Matlab의 다음 행렬 코드를 C++의 Eigen으로 변환 할 때의 문제

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 (베타 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 

당신이 볼 수 있듯이

로제타 스톤 당신이 당신의 표현을 번역하는 데 도움이 될 수 있습니다.