― содержит матрицу (с ортогональными столбцами) из разложения, если для параметра matu было задано значение true в противном случае U используется как временный массив. U также может совпадать с A. Если происходит выход по ошибке, то столбцы U, соответствующие индексам верных сингулярных чисел, должны быть также верны.
V
― содержит матрицу (ортогональную) из разложения, если для параметра matv было задано значение true. В противном случае на V не производится ссылок. V также может совпадать с A, если не вычисляется. Если происходит выход по ошибке, то столбцы V, соответствующие индексам верных сингулярных чисел, должны быть также верны.
iеrr
― = 0 – если происходит нормальный выход из подпрограммы,
― = k – если -oе сингулярное число не было определено после 30 итераций.
RV1
― это массив промежуточного хранения.
рrogram TSVD;
uses FMM, crt;
var
A, U, V : floatmatrixCS;
S, W : floatvectorc;
i, err, j, m, nm, n : integer;
Begin
clrscr;
writeln('Иллюстрирующая программа для SVD - вычисляется т');
writeln(' сингулярное разложение матрицы A = U*S*V');
writeln;
nm:=5; m:=5; n:=3;
for i:=1 to m do for j:=1 to n do a[i,j]:=i+(j-1)*m;
for i:=1 to m do begin
for j:=1 to n do write(a[i,j]:8:3,' ');
writeln;
end;
gotoxy(35,4); writeln(' initial matrix A');
gotoxy(1,10);
SVD(m, n, a, s, true, u, true, v, err, w);
writeln(' Error code = ',err);
writeln;
for j:= 1 to n do write(s[j]:8:3,' ');
write(' vector S');
writeln; writeln;
for i:=1 to m do begin
for j:=1 to n do write(u[i,j]:8:3,' ');
writeln;
end;
gotoxy(35,14); writeln(' matrix U');
gotoxy(1,20);
for i:=1 to n do begin
for j:=1 to n do write(v[i,j]:8:3,' ');
writeln;
end;
gotoxy(35,20); writeln(' matrix V');
gotoxy(1,24);
End.
Иллюстрирующая программа для SVD - вычисляется т сингулярное разложение матрицы A = U*S*V
1.000 6.000 11.000 initial matrix A
2.000 7.000 12.000
3.000 8.000 13.000
4.000 9.000 14.000
5.000 10.000 15.000
Error code = 0
35.127 2.465 0.000 vector S
-0.355 -0.689 0.220 matrix U
-0.399 -0.376 0.074
-0.443 -0.062 -0.817
-0.487 0.251 0.528
-0.531 0.564 -0.007
-0.202 0.890 -0.408 matrix V
-0.517 0.257 0.816
-0.832 -0.376 -0.408
Далее приводятся четыре вспомогательные программы, воспроизводящие соответствующие стандартные функции языка Фортран, которые могут быть полезны при перводе имеющихся библиотек программ с Фортрана на Паскаль.
Function рowRI( A: float;
b: integer ): float;
Возведение вещественного числа в целую степень.
Число A типа FLOAT (см. ГЛАВА 1. Описание типов и констант модуля FMM) возводится в целую степень b (типа INTEGER), рowRI присваивается значение результата. A и b могут быть любыми числами.
Function рowRR( a: float;
b: float ): float;
Возведение вещественного числа в вещественную степень.
Число A типа FLOAT (см. ГЛАВА 1. Описание типов и констант модуля FMM) возводится в вещественную степень b, рowRR присваивается значение результата. A и b могут быть любыми числами, однако поскольку операция возведения в вещественную степень вещественного отрицательного числа в действительной арифметике не определена, то вместо выхода по ошибке при A < 0 вычисляется abs( A ) в степени b.
function sign( a, b: float): float;
Воспроизводится стандартная функция языка Фортран SIGN.
sign := Знак( b ) * abs( a ), a и b имеют тип FLOAT, также как и сама функция.
function isign( a, b: integer ): integer;
Воспроизводится стандартная функция языка Фортран ISIGN.
isign := Знак( b ) * abs( a ), a и b имеют тип INTEGER, также как и сама функция.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.