Текст подпрограммы и версий am10r_c.zip , am10d_c.zip , am10c_c.zip |
Тексты тестовых примеров tam10r_c.zip , tam10d_c.zip , tam10c_c.zip |
Левосторонние преобразования вектора последовательностью матриц вращения, упакованных над главной диагональю прямоугольной матрицы размера N * M (N ≤ M).
Вектор B длины М последовательно умножается слева на матрицы
вращения ТN М, ТN М-1,
..., Т1 2, упакованные над главной
диагональю заданной прямоугольной матрицы А размера N*М
(N ≤ М) таким образом, что если
t = А(i, j), то матрица Тi j
размера M*M является матрицей плоского вращения в
плоскости (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 am10r_c (real *a, integer *n, integer *m, real *b)
Параметры
a - | двумерный массив размера n * m, содержащий прямоугольную матрицу, над главной диагональю которой хранится в упакованном виде последовательность матриц вращения (тип: вещественный); |
n, m - | число строк и столбцов матрицы A, причем n ≤ m (тип: целый); |
b - | одномерный массив длины m, в котором задается исходный вектор; в результате работы подпрограммы на месте b запоминается преобразованный вектор (тип: вещественный). |
Версии
am10d_c - | левосторонние преобразования вектора последовательностью матриц вращения с повышенной точностью. |
am10c_c - | левосторонние преобразования комплексного вектора последовательностью комплексных матриц вращения. |
Вызываемые подпрограммы: нет.
Замечания по использованию
1. |
Заданная в необходимой форме последовательность матриц вращения, используемых данной подпрограммой, получается, например, в результате работы подпрограмм, реализующих приведение прямоугольной матрицы A размера N * M (N ≤ M) к нижнему двухдиагональному виду (afp7r_c) или к нижнему треугольному виду (afp9r_c) методом вращений. | |
2. |
В подпрограмме am10d_c пapaмeтpы a и b имeют тип double. | |
3. | В подпрограмме am10c_c пapaмeтpы a и b имeют тип complex. |
int main(void) { /* Initialized data */ static float a[20] /* was [4][5] */ = { 0.f,0.f,.5f,1.f,0.f,0.f,0.f,1.f, 0.f,1.f,1.f,1.f,.5f,1.f,1.f,1.f,1.f,1.f,1.f,.5f }; static float b[5] = { 1.f,1.f,1.f,1.f,1.f }; /* Local variables */ extern int am10r_c(float *, int *, int *, float *); static int i__; am10r_c(a, &c__4, &c__5, 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 = ( 0.2, - 0.2, 1.4, - 1.4, 1.0 )