оптимизации умножения собственных матриц, точность домохозяев - PullRequest
0 голосов
/ 22 апреля 2020

Я разрабатываю код, выполняющий декомпозицию Шура. Я проверяю это с помощью соответствующего материала. Я обнаружил, что мой код дает результаты, отличные от собственных. Большинство матричных элементов выходных данных my и egein одинаковы с 2 или 4 десятичными разрядами.
Однако наихудшая доступная разница составляет около 70%: например, мой код дает определенный матричный элемент, равный 0,3 и собственный 0,19.

Я решил заглянуть глубже в собственные источники и выяснил, что если я изменю следующий собственный код

void ::applyHouseholderOnTheLeft(....)  
{
  ......
    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());
    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());
    tmp.noalias() = essential.adjoint() * bottom;
    tmp += this->row(0);
    this->row(0) -= tau * tmp;
    bottom.noalias() -= tau * essential * tmp;
}

на этот (то же самое было сделано для applyHouseholderOnTheRight):

void ::applyHouseholderOnTheLeft(....)  
{
  ......
    Map<typename internal::plain_row_type<PlainObject>::type> tmp(workspace,cols());
    Block<Derived, EssentialPart::SizeAtCompileTime, Derived::ColsAtCompileTime> bottom(derived(), 1, 0, rows()-1, cols());
    tmp.noalias() = essential.adjoint() * bottom;
    tmp += this->row(0);
    tmp *= tau;
    this->row(0) -= tmp;
    bottom.noalias() -= essential * tmp;  
}

i получить собственный выход, равный моему (в пределах 7-6 десятичных знаков) !! Математически эти две части кода эквивалентны. Итак, вопрос в том, почему такая большая разница в выходных данных эквивалентного кода. И какой результат на самом деле верный (0,3 или 0,19 :-))?

Оригинальный тестовый код:

      Matrix<double, Dynamic, Dynamic, RowMajor> A(10,10); 

        A<<6.9 ,4.8 ,9.5 ,3.1 ,6.5 ,5.8 ,-0.9 ,-7.3 ,-8.1 ,3.0 ,0.1 ,9.9 ,-3.2 ,6.4 ,6.2 ,-7.0 ,5.5 ,-2.2 ,-4.0 ,3.7 ,-3.6 ,9.0 ,-1.4 ,-2.4 ,1.7 ,-6.1 ,-4.2 , -2.5 ,-5.6 ,-0.4 ,0.4 ,9.1 ,-2.1 ,-5.4 ,7.3 ,3.6 ,-1.7 ,-5.7 ,-8.0 ,8.8 ,-3.0 ,-0.5 ,1.1 ,10.0 ,8.0 ,0.8 ,1.0 ,7.5 ,3.5 ,-1.8 ,0.3 ,-0.6 ,-6.3 ,-4.5 , -1.1 ,1.8 ,0.6 ,9.6 ,9.2 ,9.7 ,-2.6 ,4.3 ,-3.4 ,0.0 ,-6.7 ,5.0 ,10.5 ,1.5 ,-7.8 ,-4.1 ,-5.3 ,-5.0 ,2.0 ,-4.4 ,-8.4 ,6.0 ,-9.4 ,-4.8 ,8.2 ,7.8 ,5.2 ,-9.5 , -3.9 ,0.2 ,6.8 ,5.7 ,-8.5 ,-1.9 ,-0.3 ,7.4 ,-8.7 ,7.2 ,1.3 ,6.3 ,-3.7 ,3.9 ,3.3 ,-6.0 ,-9.1 ,5.9; 

    RealSchur<Matrix<double, Dynamic, Dynamic, RowMajor>>schur(A); 

    Matrix<double, Dynamic, Dynamic, RowMajor> T = schur.matrixT();

// and ,for example, element T(row_0, col_2) has notable difference: 0.19 (first code), 0.3 (second code) 

Векторизация PS в eigen отключена в моем случае (определены макросы EIGEN_DONT_VECTORIZE)

...