|
Текст подпрограммы и версий am08r_c.zip , am08d_c.zip , am08c_c.zip |
Тексты тестовых примеров tam08r_c.zip , tam08d_c.zip , tam08c_c.zip |
Левосторонние преобразования вектора последовательностью матриц вращения, упакованных над верхней двухдиагональной частью прямоугольной матрицы размера N * M (N ≥ M).
Вектор B длины М последовательно умножается слева на матрицы
вращения
ТМ - 1 М, ТМ-2 М,
..., Т2 3,
упакованные над верхней двух диагональной частью заданной
прямоугольной матрицы А размера N*М
(N ≥ М)
таким образом, что если t = А(i-1, j),
i < j, то матрица Тi j размера М*М
является матрицей плоского вращения в
плоскости (i, j), у которой элементы
Ti i = Tj j = С,
Ti j = -S,
Tj i = S, а остальные элементы главной
диагонали равны 1,
где
С = (1 - | t |2 ) / (1 + | t |2) ,
S = 2t / (1 + | t |2).
int am08r_c (real *a, integer *n, integer *m, real *b)
Параметры
| a - | двумерный массив размера n * m, содержащий прямоугольную матрицу, над верхней двухдиагональной частью которой хранится в упакованном виде последовательность матриц вращения (тип: вещественный); |
| n, m - | число строк и столбцов матрицы A, причем n ≥ m (тип: целый); |
| b - | одномерный массив длины m, в котором задается исходный вектор; в результате работы подпрограммы на месте b запоминается преобразованный вектор (тип: вещественный). |
Версии
| am08d_c - | левосторонние преобразования вектора последовательностью матриц вращения с повышенной точностью. |
| am08c_c - | левосторонние преобразования комплексного вектора последовательностью комплексных матриц вращения. |
Вызываемые подпрограммы: нет.
Замечания по использованию
| 1. |
Заданная в необходимой форме последовательность матриц вращения, используемых данной подпрограммой, получается, например, в результате работы подпрограммы, реализующей приведение прямоугольной матрицы A размера N * M (N ≥ M) к верхнему треугольному виду (afp8r_c) методом вращений. | |
| 2. |
В подпрограмме am08d_c пapaмeтpы a и b имeют тип double. | |
| 3. | В подпрограмме am08c_c пapaмeтpы a и b имeют тип complex. |
int main(void)
{
/* Initialized data */
static float b[5] = { 1.f,1.f,1.f,1.f,1.f };
/* Local variables */
extern int am08r_c(float *, int *, int *, float *);
static float a[20] /* was [5][4] */;
static int i__, j;
#define a_ref(a_1,a_2) a[(a_2)*5 + a_1 - 6]
for (i__ = 1; i__ <= 5; ++i__) {
for (j = 1; j <= 4; ++j) {
/* L2: */
a_ref(i__, j) = 1.f;
}
}
a_ref(2, 4) = .5f;
am08r_c(a, &c__5, &c__4, b);
for (i__ = 1; i__ <= 5; ++i__) {
printf("\n %16.7e \n", b[i__-1]);
}
for (i__ = 0; i__ <= 15; i__+=3) {
printf("\n %16.7e %16.7e %16.7e \n",
a[i__], a[i__+1], a[i__+2]);
}
printf("\n %16.7e %16.7e \n", a[18], a[19]);
return 0;
} /* main */
Результат: b = ( 1.0, 0.2, - 1.4, 1.0, 1.0 )