Develop and Download Open Source Software

Browse Subversion Repository

Contents of /arraysc.pas

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1 - (show annotations) (download) (as text)
Mon Nov 7 12:03:00 2011 UTC (12 years, 4 months ago) by shiraishikazuo
File MIME type: text/x-pascal
File size: 33104 byte(s)


1 unit arraysc;
2 {$MODE DELPHI}{$H+}
3 //{$mode objfpc}{$H+}
4 //{$DEFINE MassArrays}
5 interface
6
7 uses
8 Classes, SysUtils,
9 base2, arrays, mathc,textfile;
10
11 type
12 TComplexArray=array [0..1023] of Complex;
13 PComplexArray=^TComplexArray;
14 type
15 TArray2C=class;
16
17 TArray1C=Class(TArray1)
18 elements:PComplexArray;
19 procedure subst(a:TArray1C);
20 procedure add(a,b:TArray1C);
21 procedure sub(a,b:TArray1C);
22 procedure prod(a:TArray1C; b:TArray2C); overload;
23 procedure prod(a:TArray2C; b:TArray1C); overload;
24 procedure scalar(x:double; a:TArray1C); overload;
25 procedure scalar(x:complex; a:TArray1C); overload;
26 procedure con;overload;
27 procedure con(x:double);overload;
28 procedure con(x:complex);overload;
29 procedure zer;overload;
30 procedure zer(x:double);overload;
31 procedure zer(x:complex);overload;
32 procedure CROSS(a,b:TArray1C);
33 destructor destroy;override;
34 function InputDirective:string;
35 function NewCopy:TArray1C;
36 procedure MatPrint(ch:tTextDevice; direction:integer);override;
37 procedure MatWrite(ch:tTextDevice);override;
38 function kindlist:ansistring;
39 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
40 procedure AssignVarilen(list:TstringList);override;
41 procedure LetWithTrace(ch:tTextDevice; name: ansistring;
42 index1:complex; value: complex);
43 function Array1N:TArray1N;
44 function Array2N:TArray2N; //������������������������
45 private
46 procedure init(lb1,ub1:integer);override;
47 constructor createCopy(a:TArray1C);
48 procedure CROSSsub(a,b:TArray1C);
49 end;
50
51 TArray2C=Class(TArray2)
52 elements:PComplexArray;
53 procedure subst(a:TArray2C);
54 procedure add(a,b:TArray2C);
55 procedure sub(a,b:TArray2C);
56 procedure prod(a:TArray2C; b:TArray2C);
57 procedure INV(a:TArray2C);
58 procedure TRN(a:TArray2C);
59 procedure scalar(x:double; a:TArray2C); overload;
60 procedure scalar(x:complex;a:TArray2C); overload;
61 procedure zer;overload;
62 procedure zer(x:double);overload;
63 procedure zer(x:complex);overload;
64 procedure CON;overload;
65 procedure CON(x:double);overload;
66 procedure CON(x:complex);overload;
67 procedure IDN; overload;
68 procedure IDN(x:double);overload;
69 procedure IDN(x:complex);overload;
70 destructor destroy;override;
71 function InputDirective:string;
72 function NewCopy:TArray2C;
73 procedure MatPrint(ch:tTextDevice; direction:integer);override;
74 procedure MatWrite(ch:tTextDevice);override;
75 function kindlist:ansistring;
76 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
77 procedure LetWithTrace(ch:tTextDevice; name: ansistring;
78 index1,index2:complex; value: complex);
79
80 function Array2N:TArray2N;
81 private
82 procedure init(lb1,ub1,lb2,ub2:integer);override;
83 constructor createCopy(a:TArray2C);
84 procedure prodsub(a:TArray2C; b:TArray2C);
85 procedure TRNSub(a:TArray2C);
86 procedure determinant(var n:complex);
87 function inverse:TArray2C;
88 end;
89
90 TArray3C=Class(TArray3)
91 elements:PComplexArray;
92 procedure subst(a:TArray3C);
93 procedure add(a,b:TArray3C);
94 procedure sub(a,b:TArray3C);
95 procedure scalar(x:double; a:TArray3C);overload;
96 procedure scalar(x:complex;a:TArray3C);overload;
97 procedure zer;overload;
98 procedure zer(x:double);overload;
99 procedure zer(x:complex);overload;
100 procedure CON;overload;
101 procedure CON(x:double);overload;
102 procedure CON(x:complex);overload;
103 destructor destroy;override;
104 function InputDirective:string;
105 function NewCopy:TArray3C;
106 procedure MatPrint(ch:tTextDevice; direction:integer);override;
107 procedure MatWrite(ch:tTextDevice);override;
108 function kindlist:ansistring;
109 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
110 procedure LetWithTrace(ch:tTextDevice; name: ansistring;
111 index1,index2,index3:complex; value: complex);
112
113 private
114 procedure init(lb1,ub1,lb2,ub2,lb3, ub3:integer); override;
115 constructor createCopy(a:TArray3C);
116
117 end;
118
119 TArray4C=Class(TArray4)
120 elements:PComplexArray;
121 procedure subst(a:TArray4C);
122 procedure add(a,b:TArray4C);
123 procedure sub(a,b:TArray4C);
124 procedure scalar(x:double; a:TArray4C);overload;
125 procedure scalar(x:complex;a:TArray4C);overload;
126 procedure zer;overload;
127 procedure zer(x:double);overload;
128 procedure zer(x:complex);overload;
129 procedure CON;overload;
130 procedure CON(x:double);overload;
131 procedure CON(x:complex);overload;
132 destructor destroy;override;
133 function InputDirective:string;
134 function NewCopy:TArray4C;
135 procedure MatPrint(ch:tTextDevice; direction:integer);override;
136 procedure MatWrite(ch:tTextDevice);override;
137 function kindlist:ansistring;
138 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
139 procedure LetWithTrace(ch:tTextDevice; name: ansistring;
140 index1,index2,index3,index4:complex; value: complex);
141
142 private
143 procedure init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer); override;
144 constructor createCopy(a:TArray4C);
145
146 end;
147
148
149
150
151 function dot(a,b:TArray1C):complex; overload;
152 function DET(a:TArray2C):complex; overload;
153
154
155
156 implementation
157 uses base,vstack,float, baslibc;
158
159 procedure TArray1C.init(lb1,ub1:integer);
160 begin
161 init0(lb1,ub1);
162 if maxsize>0 then
163 {$IFDEF MassArrays}
164 Elements:=AllocMem(Maxsize*SizeOf(Complex));
165 {$ELSE}
166 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
167 {$ENDIF}
168 end;
169
170 destructor TArray1C.destroy;
171 begin
172 {$IFDEF MassArrays}
173 FreeMem(Elements,Maxsize*SizeOf(Complex));
174 {$ELSE}
175 FreeMemory(Maxsize*SizeOf(Complex));
176 {$ENDIF}
177 inherited destroy;
178 end;
179
180
181 constructor TArray1C.createCopy(a:TArray1C);
182 var
183 i:integer;
184 begin
185 TArray.create;
186 Lbound1:=a.Lbound1;
187 Size1:=a.Size1;
188 Maxsize:=Size1;
189 if maxsize>0 then
190 begin
191 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
192 for i:=0 to maxsize-1 do
193 elements^[i]:=a.elements^[i];
194 end;
195 end;
196
197 function TArray1C.NewCopy:TArray1C;
198 begin
199 result:=TArray1C.createCopy(self)
200 end;
201
202
203 procedure TArray2C.init(lb1,ub1,lb2,ub2:integer);
204 begin
205 init0(lb1,ub1,lb2,ub2);
206 if maxsize>0 then
207 {$IFDEF MassArrays}
208 Elements:=AllocMem(Maxsize*SizeOf(Complex));
209 {$ELSE}
210 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
211 {$ENDIF}
212 end;
213
214 destructor TArray2C.destroy;
215 begin
216 {$IFDEF MassArrays}
217 FreeMem(Elements,Maxsize*SizeOf(Complex));
218 {$ELSE}
219 FreeMemory(Maxsize*SizeOf(Complex));
220 {$ENDIF}
221 inherited destroy;
222 end;
223
224 constructor TArray2C.createCopy(a:TArray2C);
225 var
226 i:integer;
227 begin
228 TArray.create;
229 Lbound1:=a.Lbound1;
230 Size1:=a.Size1;
231 Lbound2:=a.Lbound2;
232 Size2:=a.Size2;
233 Maxsize:=Size1*size2;
234 if maxsize>0 then
235 begin
236 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
237 for i:=0 to maxsize-1 do
238 elements^[i]:=a.elements^[i];
239 end;
240 end;
241
242 function TArray2C.NewCopy:TArray2C;
243 begin
244 result:=TArray2C.createCopy(self)
245 end;
246
247 procedure TArray3C.init(lb1,ub1,lb2,ub2,lb3, ub3:integer);
248 begin
249 init0(lb1,ub1,lb2,ub2,lb3,ub3);
250 if maxsize>0 then
251 {$IFDEF MassArrays}
252 Elements:=AllocMem(Maxsize*SizeOf(Complex));
253 {$ELSE}
254 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
255 {$ENDIF}
256 end;
257
258 destructor TArray3C.destroy;
259 begin
260 {$IFDEF MassArrays}
261 FreeMem(Elements,Maxsize*SizeOf(Complex));
262 {$ELSE}
263 FreeMemory(Maxsize*SizeOf(Complex));
264 {$ENDIF}
265 inherited destroy;
266 end;
267 constructor TArray3C.createCopy(a:TArray3C);
268 var
269 i:integer;
270 begin
271 TArray.create;
272 Lbound1:=a.Lbound1;
273 Size1:=a.Size1;
274 Lbound2:=a.Lbound2;
275 Size2:=a.Size2;
276 Lbound3:=a.Lbound3;
277 Size3:=a.Size3;
278 Maxsize:=Size1*size2*size3;
279 if maxsize>0 then
280 begin
281 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
282 for i:=0 to maxsize-1 do
283 elements^[i]:=a.elements^[i];
284 end;
285 end;
286
287 function TArray3C.NewCopy:TArray3C;
288 begin
289 result:=TArray3C.createCopy(self)
290 end;
291
292
293
294
295
296 procedure TArray4C.init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);
297 begin
298 init0(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4);
299 if maxsize>0 then
300 {$IFDEF MassArrays}
301 Elements:=AllocMem(Maxsize*SizeOf(Complex));
302 {$ELSE}
303 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
304 {$ENDIF}
305 end;
306
307 destructor TArray4C.destroy;
308 begin
309 {$IFDEF MassArrays}
310 FreeMem(Elements,Maxsize*SizeOf(Complex));
311 {$ELSE}
312 FreeMemory(Maxsize*SizeOf(Complex));
313 {$ENDIF}
314 inherited destroy;
315 end;
316
317 constructor TArray4C.createCopy(a:TArray4C);
318 var
319 i:integer;
320 begin
321 TArray.create;
322 Lbound1:=a.Lbound1;
323 Size1:=a.Size1;
324 Lbound2:=a.Lbound2;
325 Size2:=a.Size2;
326 Lbound3:=a.Lbound3;
327 Size3:=a.Size3;
328 Lbound4:=a.Lbound3;
329 Size4:=a.Size4;
330 Maxsize:=Size1*size2*size3*size4;
331 if maxsize>0 then
332 begin
333 Elements:=GetZeroMemory(Maxsize*SizeOf(Complex));
334 for i:=0 to maxsize-1 do
335 elements^[i]:=a.elements^[i];
336 end;
337 end;
338
339 function TArray4C.NewCopy:TArray4C;
340 begin
341 result:=TArray4C.createCopy(self)
342 end;
343
344
345 {**************}
346 {MAT OPERATIONS}
347 {**************}
348
349 procedure TArray1C.subst(a:TArray1C);
350 var
351 i:integer;
352 begin
353 if a.size1>maxsize then setexception(5001);
354 Size1:=a.Size1;
355 for i:=0 to a.size1-1 do
356 elements^[i]:=a.elements^[i]
357
358 end;
359
360 procedure TArray1C.add(a,b:TArray1C);
361 var
362 c:TArray1C;
363 i:integer;
364 begin
365 if (a.Size1<>b.Size1) then
366 setexception(6001);
367 if a.Size>MaxSize then
368 setexception(5001);
369 c:=TArray1C.create(1,a.size1);
370 try
371 for i:=0 to c.size-1 do
372 c.elements^[i]:=a.elements^[i]+b.elements^[i];
373 subst(c)
374 finally
375 c.free;
376 end;
377 end;
378
379 procedure TArray1C.sub(a,b:TArray1C);
380 var
381 c:TArray1C;
382 i:integer;
383 begin
384 if (a.Size1<>b.Size1) then
385 setexception(6001);
386 if a.Size>MaxSize then
387 setexception(5001);
388 c:=TArray1C.create(1,a.size1);
389 try
390 for i:=0 to c.size-1 do
391 c.elements^[i]:=a.elements^[i]-b.elements^[i];
392 subst(c)
393 finally
394 c.free;
395 end;
396 end;
397
398 procedure TArray1C.prod(a:TArray1C; b:TArray2C); overload;
399 var
400 i,j:integer;
401 c:TArray1C;
402 begin
403 if a.size1<>b.size1 then setexception(6001);
404 if maxsize<b.size2 then setexception(5001);
405 c:=TArray1C.create(1, b.size2);
406 //c.zer;
407 try
408 for j:=0 to b.size2-1 do
409 for i:=0 to b.size1 -1 do
410 c.elements^[j]:=c.elements^[j]+ a.elements^[i]*b.elements^[i*b.size2+j];
411 subst(c);
412 finally
413 c.free;
414 end;
415
416 end;
417
418 procedure TArray1C.prod(a:TArray2C; b:TArray1C); overload;
419 var
420 i,j:integer;
421 c:TArray1C;
422 begin
423 if a.size2<>b.size1 then setexception(6001);
424 if maxsize<a.size1 then setexception(5001);
425 c:=TArray1C.create(1, a.size1);
426 //c.zer;
427 try
428 for i:=0 to a.size1-1 do
429 for j:=0 to a.size2 -1 do
430 c.elements^[i]:=c.elements^[i]+ a.elements^[i*a.size2+j]*b.elements^[j];
431 subst(c);
432 finally
433 c.free;
434 end;
435 end;
436
437 procedure TArray1C.scalar(x:double; a:TArray1C);
438 var
439 i:integer;
440 begin
441 subst(a);
442 for i:=0 to size-1 do
443 elements^[i]:=x*elements^[i]
444 end;
445
446 procedure TArray1C.scalar(x:complex; a:TArray1C);
447 var
448 i:integer;
449 begin
450 subst(a);
451 for i:=0 to size-1 do
452 elements^[i]:=x*elements^[i]
453 end;
454
455 procedure TArray1C.CON(x:double);
456 var
457 i:integer;
458 begin
459 for i:=0 to size-1 do
460 elements^[i]:=x
461 end;
462
463 procedure TArray1C.CON(x:complex);
464 var
465 i:integer;
466 begin
467 for i:=0 to size-1 do
468 elements^[i]:=x
469 end;
470
471 procedure TArray1C.CON;
472 begin
473 CON(1)
474 end;
475
476 procedure TArray1C.zer;overload;
477 var
478 i:integer;
479 begin
480 for i:=0 to size1-1 do
481 elements^[i]:=0;
482 end;
483
484 procedure TArray1C.zer(x:double);overload;
485 begin
486 zer
487 end;
488
489 procedure TArray1C.zer(x:complex);overload;
490 begin
491 zer
492 end;
493
494 procedure TArray1C.CROSSsub(a,b:TArray1C);
495 var
496 i:integer;
497 x,y:complex;
498 begin
499 for i:=0 to 2 do
500 begin
501 elements^[i mod 3]:=0;
502 x:=a.elements^[(i+1) mod 3];
503 x:=x*b.elements^[(i+2) mod 3];
504 y:=b.elements^[(i+1) mod 3];
505 y:=y*a.elements^[(i+2) mod 3];
506 elements^[i mod 3]:=elements^[i mod 3]+x-y;
507 end;
508 end;
509
510 procedure TArray1C.CROSS(a,b:TArray1C);
511 var
512 c:TArray1C;
513 begin
514 if (a.size<3) or (b.size<3) then setexception(6001);
515 if MaxSize<3 then setexception(5001);
516 c:=TArray1C.create(1,3);
517 try
518 c.CrossSub(a,b);
519 subst(c);
520 finally
521 c.free;
522 end;
523 end;
524
525
526
527 procedure TArray2C.subst(a:TArray2C);
528 var
529 i:integer;
530 begin
531 if a.Size>MaxSize then
532 setexception(5001);
533 resize(a.size1,a.size2);
534 for i:=0 to size-1 do
535 elements^[i]:=A.elements^[i]
536
537 end;
538
539 procedure TArray2C.add(a,b:TArray2C);
540 var
541 c:TArray2C;
542 i:integer;
543 begin
544 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) then
545 setexception(6001);
546 if a.Size>MaxSize then
547 setexception(5001);
548 c:=TArray2C.create(1, a.size1, 1, a.size2);
549 try
550 for i:=0 to c.size-1 do
551 c.elements^[i]:=a.elements^[i]+b.elements^[i];
552 subst(c)
553 finally
554 c.free;
555 end;
556 end;
557
558
559 procedure TArray2C.sub(a,b:TArray2C);
560 var
561 c:TArray2C;
562 i:integer;
563 begin
564 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) then
565 setexception(6001);
566 if a.Size>MaxSize then
567 setexception(5001);
568 c:=TArray2C.create(1, a.size1, 1, a.size2);
569 try
570 for i:=0 to c.size-1 do
571 c.elements^[i]:=a.elements^[i]-b.elements^[i];
572 subst(c)
573 finally
574 c.free;
575 end;
576 end;
577
578 procedure TArray2C.ProdSub(a:TArray2C; b:TArray2C);
579 var
580 i,j,k:integer;
581 begin
582 for i:=0 to size1-1 do
583 for j:=0 to size2-1 do
584 for k:=0 to a.size2-1 do
585 elements^[size2*i+j]:=elements^[Size2*i+j]+a.elements^[a.Size2*i+k]*b.elements^[b.size2*k+j];
586 end;
587 procedure TArray2C.prod(a:TArray2C; b:TArray2C);
588 var
589 c:TArray2C;
590 //i,j,k:integer;
591 begin
592 if (a.Size2<>b.Size1) then
593 setexception(6001);
594 if a.Size1 * b.Size2 >MaxSize then
595 setexception(5001);
596 c:=TArray2C.create(1, a.size1, 1, b.size2);
597 try
598 c.ProdSub(a,b);
599 subst(c);
600 finally
601 c.free;
602 end;
603 end;
604
605 procedure TArray2C.INV(a:TArray2C);
606 var
607 c:TArray2C;
608 begin
609 c:=a.inverse;
610 subst(c);
611 c.free;
612 end;
613
614 procedure TArray2C.TRNSub(a:TArray2C);
615 var
616 i,j:integer;
617 begin
618 for i:=0 to size1 -1 do
619 for j:=0 to size2 -1 do
620 elements^[j+size2*i]:=a.elements^[i+a.Size2*j];
621 end;
622
623 procedure TArray2C.TRN(a:TArray2C);
624 var
625 c:TArray2C;
626 begin
627 c:=TArray2C.create(1, a.Size2, 1, a.size1);
628 c.TRNSub(a);
629 subst(c)
630 end;
631
632 procedure TArray2C.scalar(x:double; a:TArray2C);
633 var
634 i:integer;
635 begin
636 subst(a);
637 for i:=0 to size-1 do
638 elements^[i]:=x*elements^[i]
639 end;
640
641 procedure TArray2C.scalar(x:complex; a:TArray2C);
642 var
643 i:integer;
644 begin
645 subst(a);
646 for i:=0 to size-1 do
647 elements^[i]:=x*elements^[i]
648 end;
649
650 procedure TArray2C.con;
651 begin
652 CON(1)
653 end;
654
655 procedure TArray2C.con(x:double);
656 var
657 i:integer;
658 begin
659 for i:=0 to size-1 do
660 elements^[i]:=x
661 end;
662
663 procedure TArray2C.con(x:complex);
664 var
665 i:integer;
666 begin
667 for i:=0 to size-1 do
668 elements^[i]:=x
669 end;
670
671 procedure TArray2C.zer;overload;
672 var
673 i:integer;
674 begin
675 for i:=0 to size-1 do
676 elements^[i]:=0;
677 end;
678
679 procedure TArray2C.zer(x:double);overload;
680 begin
681 zer
682 end;
683
684 procedure TArray2C.zer(x:complex);overload;
685 begin
686 zer
687 end;
688
689
690 procedure TArray2C.IDN; overload;
691 begin
692 IDN(1)
693 end;
694
695 procedure TArray2C.IDN(x:double);overload;
696 var
697 i:integer;
698 begin
699 if size1<>size2 then setexception(6004);
700 zer;
701 for i:=0 to size1-1 do
702 elements^[i+size2*i]:=x
703 end;
704
705 procedure TArray2C.IDN(x:complex);overload;
706 var
707 i:integer;
708 begin
709 if size1<>size2 then setexception(6004);
710 zer;
711 for i:=0 to size1-1 do
712 elements^[i+size2*i]:=x
713 end;
714
715
716 procedure TArray3C.subst(a:TArray3C);
717 var
718 i:integer;
719 begin
720 if a.Size>MaxSize then
721 setexception(5001);
722 resize(a.size1,a.size2,a.size3);
723 for i:=0 to size-1 do
724 elements^[i]:=a.elements^[i]
725
726 end;
727
728 procedure TArray3C.add(a,b:TArray3C);
729 var
730 c:TArray3C;
731 i:integer;
732 begin
733 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)then
734 setexception(6001);
735 if a.Size>MaxSize then
736 setexception(5001);
737 c:=TArray3C.create(1, a.size1, 1, a.size2, 1, a.size3);
738 try
739 for i:=0 to c.size-1 do
740 c.elements^[i]:=a.elements^[i]+b.elements^[i];
741 subst(c)
742 finally
743 c.free;
744 end;
745 end;
746
747
748 procedure TArray3C.sub(a,b:TArray3C);
749 var
750 c:TArray3C;
751 i:integer;
752 begin
753 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)then
754 setexception(6001);
755 if a.Size>MaxSize then
756 setexception(5001);
757 c:=TArray3C.create(1, a.size1, 1, a.size2, 1, a.size3);
758 try
759 for i:=0 to c.size-1 do
760 c.elements^[i]:=a.elements^[i]-b.elements^[i];
761 subst(c)
762 finally
763 c.free;
764 end;
765 end;
766
767
768 procedure TArray3C.scalar(x:double; a:TArray3C);
769 var
770 i:integer;
771 begin
772 subst(a);
773 for i:=0 to size-1 do
774 elements^[i]:=x*elements^[i]
775 end;
776
777 procedure TArray3C.scalar(x:complex; a:TArray3C);
778 var
779 i:integer;
780 begin
781 subst(a);
782 for i:=0 to size-1 do
783 elements^[i]:=x*elements^[i]
784 end;
785
786 procedure TArray3C.con;
787 begin
788 CON(1)
789 end;
790
791 procedure TArray3C.con(x:double);
792 var
793 i:integer;
794 begin
795 for i:=0 to size-1 do
796 elements^[i]:=x
797 end;
798
799 procedure TArray3C.con(x:complex);
800 var
801 i:integer;
802 begin
803 for i:=0 to size-1 do
804 elements^[i]:=x
805 end;
806
807 procedure TArray3C.zer;overload;
808 var
809 i:integer;
810 begin
811 for i:=0 to size-1 do
812 elements^[i]:=0;
813 end;
814
815 procedure TArray3C.zer(x:double);overload;
816 begin
817 zer
818 end;
819
820 procedure TArray3C.zer(x:complex);overload;
821 begin
822 zer
823 end;
824
825
826
827 procedure TArray4C.subst(a:TArray4C);
828 var
829 i:integer;
830 begin
831 if a.Size>MaxSize then
832 setexception(5001);
833 resize(a.size1,a.size2,a.size3,a.size4);
834 for i:=0 to size-1 do
835 elements^[i]:=a.elements^[i]
836
837 end;
838
839 procedure TArray4C.add(a,b:TArray4C);
840 var
841 c:TArray4C;
842 i:integer;
843 begin
844 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)
845 or (a.Size4<>b.Size4)then
846 setexception(6001);
847 if a.Size>MaxSize then
848 setexception(5001);
849 c:=TArray4C.create(1, a.size1, 1, a.size2, 1, a.size3, 1, a.size4);
850 try
851 for i:=0 to c.size-1 do
852 c.elements^[i]:=a.elements^[i]+b.elements^[i];
853 subst(c)
854 finally
855 c.free;
856 end;
857 end;
858
859
860 procedure TArray4C.sub(a,b:TArray4C);
861 var
862 c:TArray4C;
863 i:integer;
864 begin
865 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)
866 or (a.Size4<>b.Size4)then
867 setexception(6001);
868 if a.Size>MaxSize then
869 setexception(5001);
870 c:=TArray4C.create(1, a.size1, 1, a.size2, 1, a.size3, 1, a.size4);
871 try
872 for i:=0 to c.size-1 do
873 c.elements^[i]:=a.elements^[i]-b.elements^[i];
874 subst(c)
875 finally
876 c.free;
877 end;
878 end;
879
880
881 procedure TArray4C.scalar(x:double; a:TArray4C);
882 var
883 i:integer;
884 begin
885 subst(a);
886 for i:=0 to size-1 do
887 elements^[i]:=x*elements^[i]
888 end;
889
890 procedure TArray4C.scalar(x:complex; a:TArray4C);
891 var
892 i:integer;
893 begin
894 subst(a);
895 for i:=0 to size-1 do
896 elements^[i]:=x*elements^[i]
897 end;
898
899 procedure TArray4C.con;
900 begin
901 CON(1)
902 end;
903
904 procedure TArray4C.con(x:double);
905 var
906 i:integer;
907 begin
908 for i:=0 to size-1 do
909 elements^[i]:=x
910 end;
911
912 procedure TArray4C.con(x:complex);
913 var
914 i:integer;
915 begin
916 for i:=0 to size-1 do
917 elements^[i]:=x
918 end;
919
920 procedure TArray4C.zer;overload;
921 var
922 i:integer;
923 begin
924 for i:=0 to size-1 do
925 elements^[i]:=0;
926 end;
927
928 procedure TArray4C.zer(x:double);overload;
929 begin
930 zer
931 end;
932
933 procedure TArray4C.zer(x:complex);overload;
934 begin
935 zer
936 end;
937
938 {*******}
939 {MAT I/O}
940 {*******}
941
942 procedure TArray1C.MatPrint(ch:tTextDevice; direction:integer);
943 var
944 i:integer;
945 begin
946 ch.newlineifneed;
947 for i:=0 to size1 -1 do
948 begin
949 if direction<>0 then ch.NewZone;
950 ch.AppendStrV2(CStr(elements^[i])+' ')
951 end;
952 ch.newline;
953 ch.newline;
954 end;
955
956 procedure TArray2C.MatPrint(ch:tTextDevice; direction:integer);
957 var
958 i,j:integer;
959 begin
960 ch.newlineifneed;
961 for i:=0 to size1 -1 do
962 begin
963 for j:=0 to size2-1 do
964 begin
965 if direction<>0 then ch.NewZone;
966 ch.AppendStrV2(CStr(elements^[i*size2 + j])+' ')
967 end;
968 ch.newline;
969 end;
970 ch.newline
971 end;
972
973 procedure TArray3C.MatPrint(ch:tTextDevice; direction:integer);
974 var
975 i,j,k:integer;
976 begin
977 ch.newlineifneed;
978 for i:=0 to size1 -1 do
979 begin
980 for j:=0 to size2-1 do
981 begin
982 for k:=0 to size3-1 do
983 begin
984 if direction<>0 then ch.NewZone;
985 ch.AppendStrV2(CSTR(elements^[(i*size2 + j)*size3 + k ])+' ')
986 end;
987 ch.newline;
988 end;
989 ch.newline;
990 end;
991 end;
992
993 procedure TArray4C.MatPrint(ch:tTextDevice; direction:integer);
994 var
995 i,j,k,l:integer;
996 begin
997 ch.newlineifneed;
998 for i:=0 to size1 -1 do
999 begin
1000 for j:=0 to size2-1 do
1001 begin
1002 for k:=0 to size3-1 do
1003 begin
1004 for l:=0 to size4-1 do
1005 begin
1006 if direction<>0 then ch.NewZone;
1007 ch.AppendStrV2(CSTR(elements^[((i*size2 + j)*size3 + k)*size4 +l ])+' ')
1008 end;
1009 ch.newline;
1010 end;
1011 ch.newline;
1012 end;
1013 ch.newline;
1014 end;
1015 end;
1016
1017 procedure TArray1C.MatWrite(ch:tTextDevice);
1018 var
1019 i:integer;
1020 begin
1021 for i:=0 to size1 -1 do
1022 begin
1023 if i>0 then
1024 ch.WriteSeparator(false);
1025 ch.AppendStrV2(elements^[i])
1026 end;
1027 end;
1028
1029 procedure TArray2C.MatWrite(ch:tTextDevice);
1030 var
1031 i:integer;
1032 begin
1033 for i:=0 to size -1 do
1034 begin
1035 if i>0 then
1036 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
1037 ch.AppendStrV2(elements^[i])
1038 end;
1039 end;
1040
1041 procedure TArray3C.MatWrite(ch:tTextDevice);
1042 var
1043 i:integer;
1044 begin
1045 for i:=0 to size -1 do
1046 begin
1047 if i>0 then
1048 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
1049 ch.AppendStrV2(elements^[i])
1050 end;
1051 end;
1052
1053 procedure TArray4C.MatWrite(ch:tTextDevice);
1054 var
1055 i:integer;
1056 begin
1057 for i:=0 to size -1 do
1058 begin
1059 if i>0 then
1060 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
1061 ch.AppendStrV2(elements^[i])
1062 end;
1063 end;
1064
1065 procedure TArray1C.Read(list:TStringList;var p:integer); //list���p���������������������
1066 var
1067 i:integer;
1068 begin
1069 for i:=0 to size-1 do
1070 begin
1071 elements^[i]:=StrToFloat(list.Strings[p]);
1072 inc(p)
1073 end;
1074 end;
1075
1076 procedure TArray2C.Read(list:TStringList;var p:integer); //list���p���������������������
1077 var
1078 i:integer;
1079 begin
1080 for i:=0 to size-1 do
1081 begin
1082 elements^[i]:=StrToFloat(list.Strings[p]);
1083 inc(p)
1084 end;
1085 end;
1086
1087 procedure TArray3C.Read(list:TStringList;var p:integer); //list���p���������������������
1088 var
1089 i:integer;
1090 begin
1091 for i:=0 to size-1 do
1092 begin
1093 elements^[i]:=StrToFloat(list.Strings[p]);
1094 inc(p)
1095 end;
1096 end;
1097
1098 procedure TArray4C.Read(list:TStringList;var p:integer); //list���p���������������������
1099 var
1100 i:integer;
1101 begin
1102 for i:=0 to size-1 do
1103 begin
1104 elements^[i]:=StrToFloat(list.Strings[p]);
1105 inc(p)
1106 end;
1107 end;
1108
1109 function TArray1C.kindlist:ansistring;
1110 begin
1111 result:=StringOfChar('n',size);
1112 end;
1113
1114 function TArray2C.kindlist:ansistring;
1115 begin
1116 result:=StringOfChar('n',size);
1117 end;
1118
1119 function TArray3C.kindlist:ansistring;
1120 begin
1121 result:=StringOfChar('n',size);
1122 end;
1123
1124 function TArray4C.kindlist:ansistring;
1125 begin
1126 result:=StringOfChar('n',size);
1127 end;
1128
1129 function TArray1C.InputDirective:string;
1130 begin
1131 result:=StringOfChar('n',size1);
1132 end;
1133
1134 function TArray2C.InputDirective:string;
1135 begin
1136 result:=StringOfChar('n',size1*Size2);
1137 end;
1138
1139 function TArray3C.InputDirective:string;
1140 begin
1141 result:=StringOfChar('n',size1*Size2*Size3);
1142 end;
1143
1144 function TArray4C.InputDirective:string;
1145 begin
1146 result:=StringOfChar('n',size1*Size2*Size3*size4);
1147 end;
1148
1149 procedure TArray1C.AssignVarilen(list:TstringList);
1150 var
1151 i:integer;
1152 begin
1153 ReSize(list.count);
1154 with list do
1155 for i:=0 to Count-1 do
1156 elements^[i]:=StrToFloat(Strings[i]);
1157 end;
1158
1159 {**********}
1160 { DOT & DET}
1161 {**********}
1162
1163 function dot(a,b:TArray1C):complex;
1164 var
1165 i:integer;
1166 begin
1167 if a.size1<>b.size1 then setexception(6001);
1168 result:=0;
1169 try
1170 for i:=0 to a.size-1 do
1171 result:=result+a.elements^[i]*b.elements^[i]
1172 except
1173 on EOverFlow do
1174 begin
1175 {$IFNDEF Windows} asm finit end; set8087cw(controlword); {$ENDIF}
1176 raise EExtype.create(1009)
1177 end;
1178 end;
1179 end;
1180
1181 function DET(a:TArray2C):complex;
1182 begin
1183 a.Determinant(result)
1184 end;
1185
1186 {**************}
1187 {INVERSE MATRIX}
1188 {**************}
1189
1190
1191 procedure matinv(size:integer; p:PcomplexArray; pv:PIntArray; var det:complex);
1192 {$MAXFPUREGISTERS 0}
1193 function a(i,j:integer):Pcomplex;
1194 begin
1195 result:=@p^[i+j*size]
1196 end;
1197 var
1198 i,j,k,tmp:integer;
1199 t,u,temp:complex;
1200 eps:double;
1201 label
1202 EXIT;
1203 begin
1204 eps:=1; FEPS(eps); eps:=eps/2;
1205 for k:=0 to size-1 do pv^[k]:=k;
1206 det:=1;
1207 for k:=0 to size-1 do
1208 begin
1209 i:=k;
1210 while (i<size) and (a(i,k)^=0.0) do inc(i);
1211 if i=size then
1212 begin det:=0.0; goto EXIT end
1213 else if i<>k then
1214 begin
1215 tmp:=pv^[i]; pv^[i]:=pv^[k]; pv^[k]:=tmp;
1216 for j:=0 to size-1 do
1217 begin temp:=a(i,j)^; a(i,j)^:=a(k,j)^; a(k,j)^:=temp end;
1218 det:=-det;
1219 end;
1220
1221 t:=a(k,k)^;
1222 det:=det*t;
1223 for i:=0 to size-1 do
1224 a(k,i)^:=a(k,i)^/t;
1225 a(k,k)^:=1.0/t;
1226 for j:=0 to size-1 do
1227 if j<>k then
1228 begin
1229 u:=a(j,k)^;
1230 for i:=0 to k-1 do
1231 begin
1232 a(j,i)^:=a(j,i)^-a(k,i)^*u;
1233 end;
1234 a(j,k)^:=-u/t;
1235 for i:=k+1 to size-1 do
1236 begin
1237 temp:=a(j,i)^-a(k,i)^*u;
1238 if mathc.abs(temp)<mathc.abs(a(j,i)^)*EPS then temp:=0;
1239 a(j,i)^:=temp;
1240 end
1241 end;
1242 idle;
1243 end;
1244 EXIT:
1245 end;
1246
1247 procedure TArray2C.determinant(var n:complex);
1248 {$MAXFPUREGISTERS 0}
1249 var
1250 i,j:integer;
1251 det:complex;
1252 a:PcomplexArray;
1253 pv:PIntArray;
1254 begin
1255 if size1=size2 then
1256 begin
1257 getmem(pv,size1*sizeof(integer));
1258 getmem(a,size1*size2*sizeof(complex));
1259 try
1260 for i:=0 to size1-1 do
1261 for j:=0 to size2-1 do
1262 a^[i+j*size1]:=elements^[i*size2+j];
1263 matinv(size1,a,pv,det);
1264 n:=det;
1265 finally
1266 freemem(a,size1*size2*sizeof(complex));
1267 freemem(pv,size1*sizeof(integer));
1268 end
1269 end
1270 else
1271 setexception(6002);
1272 end;
1273
1274 function TArray2C.inverse:TArray2C;
1275 var
1276 i,j:integer;
1277 det:complex;
1278 p:PcomplexArray;
1279 pv:PIntArray;
1280 begin
1281 result:=nil;
1282 if size1=size2 then
1283 begin
1284 getmem(pv,size1*sizeof(integer)+size1*size2*sizeof(complex));
1285 try
1286 try
1287 p:=@pv^[size1];
1288 for i:=0 to size1-1 do
1289 for j:=0 to size2-1 do
1290 p^[i+j*size1]:=elements^[i*size2+j];
1291 matinv(size1,p,pv,det);
1292 if det=0 then
1293 setexception(3009)
1294 else
1295 begin
1296 result:=NewCopy;
1297 if result=nil then
1298 setexception(ArraySizeOverflow)
1299 else
1300 begin
1301 try
1302 for i:=0 to size1-1 do
1303 for j:=0 to size2-1 do
1304 result.elements^[i*size2+pv^[j]]:=p^[i+j*size1];
1305 except
1306 on EMathError do
1307 begin
1308 {$IFNDEF Windows} asm finit end; set8087cw(controlword); {$ENDIF}
1309 end;
1310 on EDivByZero do
1311 begin
1312 {$IFNDEF Windows} asm finit end; set8087cw(controlword); {$ENDIF}
1313 end;
1314 end;
1315 end;
1316 end;
1317 finally
1318 freemem(pv,size1*sizeof(integer)+size1*size2*sizeof(complex));
1319 end
1320 except
1321 result.free;
1322 result:=nil;
1323 raise;
1324 end;
1325 end
1326 else
1327 setexception(6003);
1328 end;
1329
1330 function TArray1C.Array1N:TArray1N;
1331 var
1332 i:integer;
1333 begin
1334 result:=TArray1N.create(Lbound,Ubound);
1335 try
1336 for i:=0 to size1 -1 do
1337 result.elements^[i]:=testreal(elements^[i]);
1338 except
1339 result.free;
1340 result:=nil;
1341 raise;
1342 end;
1343 end;
1344
1345 function TArray1C.Array2N:TArray2N;
1346 var
1347 i:integer;
1348 begin
1349 result:=TArray2N.create(Lbound,Ubound, 0,1);
1350 try
1351 for i:=0 to size1 -1 do
1352 begin
1353 result.elements^[i*2]:=(elements^[i]).x;
1354 result.elements^[i*2+1]:=(elements^[i]).y;
1355 end;
1356 except
1357 result.free;
1358 result:=nil;
1359 raise;
1360 end;
1361 end;
1362
1363
1364 function TArray2C.Array2N:TArray2N;
1365 var
1366 i:integer;
1367 begin
1368 result:=TArray2N.create(Lbound(1),Ubound(1), Lbound(2), Ubound(2));
1369 try
1370 for i:=0 to size - 1 do
1371 result.elements^[i]:=testreal(elements^[i]);
1372 except
1373 result.free;
1374 result:=nil;
1375 raise;
1376 end;
1377 end;
1378
1379 procedure TArray1C.LetWithTrace(ch:tTextDevice; name: ansistring; index1:complex; value: complex);
1380 begin
1381 elements^[index(index1)]:=value;
1382 ch.PRINT([],rsNone, false ,[' '+name+'('+Format17(LongintRound(testreal(index1)))+')=',
1383 TComplex.create(value), TNewLine.create]);
1384 end;
1385
1386 procedure TArray2C.LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2:complex; value: complex);
1387 begin
1388 elements^[index(index1,index2)]:=value;
1389 ch.PRINT([],rsNone, false ,[' '+name+'('+Format17(LongintRound(testreal(index1)))+ ','+
1390 Format17(LongintRound(testreal(index2)))+ ')=',
1391 TComplex.create(value), TNewLine.create]);
1392 end;
1393
1394 procedure TArray3C.LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2,index3:complex; value: complex);
1395 begin
1396 elements^[index(index1,index2,index3)]:=value;
1397 ch.PRINT([],rsNone, false ,[' '+name+'('+Format17(LongintRound(testreal(index1)))+ ','+
1398 Format17(LongintRound(testreal(index2)))+ ','+
1399 Format17(LongintRound(testreal(index3)))+ ')=',
1400 TComplex.create(value), TNewLine.create]);
1401 end;
1402
1403 procedure TArray4C.LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2,index3,index4:complex; value: complex);
1404 begin
1405 elements^[index(index1,index2,index3,index4)]:=value;
1406 ch.PRINT([],rsNone, false ,[' '+name+'('+Format17(LongintRound(testreal(index1)))+ ','+
1407 Format17(LongintRound(testreal(index2)))+ ','+
1408 Format17(LongintRound(testreal(index3)))+ ','+
1409 Format17(LongintRound(testreal(index4)))+ ')=',
1410 TComplex.create(value), TNewLine.create]);
1411 end;
1412
1413 end.
1414

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26