Текст подпрограммы и версий
afp7r_c.zip , afp7d_c.zip , afp7c_c.zip
Тексты тестовых примеров
tafp7r_c.zip , tafp7d_c.zip , tafp7c_c.zip

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

Назначение

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

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

Для прямоугольной матрицы a paзмeра N*М (N ≤ М) строятся две последовательности матриц вращения R3 2,R4 2, ..., RN N - 1 paзмера N*N и Т1 21 3, ..., ТN M размера М*М, такие, что

     RN N-1 ... R3 2 A T1 2 ... TN M = D , 

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

Матрицы Ti j и Ri 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) , 

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

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

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

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

Параметры

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

Версии

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

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

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

  1. 

В случае необходимости преобразования вектора матрицами вращения Tn m,Tn m - 1,...,T1 2 или R3 2,R4 2,...,Rn n - 1, упакованными в матрице A описанным выше способом, можно воспользоваться соответственно подпрограммами am10r_c или am09r_c.

  2. 

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

  3. 

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

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

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

#define a_ref(a_1,a_2) a[(a_2)*3 + a_1 - 4]

    afp7r_c(a, &c__3, &c__5);

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


Результат:

                 |  1     0   0   0   0    |
      a  =    |  2     1   0   0   0    |
                 | 0.5   2   1   0   0.5 |

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

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