omv.pas 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. {
  2. This file is part of the Numlib package.
  3. Copyright (c) 1986-2000 by
  4. Kees van Ginneken, Wil Kortsmit and Loek van Reij of the
  5. Computational centre of the Eindhoven University of Technology
  6. FPC port Code by Marco van de Voort ([email protected])
  7. documentation by Michael van Canneyt ([email protected])
  8. This unit contains some basic matrix operations.
  9. See the file COPYING.FPC, included in this distribution,
  10. for details about the copyright.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. **********************************************************************}
  15. Unit omv;
  16. {$I direct.inc}
  17. interface
  18. uses typ;
  19. {Calculates inproduct of vectors a and b which have N elements. The first
  20. element is passed in a and b}
  21. Function omvinp(Var a, b: ArbFloat; n: ArbInt): ArbFloat;
  22. {Multiplication of two matrices C=AxB }
  23. Procedure omvmmm(Var a: ArbFloat; m, n, rwa: ArbInt;
  24. Var b: ArbFloat; k, rwb: ArbInt;
  25. Var c: ArbFloat; rwc: ArbInt);
  26. {Multiplication of a matrix(A) with a vector(B), C=A x B}
  27. Procedure omvmmv(Var a: ArbFloat; m, n, rwidth: ArbInt; Var b, c: ArbFloat);
  28. {Calculate 1-Norm of matrix A}
  29. Function omvn1m(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  30. {Calculate 1-Norm of vector A}
  31. Function omvn1v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  32. {Calculate 2-Norm of vector A}
  33. Function omvn2v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  34. {Calculate Frobenius-Norm of mxn matrix A}
  35. Function omvnfm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  36. {Calculates maximum (infinite) norm of mxn matrix a}
  37. Function omvnmm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  38. {Calculates maximum (infinite) norm of n-Vector }
  39. Function omvnmv(Var a: ArbFloat; n: ArbInt): ArbFloat;
  40. {Transponate mxn matrix A (which was declared rwa bytes wide), put
  41. it to C (rwc was declared elements wide)}
  42. Procedure omvtrm(Var a: ArbFloat; m, n, rwa: ArbInt; Var c: ArbFloat;
  43. rwc: ArbInt);
  44. IMPLEMENTATION
  45. Function omvinp(Var a, b: ArbFloat; n: ArbInt): ArbFloat;
  46. Var pa, pb : ^arfloat1;
  47. i : ArbInt;
  48. s : ArbFloat;
  49. Begin
  50. If n<1 Then
  51. exit(0);
  52. pa := @a;
  53. pb := @b;
  54. s := 0;
  55. For i:=1 To n Do
  56. Begin
  57. s := s+pa^[i]*pb^[i]
  58. End; {i}
  59. omvinp := s
  60. End; {omvinp}
  61. Procedure omvmmm(Var a: ArbFloat; m, n, rwa: ArbInt;
  62. Var b: ArbFloat; k, rwb: ArbInt;
  63. Var c: ArbFloat; rwc: ArbInt);
  64. Var pa, pb, pc : ^arfloat1;
  65. i, j, l, inda, indc : ArbInt;
  66. s : ArbFloat;
  67. Begin
  68. If (m<1) Or (n<1) Or (k<1) Then
  69. exit;
  70. pa := @a;
  71. pb := @b;
  72. pc := @c;
  73. For i:=1 To m Do
  74. Begin
  75. inda := (i-1)*rwa;
  76. indc := (i-1)*rwc;
  77. For j:=1 To k Do
  78. Begin
  79. s := 0;
  80. For l:=1 To n Do
  81. s := s+pa^[inda+l]*pb^[(l-1)*rwb+j];
  82. pc^[indc+j] := s
  83. End {j}
  84. End; {i}
  85. End; {omvmmm}
  86. Procedure omvmmv(Var a: ArbFloat; m, n, rwidth: ArbInt; Var b, c: ArbFloat);
  87. Var pa, pb, pc : ^arfloat1;
  88. i, j, ind : ArbInt;
  89. Begin
  90. If (m<1) Or (n<1) Then
  91. exit;
  92. pa := @a;
  93. pb := @b;
  94. pc := @c;
  95. ind := 0;
  96. For i:=1 To m Do
  97. Begin
  98. pc^[i] := omvinp(pa^[ind+1], pb^[1], n);
  99. ind := ind+rwidth
  100. End; {i}
  101. End; {omvmmv}
  102. Function omvn1m(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  103. Var pa : ^arfloat1;
  104. i, j : ArbInt;
  105. norm, normc : ArbFloat;
  106. Begin
  107. If (m<1) Or (n<1) Then
  108. exit;
  109. pa := @a;
  110. norm := 0;
  111. For j:=1 To n Do
  112. Begin
  113. normc := 0;
  114. For i:=1 To m Do
  115. normc := normc+abs(pa^[j+(i-1)*rwidth]);
  116. If norm<normc Then
  117. norm := normc
  118. End;
  119. omvn1m := norm
  120. End {omvn1m};
  121. Function omvn1v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  122. Var pa : ^arfloat1;
  123. i : ArbInt;
  124. norm : ArbFloat;
  125. Begin
  126. If n<1 Then
  127. exit;
  128. pa := @a;
  129. norm := 0;
  130. For i:=1 To n Do
  131. norm := norm+abs(pa^[i]);
  132. omvn1v := norm
  133. End {omvn1v};
  134. Function omvn2v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  135. Var pa : ^arfloat1;
  136. i : ArbInt;
  137. norm : ArbFloat;
  138. Begin
  139. If n<1 Then
  140. exit;
  141. pa := @a;
  142. norm := 0;
  143. For i:=1 To n Do
  144. norm := norm+sqr(pa^[i]);
  145. omvn2v := sqrt(norm)
  146. End {omvn2v};
  147. Function omvnfm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  148. Var pa : ^arfloat1;
  149. i, j, k : ArbInt;
  150. norm : ArbFloat;
  151. Begin
  152. If (m<1) Or (n<1) Then
  153. exit;
  154. pa := @a;
  155. norm := 0;
  156. k := 0;
  157. For i:=1 To m Do
  158. Begin
  159. For j:=1 To n Do
  160. norm := norm+sqr(pa^[j+k]);
  161. k := k+rwidth
  162. End;
  163. omvnfm := sqrt(norm)
  164. End {omvnfm};
  165. Function omvnmm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  166. Var pa : ^arfloat1;
  167. i, k : ArbInt;
  168. normr, norm : ArbFloat;
  169. Begin
  170. If (m<1) Or (n<1) Then
  171. exit;
  172. pa := @a;
  173. norm := 0;
  174. k := 0;
  175. For i:=1 To m Do
  176. Begin
  177. normr := omvn1v(pa^[1+k], n);
  178. If norm<normr Then
  179. norm := normr;
  180. k := k+rwidth
  181. End;
  182. omvnmm := norm
  183. End {omvnmm};
  184. Function omvnmv(Var a: ArbFloat; n: ArbInt): ArbFloat;
  185. Var pa : ^arfloat1;
  186. i : ArbInt;
  187. norm, aa : ArbFloat;
  188. Begin
  189. If (n<1) Then
  190. exit;
  191. pa := @a;
  192. norm := 0;
  193. For i:=1 To n Do
  194. Begin
  195. aa := abs(pa^[i]);
  196. If aa>norm Then
  197. norm := aa
  198. End;
  199. omvnmv := norm
  200. End {omvnmv};
  201. Procedure omvtrm(Var a: ArbFloat; m, n, rwa: ArbInt;
  202. Var c: ArbFloat; rwc: ArbInt);
  203. Var pa, pc : ^arfloat1;
  204. ind, i, j : ArbInt;
  205. Begin
  206. If (m<1) Or (n<1) Then
  207. exit;
  208. pa := @a;
  209. pc := @c;
  210. ind := 0;
  211. For i:=1 To m Do
  212. Begin
  213. For j:=1 To n Do
  214. pc^[(j-1)*rwc+i] := pa^[ind+j];
  215. ind := ind+rwa
  216. End; {i}
  217. End; {omvtrm}
  218. End.