2017-04-14 1 views
2

Eigen 문서에서 표현식이 게으른 것으로 평가 될 때 정확한 설명을 찾지 못했습니다. 나를 위해, 계수 식 표현 만 흥미 롭다. 즉, 앨리어싱의 가능성이 없다.Eugens 중간 변수를 사용한 게으른 평가

예 : ArrayXXf a(10000, 10000);

a = a.cube() * a.cube(); 

auto aCube = a.cube(); 
a = aCube * aCube; 

ArrayXXf aCube = a.cube(); 
a = aCube * aCube; 

반면이 ~ 550ms의 평가와 동일 ~ 250 밀리 내 PC에 평가합니다.

표현식이 명시 적 Array 유형 (예 : ArrayXXf)에 할당되면 표현식은 항상 평가됩니까?

코드는는 MinGW 릴리스 -03

추신으로 컴파일

답변

2

일반적으로 표현식을 Array<...>에 할당하면 명시 적으로 평가됩니다 (컴파일러가 변수를 완전히 최적화 할 수 있다고 생각하지 않는 한 - 사실 일 수 있음). (당신의 표현이 (...).eval()로 끝나는 경우 제외)하는 auto 변수에 할당 특히 작은 고정 크기의 배열을 위해.

, 그 또한 컴파일러는 충분히 가능성이 스마트 있지만 aCube * aCube이 (2 회 aCube의 각 coeffient을 평가하는 것을 의미없는 평가를하지 않습니다 그것이 가치를 재사용 할 수 있다는 것을 알아 낸다.) 그 특별한 경우에 그것은 아마도 더 쓸 것이다. a = aCube.square();

+0

매트릭스도 포함됩니까? 그런 다음'matrix1.noalias() = matrix2 * matrix2;와 같은 contax에 noalias()가 필요합니까? (here : https://eigen.tuxfamily.org/dox/TopicLazyEvaluation.html) – yar

+1

'matrix2 * matrix2'가'matrix1'에 할당 될 때'auto matrix1 = ...;'이라고 쓰지 않는 한 평가 될 것입니다. 그리고 매트릭스 제품의 경우 Eigen은 별칭이 없음을 확신 할 수 없으므로 기본적으로 임시로 평가됩니다. – chtz

+0

, 감사합니다! – yar