2014-06-17 2 views
2

큰 행렬에 Eigen을 사용하고 동적 메모리 할당을 줄이는 데 중점을두고 코드를 최적화하는 방법을 고려하고 있습니다.Eigen의 복사 곱셈 없음

두 개의 행렬을 곱하려고합니다. 그 행렬들은 때때로 조금씩 바뀌지 만 그 크기는 동일하게 유지됩니다.

곱셈의 결과가 미리 정의 된 행렬 (메모리가 이미 할당되어 있음)로 이동하는 것을보고 싶습니다. 그런 것 그리고 내가 해결책을 찾고 있어요

Eigen::MatrixXd left, right,result; 
// ... 
result = left * right; 
// ... left and right values change a little 
result = left * right; 

을 :

void Multiply(
    Eigen::MatrixXd const& left, 
    Eigen::MatrixXd const& right, 
    Eigen::MatrixXd&  result); 

    void Example() 
    { 
    Eigen::MatrixXd left, right, result; 
    // ... 
    Multiply(left, right, result); 
    // ... 
    Multiply(left, right, result); 
    } 

목적은 재사용 기본적으로 그래서 여기

무엇 내가 뭘의 예 result 행렬 메모리 때문에 이론적으로 차원을 변경해서는 안됩니다. 나는 operator*=을 사용하는 것에 대해 생각하고 있었지만 여전히 계산을 수행하기 위해 중간 행렬이 필요하다는 것을 알고 있습니다.

+0

에서 당신은 결과가 이미 적당한 크기를 가질 때'결과 = 왼쪽 * right' 실제로 재 할당 확인 했습니까? –

답변

2

result = left * right은 곱셈 결과를 보유 할 임시 행렬을 할당하고 곱을 임시 행렬로 평가 한 다음 임시 행렬의 결과를 result에 복사합니다. 임시 매트릭스가 필요한 A = A * B과 같은 명령문을 처리합니다.

결과가 제품의 매트릭스와 다른 경우, result.noalias() = left * right으로 작성할 수 있습니다. Eigen은이 경우 임시 행렬을 사용하지 않습니다. 아이겐에서 앨리어싱에

자세한 설명은 http://eigen.tuxfamily.org/dox/group__TopicAliasing.html

+0

'operator *()'는 리턴 타입이 다르다는 뜻입니까? 어떻게 가능할까요? – Arthur

+2

'operator *()'는 제품의 프록시로 사용되지만 제품을 평가하지 않는 표현식 객체를 반환합니다. 평가 단계는 제품 표현 객체가 행렬에 할당 될 때'operator =()'안에서만 수행됩니다. 자세한 정보는 C++에서 "표현 템플릿"또는 "지연 평가"를 검색하십시오. –