2016-07-17 1 views
2

지금까지 고유점은 삼각형 또는 대칭 행렬에 대해 특별한 최적화 된 연산을 제공하지 않는다는 것을 알았습니다. 또한이 행렬에 포장 된 저장소를 사용하지 않습니다. 삼각형과 대칭 행렬은 모두 정규 행렬로 간주됩니다. 그러나 고유는 view이라는 개념을 가지고 있습니다. 그러나 Eigen의 문서에서 그들은 대칭 및 삼각 행렬에 대해 최적화 된 연산을 수행한다고 언급했습니다. 또한 나는 The opposite triangular part is never referenced and can be used to store other information삼각형 및 대칭 행렬에 대한 고유 팩형 기억 장치 및 최적화 된 연산

TriangularView가 조밀 한 행렬의 삼각형 부분 뷰를 제공하고 그것에 최적화 작업을 수행 할 수 있습니다에 의해 그들이 무슨 뜻인지 이해가 안 돼요. 반대 삼각형 인 부분은 절대로 참조되지 않으며 다른 정보를 저장하는 데 사용할 수 있습니다.

그들은 대칭 행렬

을 위해 같은 일을 언급 그냥 삼각 행렬에 관해서는, 당신은 selfadjoint 매트릭스로 볼 특별하고 최적화 작업을 수행 할 수 정방 행렬의 삼각형 부분 를 참조 할 수 있습니다 . 다시 반대 삼각형 부분 은 절대로 참조되지 않으며 다른 정보를 저장하는 데 사용될 수 있습니다.

그래서 제 질문은 :

  1. 는 고유 특수 매트릭스 대칭 및 삼각 행렬을 고려 않거나 다른 고유 매트릭스와 같은 정규 행렬로 생각합니까?

  2. Eigen은 압축 저장 장치 또는 특수 소형 저장 장치를 사용합니까?

  3. 이 줄의 의미 반대 삼각형 부분은 참조되지 않으며 다른 정보를 저장하는 데 사용할 수 있습니까?

  4. eigen은 삼각형과 대칭 행렬에 대해 최적화 된 연산을 수행합니까?

여기에는 네 가지 질문이 있지만 모두 밀접한 관련이 있습니다. 예/아니오 대답은 질문 3을 제외하고 나에게 괜찮을 것입니다.

답변

2

일반적으로 Eigen은 주로 속도는 최적화되었지만 저장 공간은 최적화되지 않았다고 말할 수 있습니다.

  1. 눈치 챘 겠지만,보기 개념은 대칭 및 삼각 행렬의 특수한 배열입니다.
  2. 아니요, 특별한 저장 방식을 사용하는 삼각 매트릭스의 50 % 메모리 공간을 절약하는 것이 Eigen에게는 그리 매력적이지 않은 것 같습니다.
  3. 일반적인 고밀도 매트릭스 방식으로 삼각 행렬을 저장할 때 공간의 50 %가 사용되지 않습니다. 사용하지 않는 부분을 사용하여 다른 것을 저장할 수 있습니다.
  4. 예, 당신은 당신이 결과를 비교할 수 3. 귀하의 질문에 데모와 함께,이 코드는 다른 방법으로 A * A^T을 계산 A * A^T

등의 작업을 위해 50 %의 실행 시간을 절약하기 위해 대칭/selfadjoint보기를 사용할 수 있으며 합리적인 큰 차원으로 실행 시간을 측정하십시오.

#include <iostream> 
#include "Eigen/Eigen" 

int main() { 
    using namespace Eigen; 

    const int n = 5; 
    Eigen::MatrixXd a(n, n), b(n, n), c(n, n), d(n, n); 
    a.setRandom(); 
    b.setZero(); 
    c.setZero(); 
    d.setZero(); 
    d.bottomLeftCorner(n/2, n/2).setConstant(100); 

    std::cout << "original d =\n" << d << std::endl; 

    b = a * a.transpose(); 
    std::cout << "b=\n" << b << std::endl; 

    c.selfadjointView<Upper>().rankUpdate(a); 
    std::cout << "c=\n" << c << std::endl; 

    d.selfadjointView<Upper>().rankUpdate(a); 
    std::cout << "d=\n" << d << std::endl; 

    return 0; 
} 

출력 :

original d = 
    0 0 0 0 0 
    0 0 0 0 0 
    0 0 0 0 0 
100 100 0 0 0 
100 100 0 0 0 
b= 
    2.45959 0.767369 1.13659 -0.511436 1.29631 
0.767369 0.557756 0.124955 -0.480089 0.434794 
    1.13659 0.124955 1.39678 -0.660623 0.87062 
-0.511436 -0.480089 -0.660623 1.43841 -0.103395 
    1.29631 0.434794 0.87062 -0.103395 2.02476 
c= 
    2.45959 0.767369 1.13659 -0.511436 1.29631 
     0 0.557756 0.124955 -0.480089 0.434794 
     0   0 1.39678 -0.660623 0.87062 
     0   0   0 1.43841 -0.103395 
     0   0   0   0 2.02476 
d= 
    2.45959 0.767369 1.13659 -0.511436 1.29631 
     0 0.557756 0.124955 -0.480089 0.434794 
     0   0 1.39678 -0.660623 0.87062 
     100  100   0 1.43841 -0.103395 
     100  100   0   0 2.02476