omv.pas 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. {$IFNDEF FPC_DOTTEDUNITS}
  16. Unit omv;
  17. {$ENDIF FPC_DOTTEDUNITS}
  18. {$I direct.inc}
  19. interface
  20. {$IFDEF FPC_DOTTEDUNITS}
  21. uses NumLib.Typ;
  22. {$ELSE FPC_DOTTEDUNITS}
  23. uses typ;
  24. {$ENDIF FPC_DOTTEDUNITS}
  25. {Calculates inproduct of vectors a and b which have N elements. The first
  26. element is passed in a and b}
  27. Function omvinp(Var a, b: ArbFloat; n: ArbInt): ArbFloat;
  28. {Multiplication of two matrices C=AxB }
  29. Procedure omvmmm(Var a: ArbFloat; m, n, rwa: ArbInt;
  30. Var b: ArbFloat; k, rwb: ArbInt;
  31. Var c: ArbFloat; rwc: ArbInt);
  32. {Multiplication of a matrix(A) with a vector(B), C=A x B}
  33. Procedure omvmmv(Var a: ArbFloat; m, n, rwidth: ArbInt; Var b, c: ArbFloat);
  34. {Calculate 1-Norm of matrix A}
  35. Function omvn1m(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  36. {Calculate 1-Norm of vector A}
  37. Function omvn1v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  38. {Calculate 2-Norm of vector A}
  39. Function omvn2v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  40. {Calculate Frobenius-Norm of mxn matrix A}
  41. Function omvnfm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  42. {Calculates maximum (infinite) norm of mxn matrix a}
  43. Function omvnmm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  44. {Calculates maximum (infinite) norm of n-Vector }
  45. Function omvnmv(Var a: ArbFloat; n: ArbInt): ArbFloat;
  46. {Transponate mxn matrix A (which was declared rwa bytes wide), put
  47. it to C (rwc was declared elements wide)}
  48. Procedure omvtrm(Var a: ArbFloat; m, n, rwa: ArbInt; Var c: ArbFloat;
  49. rwc: ArbInt);
  50. IMPLEMENTATION
  51. Function omvinp(Var a, b: ArbFloat; n: ArbInt): ArbFloat;
  52. Var pa, pb : ^arfloat1;
  53. i : ArbInt;
  54. s : ArbFloat;
  55. Begin
  56. If n<1 Then
  57. exit(0);
  58. pa := @a;
  59. pb := @b;
  60. s := 0;
  61. For i:=1 To n Do
  62. Begin
  63. s := s+pa^[i]*pb^[i]
  64. End; {i}
  65. omvinp := s
  66. End; {omvinp}
  67. Procedure omvmmm(Var a: ArbFloat; m, n, rwa: ArbInt;
  68. Var b: ArbFloat; k, rwb: ArbInt;
  69. Var c: ArbFloat; rwc: ArbInt);
  70. Var pa, pb, pc : ^arfloat1;
  71. i, j, l, inda, indc : ArbInt;
  72. s : ArbFloat;
  73. Begin
  74. If (m<1) Or (n<1) Or (k<1) Then
  75. exit;
  76. pa := @a;
  77. pb := @b;
  78. pc := @c;
  79. For i:=1 To m Do
  80. Begin
  81. inda := (i-1)*rwa;
  82. indc := (i-1)*rwc;
  83. For j:=1 To k Do
  84. Begin
  85. s := 0;
  86. For l:=1 To n Do
  87. s := s+pa^[inda+l]*pb^[(l-1)*rwb+j];
  88. pc^[indc+j] := s
  89. End {j}
  90. End; {i}
  91. End; {omvmmm}
  92. Procedure omvmmv(Var a: ArbFloat; m, n, rwidth: ArbInt; Var b, c: ArbFloat);
  93. Var pa, pb, pc : ^arfloat1;
  94. i, ind : ArbInt;
  95. Begin
  96. If (m<1) Or (n<1) Then
  97. exit;
  98. pa := @a;
  99. pb := @b;
  100. pc := @c;
  101. ind := 0;
  102. For i:=1 To m Do
  103. Begin
  104. pc^[i] := omvinp(pa^[ind+1], pb^[1], n);
  105. ind := ind+rwidth
  106. End; {i}
  107. End; {omvmmv}
  108. Function omvn1m(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  109. Var pa : ^arfloat1;
  110. i, j : ArbInt;
  111. norm, normc : ArbFloat;
  112. Begin
  113. If (m<1) Or (n<1) Then
  114. exit;
  115. pa := @a;
  116. norm := 0;
  117. For j:=1 To n Do
  118. Begin
  119. normc := 0;
  120. For i:=1 To m Do
  121. normc := normc+abs(pa^[j+(i-1)*rwidth]);
  122. If norm<normc Then
  123. norm := normc
  124. End;
  125. omvn1m := norm
  126. End {omvn1m};
  127. Function omvn1v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  128. Var pa : ^arfloat1;
  129. i : ArbInt;
  130. norm : ArbFloat;
  131. Begin
  132. If n<1 Then
  133. exit;
  134. pa := @a;
  135. norm := 0;
  136. For i:=1 To n Do
  137. norm := norm+abs(pa^[i]);
  138. omvn1v := norm
  139. End {omvn1v};
  140. Function omvn2v(Var a: ArbFloat; n: ArbInt): ArbFloat;
  141. Var pa : ^arfloat1;
  142. i : ArbInt;
  143. norm : ArbFloat;
  144. Begin
  145. If n<1 Then
  146. exit;
  147. pa := @a;
  148. norm := 0;
  149. For i:=1 To n Do
  150. norm := norm+sqr(pa^[i]);
  151. omvn2v := sqrt(norm)
  152. End {omvn2v};
  153. Function omvnfm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  154. Var pa : ^arfloat1;
  155. i, j, k : ArbInt;
  156. norm : ArbFloat;
  157. Begin
  158. If (m<1) Or (n<1) Then
  159. exit;
  160. pa := @a;
  161. norm := 0;
  162. k := 0;
  163. For i:=1 To m Do
  164. Begin
  165. For j:=1 To n Do
  166. norm := norm+sqr(pa^[j+k]);
  167. k := k+rwidth
  168. End;
  169. omvnfm := sqrt(norm)
  170. End {omvnfm};
  171. Function omvnmm(Var a: ArbFloat; m, n, rwidth: ArbInt): ArbFloat;
  172. Var pa : ^arfloat1;
  173. i, k : ArbInt;
  174. normr, norm : ArbFloat;
  175. Begin
  176. If (m<1) Or (n<1) Then
  177. exit;
  178. pa := @a;
  179. norm := 0;
  180. k := 0;
  181. For i:=1 To m Do
  182. Begin
  183. normr := omvn1v(pa^[1+k], n);
  184. If norm<normr Then
  185. norm := normr;
  186. k := k+rwidth
  187. End;
  188. omvnmm := norm
  189. End {omvnmm};
  190. Function omvnmv(Var a: ArbFloat; n: ArbInt): ArbFloat;
  191. Var pa : ^arfloat1;
  192. i : ArbInt;
  193. norm, aa : ArbFloat;
  194. Begin
  195. If (n<1) Then
  196. exit;
  197. pa := @a;
  198. norm := 0;
  199. For i:=1 To n Do
  200. Begin
  201. aa := abs(pa^[i]);
  202. If aa>norm Then
  203. norm := aa
  204. End;
  205. omvnmv := norm
  206. End {omvnmv};
  207. Procedure omvtrm(Var a: ArbFloat; m, n, rwa: ArbInt;
  208. Var c: ArbFloat; rwc: ArbInt);
  209. Var pa, pc : ^arfloat1;
  210. ind, i, j : ArbInt;
  211. Begin
  212. If (m<1) Or (n<1) Then
  213. exit;
  214. pa := @a;
  215. pc := @c;
  216. ind := 0;
  217. For i:=1 To m Do
  218. Begin
  219. For j:=1 To n Do
  220. pc^[(j-1)*rwc+i] := pa^[ind+j];
  221. ind := ind+rwa
  222. End; {i}
  223. End; {omvtrm}
  224. End.