2017-11-08 11 views
0

하나 개의 행을 곱셈 MatrixXdEigen3/C++ : MatrixXd가 주어진 Eigen3/C++ 라이브러리를 사용하여 다른

/x0 ... y0 \ 
    | x1 ... y1 | 
M = | ... ... ... | 
    |    | 
    \ xN ... yN/

아래와 같이 수정 된 버전을 달성하기 금식 방법은 무엇인가? 인

/x0 * y0 ... y0 \ 
    | x1 * y1 ... y1 | 
M' = | ... ... ...  | 
    |     | 
    \ xN * yN ... yN/

, 하나의 열 (상기 X들과 함께 하나) 자체 (의 y들과 해당) 다른 열이 곱 로 대체된다.

답변

1

첫 번째 및 마지막 열 벡터를 계수 방식으로 할당하고 곱하는 방법을 의미합니까? 거기에 그것을하는 방법은 여러 가지가 있지만 가장 쉬운/빠른

Eigen::MatrixXd M2 = M; 

M2.leftCols<1>().array() *= M2.rightCols<1>().array(); 

대안 다음

Eigen::MatrixXd M2{ M.rows(), M.cols() }; 

M2.rightCols(M.cols() - 1) = M.rightCols(M.cols() - 1); 
M2.leftCols<1>() = M.leftCols<1>().cwiseProduct(M.rightCols<1>()); 
같은 블록에 할당 주어진 행/COLS의 수와 함께 초기화되지 않은 행렬을 구성 할 수있을

더 빠르다. (당신이 선호하는 프로파일 러는 그렇다.)

미래의 질문에 대해, 여기에 공식 Eigen quick reference입니다)

+0

내가 사용하는 결국 '.block을()'나 임의의 colums를 처리 할 수 ​​있지만, 당신이 준 아이디어는 솔루션에 대한 힌트이었다 기능. –