Текст подпрограммы и версий
afp6r_c.zip , afp6d_c.zip , afp6c_c.zip
Тексты тестовых примеров
tafp6r_c.zip , tafp6d_c.zip , tafp6c_c.zip

Подпрограмма:  afp6r_c

Назначение

Приведение прямоугольной матрицы размера n*m (n ≥ m) к верхнему двухдиагональному виду преобразованиями вращения.

Математическое описание

Для прямоугольной матрицы a paзмeра N*М (N ≥ М) строятся две последовательности матриц вращения R2 1, R3 1, ..., RN 1, ..., RM + 1 M, ..., RN M  paзмepa N*N и  Т2 32 4, ..., Т2 M, ..., ТM - 1 M размера М*М, такие, что

     RN M ... R2 1 A T2 3 ... TM-1 M = D , 

где D - верхняя двухдиагональная матрица размера N*М. В pезультате двухдиагональная матрица D запоминается на месте соответствующих диагоналей матрицы А, а матрицы вращения  Ri j,  i = 2, 3, ..., N,  j = 1, 2, ..., М,  i > j и  Тi j,  i = 2, 3, 4, ..., М - 1,  j = 3, 4, ..., М,  i < j  строятся следующим образом.

Матрицы Ri j и Ti j являются матрицами плоского вращения в плоскости ( i, j ), у которых элементы Ri i = Rj j = C, Ri j = - S, Rj i = S, а остальные элементы главной диагонали равны 1, свертываются в число t = S / (1 + С), по которому они восстанавливаются с помощью формул

       C = (1 - | t |2) / (1 + | t |2) ,        S = 2t / (1 + | t |2) , 

и упаковываются соответственно под и над верхней двухдиагональной частью матрицы А: информация о матрице Ri j запоминается на месте элемента с индексами ( i, j ), а информация о матрице Тi j - на месте элемента с индексами ( i - 1, j ).

В.В.Воеводин. Вычислительные основы линейной алгебры, М., Наука, 1977.

Использование

    int afp6r_c (real *a, integer *n, integer *m)

Параметры

a - двумерный массив размера n*m (n ≥ m), в котором задается исходная матрица A; в результате работы подпрограммы верхняя двухдиагональная матрица D запоминается на месте соответствующих диагоналей матрицы A, а матрицы вращения Ri j и Ti j упаковываются соответственно под и над верхней двухдиагональной частью матрицы A (тип: вещественный);
n, m - число строк и столбцов матрицы A, причем n ≥ m (тип: целый).

Версии

afp6d_c - приведение прямоугольной матрицы размера n*m (n ≥ m), заданной с двойной точностью, к верхнему двухдиагональному виду преобразованиями вращения.
afp6c_c - приведение комплексной прямоугольной матрицы размера n*m (n ≥ m) к верхнему двухдиагональному виду преобразованиями вращения.

Вызываемые подпрограммы: нет

Замечания по использованию

  1. 

В случае необходимости преобразования вектора матрицами вращения R2 1, R3 1, ..., Rn 1, ..., Rm+1 m, ..., Rn m или Tm - 1 m,Tm - 2 m, ..., T2 3, упакованными в матрице A описанным выше образом, можно воспользоваться соответственно подпрограммами am07r_c и am08r_c.

  2. 

В подпрограмме afp6d_c параметр a имеет тип double.

  3. 

В подпрограмме afp6c_c параметр a имеет тип complex.

Пример использования

int main(void)
{
    /* Initialized data */
    static float a[15] /* was [5][3] */ = { 1.f,0.f,0.f,0.f,0.f,1.2f,-1.f,
                                     -.48f,0.f,.64f,1.6f,2.f,.36f,0.f,-.48f };
    /* Local variables */
    extern int afp6r_c(float *, int *, int *);
    static int i__;

#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]

    afp6r_c(a, &c__5, &c__3);

    for (i__ = 1; i__ <= 5; ++i__) {
        printf("\n %15.7e %15.7e %15.7e \n",
          a_ref(i__, 1), a_ref(i__, 2), a_ref(i__, 3));
    }
    return 0;
} /* main */


Результат:

                      | 1   2   0.5 |
                      | 0   1   2    |
      a_ref  =    | 0   0   1    |
                      | 0   0   0    |
                      | 0   0   0.5 |

Это означает, что

                 | 1  2  0 |
                 | 0  1  2 |
      d  =    | 0  0  1 |
                 | 0  0  0 |
                 | 0  0  0 |