Develop and Download Open Source Software

Browse Subversion Repository

Contents of /arrays.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: 78358 byte(s)


1 unit arrays;
2 {$IFDEF FPC}
3 {$MODE DELPHI}{$H+}
4 {$ENDIF}
5
6 (***************************************)
7 (* Copyright (C) 2009, SHIRAISHI Kazuo *)
8 (***************************************)
9
10 interface
11
12 uses
13 Classes, SysUtils,
14 base2,textfile,mathC;
15
16 type
17 TDoubleArray=array [0..1023] of Double;
18 PDoubleArray=^TDoubleArray;
19
20 type
21 TArray=class(TObject)
22 MaxSize:integer;
23 class function NewInstance: TObject;override;
24 procedure FreeInstance;override;
25 constructor createNul;
26 procedure MatPrint(ch:tTextDevice; direction:integer);virtual;abstract;
27 procedure MatWrite(ch:tTextDevice);virtual;abstract;
28 procedure Read(list:TStringList;var p:integer);virtual;abstract;
29 end;
30
31 TArray1=Class(TArray)
32 Lbound1:integer;
33 Size1 :integer;
34 constructor create(x1,x2:double);overload;
35 constructor create(x1,x2:integer);overload;
36 procedure dim(x1,x2:integer);overload;
37 procedure dim(x1,x2:double);overload;
38 procedure resize(s1:integer);overload;
39 procedure resize(x1:double);overload;
40 procedure redim(x:double);overload;
41 procedure redim(x1,x2:double);overload; // change lbound
42 function Size:integer;overload;
43 function Size(d:Double):integer;overload;
44 function Lbound:integer;overload;
45 function Ubound:integer;overload;
46 function Lbound(d:Double):integer;overload;
47 function Ubound(d:Double):integer;overload;
48 function index(x:integer):integer;overload;
49 function index(x:double):integer;overload;
50 function index(x:complex):integer;overload;
51 procedure AssignVarilen(list:TstringList);virtual;abstract;
52 protected
53 procedure init(lb1,ub1:integer);virtual;abstract;
54 procedure init0(lb1,ub1:integer);
55 end;
56
57 TArray2=Class(TArray)
58 Lbound1:integer;
59 Size1 :integer;
60 Lbound2:integer;
61 Size2 :integer;
62 constructor create(x1,x2,y1,y2:double);overload;
63 constructor create(x1,x2,y1,y2:integer);overload;
64 procedure dim(x1,x2,y1,y2:double);overload;
65 procedure dim(x1,x2,y1,y2:integer);overload;
66 procedure resize(s1,s2:integer);overload;
67 procedure resize(x1,x2:double);overload;
68 procedure resize(x1:double);overload; // x1���x1���
69 procedure redim(x,y:double);overload;
70 procedure redim(x1,x2,y1,y2:double);overload;
71 function Size:integer;overload;
72 function Size(d:Double):integer;overload;
73 function Lbound(d:Double):integer;
74 function Ubound(d:Double):integer;
75 function index(x,y:integer):integer;overload;
76 function index(x,y:double):integer;overload;
77 function index(x:double; y:complex):integer;overload;
78 function index(x:complex; y:double):integer;overload;
79 function index(x,y:complex):integer;overload;
80 protected
81 procedure init(lb1,ub1,lb2,ub2:integer);virtual;abstract;
82 procedure init0(lb1,ub1,lb2,ub2:integer);
83 end;
84
85 TArray3=Class(TArray)
86 Lbound1:integer;
87 Size1 :integer;
88 Lbound2:integer;
89 Size2 :integer;
90 Lbound3:integer;
91 Size3 :integer;
92 constructor create(x1,x2,y1,y2,z1,z2:double);
93 procedure dim(x1,x2,y1,y2,z1,z2:double);overload;
94 procedure dim(x1,x2,y1,y2,z1,z2:integer);overload;
95 procedure resize(s1,s2,s3:integer);overload;
96 procedure resize(x1,x2,x3:double);overload;
97 procedure redim(x,y,z:double);overload;
98 procedure redim(x1,x2,y1,y2,z1,z2:double);overload; //change Lbounds
99 function Size:integer;overload;
100 function Size(d:Double):integer;overload;
101 function Lbound(d:Double):integer;
102 function Ubound(d:Double):integer;
103 function index(x,y,z:integer):integer; overload;
104 function index(x,y,z:double):integer; overload;
105 protected
106 procedure init(lb1,ub1,lb2,ub2,lb3, ub3:integer);virtual;abstract;
107 procedure init0(lb1,ub1,lb2,ub2,lb3,ub3:integer);
108 end;
109
110 TArray4=Class(TArray)
111 Lbound1:integer;
112 Size1 :integer;
113 Lbound2:integer;
114 Size2 :integer;
115 Lbound3:integer;
116 Size3 :integer;
117 Lbound4:integer;
118 Size4 :integer;
119 constructor create(x1,x2,y1,y2,z1,z2,w1,w2:double);
120 procedure dim(x1,x2,y1,y2,z1,z2,w1,w2:double);overload;
121 procedure dim(x1,x2,y1,y2,z1,z2,w1,w2:integer);overload;
122 procedure resize(s1,s2,s3,s4:integer);overload;
123 procedure resize(x1,x2,x3,x4:double);overload;
124 procedure redim(x,y,z,w:double);overload;
125 procedure redim(x1,x2,y1,y2,z1,z2,w1,w2:double);overload; //change Lbounds
126 function Size:integer;overload;
127 function Size(d:Double):integer;overload;
128 function Lbound(d:Double):integer;
129 function Ubound(d:Double):integer;
130 function index(x,y,z,w:integer):integer; overload;
131 function index(x,y,z,w:double):integer; overload;
132 protected
133 procedure init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);virtual;abstract;
134 procedure init0(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);
135 end;
136
137
138
139
140 TArray2N=class;
141
142 TArray1N=Class(TArray1)
143 elements:PDoubleArray;
144 procedure subst(a:TArray1N);
145 procedure add(a,b:TArray1N);
146 procedure sub(a,b:TArray1N);
147 procedure prod(a:TArray1N; b:TArray2N); overload;
148 procedure prod(a:TArray2N; b:TArray1N); overload;
149 procedure scalar(x:double; a:TArray1N);
150 procedure con;overload;
151 procedure con(x:double);overload;
152 procedure zer;overload;
153 procedure zer(x:double);overload;
154 procedure CROSS(a,b:TArray1N);
155 destructor destroy;override;
156 function InputDirective:string;
157 function NewCopy:TArray1N;
158 procedure MatPrint(ch:tTextDevice; direction:integer);override;
159 procedure MatWrite(ch:tTextDevice);override;
160 function kindlist:ansistring;
161 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
162 procedure AssignVarilen(list:TstringList);override;
163 procedure LetWithTrace(ch:tTextDevice; name: ansistring; index1:double; value: double);
164 private
165 procedure init(lb1,ub1:integer);override;
166 constructor createCopy(a:TArray1N);
167 procedure CROSSsub(a,b:TArray1N);
168 end;
169
170 TArray2N=Class(TArray2)
171 elements:PDoubleArray;
172 procedure subst(a:TArray2N);
173 procedure add(a,b:TArray2N);
174 procedure sub(a,b:TArray2N);
175 procedure prod(a:TArray2N; b:TArray2N);
176 procedure INV(a:TArray2N);
177 procedure TRN(a:TArray2N);
178 procedure scalar(x:double; a:TArray2N);
179 procedure zer;overload;
180 procedure zer(x:double);overload;
181 procedure CON;overload;
182 procedure CON(x:double);overload;
183 procedure IDN; overload;
184 procedure IDN(x:double);overload;
185 destructor destroy;override;
186 function InputDirective:string;
187 function NewCopy:TArray2N;
188 procedure MatPrint(ch:tTextDevice; direction:integer);override;
189 procedure MatWrite(ch:tTextDevice);override;
190 function kindlist:ansistring;
191 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
192 procedure LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2:double; value: double);
193 private
194 procedure init(lb1,ub1,lb2,ub2:integer);override;
195 constructor createCopy(a:TArray2N);
196 procedure prodsub(a:TArray2N; b:TArray2N);
197 procedure TRNSub(a:TArray2N);
198 procedure determinant(var n:double);
199 function inverse:TArray2N;
200 end;
201
202 TArray3N=Class(TArray3)
203 elements:PDoubleArray;
204 procedure subst(a:TArray3N);
205 procedure add(a,b:TArray3N);
206 procedure sub(a,b:TArray3N);
207 procedure scalar(x:double; a:TArray3N);
208 procedure zer;overload;
209 procedure zer(x:double);overload;
210 procedure CON;overload;
211 procedure CON(x:double);overload;
212 destructor destroy;override;
213 function InputDirective:string;
214 function NewCopy:TArray3N;
215 procedure MatPrint(ch:tTextDevice; direction:integer);override;
216 procedure MatWrite(ch:tTextDevice);override;
217 function kindlist:ansistring;
218 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
219 procedure LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2,index3:double; value: double);
220 private
221 procedure init(lb1,ub1,lb2,ub2,lb3, ub3:integer); override;
222 constructor createCopy(a:TArray3N);
223
224 end;
225
226 TArray4N=Class(TArray4)
227 elements:PDoubleArray;
228 procedure subst(a:TArray4N);
229 procedure add(a,b:TArray4N);
230 procedure sub(a,b:TArray4N);
231 procedure scalar(x:double; a:TArray4N);
232 procedure zer;overload;
233 procedure zer(x:double);overload;
234 procedure CON;overload;
235 procedure CON(x:double);overload;
236 destructor destroy;override;
237 function InputDirective:string;
238 function NewCopy:TArray4N;
239 procedure MatPrint(ch:tTextDevice; direction:integer);override;
240 procedure MatWrite(ch:tTextDevice);override;
241 function kindlist:ansistring;
242 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
243 procedure LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2,index3,index4:double; value: double);
244 private
245 procedure init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer); override;
246 constructor createCopy(a:TArray4N);
247
248 end;
249
250
251
252 TArray1S=Class(TArray1)
253 elements:PStringArray;
254 destructor destroy;override;
255 function InputDirective:string;
256 function kindlist:ansistring;
257 procedure MatPrint(ch:tTextDevice; direction:integer);override;
258 procedure MatWrite(ch:tTextDevice);override;
259 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
260 procedure AssignVarilen(list:TstringList);override;
261 function NulCopy:TArray1S;
262 function NewCopy:TArray1S;
263 function newcopySubstring(i,j:integer):TArray1S;
264 function newcopySubstringByte(i,j:integer):TArray1S;
265 procedure Subst(a:TArray1S); // a���������������
266 procedure SubstSubstring(i,j:integer; a:TArray1S); // a���������������
267 procedure SubstSubstringByte(i,j:integer; a:TArray1S); // a���������������
268 class function Concat(a,b:TArray1S):TArray1S; overload; // a,b���������������
269 class function Concat(a:TArray1S; const s:string):TArray1S; overload; // a���������������
270 class function Concat(const s:String; b:TArray1S):TArray1S; overload; // b���������������
271
272 private
273 procedure init(lb1,ub1:integer); override;
274 constructor CreateNulCopy(a:TArray1S);
275 constructor createCopy(a:TArray1S);
276 constructor CreateConcat(a,b:TArray1S);
277 procedure Substring(i,j:integer);
278 procedure SubStringByte(i,j:integer);
279 end;
280
281 TArray2S=Class(TArray2)
282 elements:PStringArray;
283 destructor destroy;override;
284 function InputDirective:string;
285 function kindlist:ansistring;
286 procedure MatPrint(ch:tTextDevice; direction:integer);override;
287 procedure MatWrite(ch:tTextDevice);override;
288 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
289 function NulCopy:TArray2S;
290 function NewCopy:TArray2S;
291 function newcopySubstring(i,j:integer):TArray2S;
292 function newcopySubstringByte(i,j:integer):TArray2S;
293 procedure Subst(a:TArray2S); // a���������������
294 procedure SubstSubstring(i,j:integer; a:TArray2S); // a���������������
295 procedure SubstSubstringByte(i,j:integer; a:TArray2S); // a���������������
296 class function Concat(a,b:TArray2S):TArray2S; overload; // a,b���������������
297 class function Concat(a:TArray2S; const s:string):TArray2S; overload; // a���������������
298 class function Concat(const s:String; b:TArray2S):TArray2S; overload; // b���������������
299 private
300 procedure init(lb1,ub1,lb2,ub2:integer); override;
301 constructor createCopy(a:TArray2S);
302 constructor CreateNulCopy(a:TArray2S);
303 constructor CreateConcat(a,b:TArray2S);
304 procedure Substring(i,j:integer);
305 procedure SubStringByte(i,j:integer);
306 end;
307
308 TArray3S=Class(TArray3)
309 elements:PStringArray;
310 destructor destroy;override;
311 function InputDirective:string;
312 function kindlist:ansistring;
313 procedure MatPrint(ch:tTextDevice; direction:integer);override;
314 procedure MatWrite(ch:tTextDevice);override;
315 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
316 function NewCopy:TArray3S;
317 function NulCopy:TArray3S;
318 function newcopySubstring(i,j:integer):TArray3S;
319 function newcopySubstringByte(i,j:integer):TArray3S;
320 procedure Subst(a:TArray3S); // a���������������
321 procedure SubstSubstring(i,j:integer; a:TArray3S); // a���������������
322 procedure SubstSubstringByte(i,j:integer; a:TArray3S); // a���������������
323 class function Concat(a,b:TArray3S):TArray3S; overload; // a,b���������������
324 class function Concat(a:TArray3S; const s:string):TArray3S; overload; // a���������������
325 class function Concat(const s:String; b:TArray3S):TArray3S; overload; // b���������������
326 private
327 procedure init(lb1,ub1,lb2,ub2,lb3, ub3:integer);override;
328 constructor createCopy(a:TArray3S);
329 constructor CreateNulCopy(a:TArray3S);
330 constructor CreateConcat(a,b:TArray3S);
331 procedure Substring(i,j:integer);
332 procedure SubStringByte(i,j:integer);
333
334 end;
335
336 TArray4S=Class(TArray4)
337 elements:PStringArray;
338 destructor destroy;override;
339 function InputDirective:string;
340 function kindlist:ansistring;
341 procedure MatPrint(ch:tTextDevice; direction:integer);override;
342 procedure MatWrite(ch:tTextDevice);override;
343 procedure Read(list:TStringList;var p:integer);override; //list���p���������������������
344 function NewCopy:TArray4S;
345 function NulCopy:TArray4S;
346 function newcopySubstring(i,j:integer):TArray4S;
347 function newcopySubstringByte(i,j:integer):TArray4S;
348 procedure Subst(a:TArray4S); // a���������������
349 procedure SubstSubstring(i,j:integer; a:TArray4S); // a���������������
350 procedure SubstSubstringByte(i,j:integer; a:TArray4S); // a���������������
351 class function Concat(a,b:TArray4S):TArray4S; overload; // a,b���������������
352 class function Concat(a:TArray4S; const s:string):TArray4S; overload; // a���������������
353 class function Concat(const s:String; b:TArray4S):TArray4S; overload; // b���������������
354 private
355 procedure init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);override;
356 constructor createCopy(a:TArray4S);
357 constructor CreateNulCopy(a:TArray4S);
358 constructor CreateConcat(a,b:TArray4S);
359 procedure Substring(i,j:integer);
360 procedure SubStringByte(i,j:integer);
361
362 end;
363
364 function dot(a,b:TArray1N):double; overload;
365 function DET(a:TArray2N):double; overload;
366
367 function ConCatArray(const s:string; b:TArray1S):TArray1S;overload;
368 function ConCatArray(a:TArray1S; const s:string):TArray1S;overload;
369 function ConCatArray(a,b:TArray1S):TArray1S;overload;
370 function ConCatArray(const s:string; b:TArray2S):TArray2S;overload;
371 function ConCatArray(a:TArray2S; const s:string):TArray2S;overload;
372 function ConCatArray(a,b:TArray2S):TArray2S;overload;
373 function ConCatArray(const s:string; b:TArray3S):TArray3S;overload;
374 function ConCatArray(a:TArray3S; const s:string):TArray3S;overload;
375 function ConCatArray(a,b:TArray3S):TArray3S;overload;
376
377 {*********************}
378 {Transformation Arrays}
379 {*********************}
380
381 {
382 type
383 TransArray=array[0..3,0..3]of double;
384
385 function shift(a,b:double):TransArray;
386 function scale(a,b:double):TransArray;
387 function scale(a:double):TransArray;
388 function rotate(a:double):TransArray;
389 function rotatedeg(a:double):TransArray;
390 function shear(a:double):TransArray;
391 function sheardeg(a:double):TransArray;
392 }
393
394
395 implementation
396 uses base,vstack,float,baslib;
397
398 class function TArray.NewInstance: TObject;
399 begin
400 result:=InitInstance(getMemory(instancesize));
401 end;
402
403 procedure TArray.FreeInstance;
404 begin
405 freeMemory(instanceSize)
406 end;
407
408
409 constructor TArray.createNul;
410 begin
411 inherited create;
412 end;
413
414 procedure TArray1.init0(lb1,ub1:integer);
415 var
416 Ubound1:integer;
417 begin
418 lbound1:=lb1;
419 Ubound1:=ub1;
420 Size1:=Ubound1-Lbound1+1;
421 if size1<0 then size1:=0;
422 maxsize:=size1;
423 end;
424
425 procedure TArray1N.init(lb1,ub1:integer);
426 begin
427 init0(lb1,ub1);
428 if maxsize>0 then
429 {$IFDEF MassArrays}
430 Elements:=AllocMem(Maxsize*SizeOf(Double));
431 {$ELSE}
432 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
433 {$ENDIF}
434 end;
435
436 constructor TArray1.create(x1,x2:double);overload;
437 begin
438 inherited create;
439 init(LongintRound(x1),LongintRound(x2));
440 end;
441
442 constructor TArray1.create(x1,x2:integer);overload;
443 begin
444 inherited create;
445 init(x1,x2);
446 end;
447
448 destructor TArray1N.destroy;
449 begin
450 {$IFDEF MassArrays}
451 FreeMem(Elements,Maxsize*SizeOf(Double));
452 {$ELSE}
453 FreeMemory(Maxsize*SizeOf(Double));
454 {$ENDIF}
455 inherited destroy;
456 end;
457
458 procedure TArray1.dim(x1,x2:double);
459 begin
460 dim(LongintRound(x1),LongintRound(x2))
461 end;
462
463 procedure TArray1.dim(x1,x2:integer);
464 begin
465 if maxsize=0 then
466 init(x1,x2)
467 else
468 if (x1<>Lbound) or (x2<>Ubound) then
469 setexception(5001);
470 end;
471
472
473 procedure TArray1.resize(s1:integer);overload;
474 begin
475 if (0<s1) and (s1<=maxsize) then
476 size1:=s1
477 else
478 setexception(5001);
479 end;
480
481 procedure TArray1.resize(x1:double);overload;
482 begin
483 resize(LongIntRound(x1))
484 end;
485
486 procedure TArray1.redim(x:double); overload;
487 var
488 ub1:integer;
489 NewSize:integer;
490 begin
491 ub1:=LongintRound(x);
492 NewSize:=ub1-LBound1+1;
493 if (0<Newsize) and (NewSize<=Maxsize) then
494 begin
495 Size1:=NewSize;
496 end
497 else
498 setexception(5001)
499 end;
500
501
502 procedure TArray1.redim(x1,x2:double);overload;
503 var
504 lb1:integer;
505 NewSize1:integer;
506 begin
507 lb1:=LongintRound(x1);
508 NewSize1:=LongintRound(x2)-lb1+1;
509 if (0<NewSize1) and (NewSize1<=Maxsize) then
510 begin
511 Lbound1:=lb1; // Lbound������������
512 Size1:=NewSize1;
513 end
514 else
515 setexception(5001)
516 end;
517
518 function TArray1.Size:integer; overload; inline;
519 begin
520 Size:=Size1;
521 end;
522
523 function TArray1.Lbound:integer; overload;
524 begin
525 LBound:=Lbound1
526 end;
527
528 function TArray1.Ubound:integer; overload;
529 begin
530 Ubound:=Lbound1 + Size1 - 1
531 end;
532
533 function TArray1.Size(d:Double):integer; overload; inline;
534 begin
535 if LongintRound(d)=1 then
536 result:=size1
537 else
538 setexception(4004)
539 end;
540
541 function TArray1.Lbound(d:Double):integer; overload;
542 begin
543 if LongintRound(d)=1 then
544 result:=Lbound1
545 else
546 setexception(4008)
547 end;
548
549 function TArray1.Ubound(d:Double):integer; overload;
550 begin
551 case LongintRound(d) of
552 1: result:=Lbound1 + Size1 - 1;
553 else
554 setexception(4009)
555 end;
556 end;
557 function TArray1.index(x:integer):integer;overload;
558 begin
559 result:=x-Lbound1;
560 if (result<0) or (result>=size1) then
561 setexception(2001)
562 end;
563
564 function TArray1.index(x:double):integer; overload;
565 begin
566 result:=LongintRound(x)-Lbound1;
567 if (result<0) or (result>=size1) then
568 setexception(2001)
569 end;
570
571 function TArray1.index(x:complex):integer; overload;
572 begin
573 result:=index(testreal(x))
574 end;
575
576
577 constructor TArray1N.createCopy(a:TArray1N);
578 var
579 i:integer;
580 begin
581 TArray.create;
582 Lbound1:=a.Lbound1;
583 Size1:=a.Size1;
584 Maxsize:=Size1;
585 if maxsize>0 then
586 begin
587 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
588 for i:=0 to maxsize-1 do
589 elements^[i]:=a.elements^[i];
590 end;
591 end;
592
593 function TArray1N.NewCopy:TArray1N;
594 begin
595 result:=TArray1N.createCopy(self)
596 end;
597
598
599 procedure TArray2.init0(lb1,ub1,lb2,ub2:integer);
600 var
601 Ubound1,UBound2:integer;
602 begin
603 lbound1:=lb1;
604 Ubound1:=ub1;
605 Lbound2:=lb2;
606 Ubound2:=ub2;
607 Size1:=Ubound1-Lbound1+1;
608 Size2:=Ubound2-Lbound2+1;
609 if Size1<0 then Size1:=0;
610 if Size2<0 then Size2:=0;
611 maxsize:=size1 * size2;
612 end;
613
614 procedure TArray2N.init(lb1,ub1,lb2,ub2:integer);
615 begin
616 init0(lb1,ub1,lb2,ub2);
617 if maxsize>0 then
618 {$IFDEF MassArrays}
619 Elements:=AllocMem(Maxsize*SizeOf(Double));
620 {$ELSE}
621 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
622 {$ENDIF}
623 end;
624
625 constructor TArray2.create(x1,x2,y1,y2:double);overload;
626 begin
627 inherited create;
628 init(LongintRound(x1),LongintRound(x2),LongIntRound(y1),LongintRound(y2));
629 end;
630
631 constructor TArray2.create(x1,x2,y1,y2:integer);overload;
632 begin
633 inherited create;
634 init(x1,x2,y1,y2);
635 end;
636
637 destructor TArray2N.destroy;
638 begin
639 {$IFDEF MassArrays}
640 FreeMem(Elements,Maxsize*SizeOf(Double));
641 {$ELSE}
642 FreeMemory(Maxsize*SizeOf(Double));
643 {$ENDIF}
644 inherited destroy;
645 end;
646
647 procedure TArray2.dim(x1,x2,y1,y2:double);
648 begin
649 dim(LongintRound(x1),LongintRound(x2),LongintRound(y1),LongintRound(y2))
650 end;
651
652 procedure TArray2.dim(x1,x2,y1,y2:integer);
653 begin
654 if maxsize=0 then
655 init(x1,x2,y1,y2)
656 else if (x1<>Lbound1) or (x2<>UBound(1)) or (y1<>Lbound2) or (y2<Ubound(2)) then
657 setexception(5001);
658 end;
659
660 procedure TArray2.resize(x1,x2:double);overload;
661 begin
662 resize(LongIntRound(x1),LongIntRound(x2))
663 end;
664
665 procedure TArray2.resize(s1,s2:integer);overload;
666 begin
667 if (0<s1) and (0<s2) and (s1*s2<=maxsize) then
668 begin
669 size1:=s1;
670 size2:=s2;
671 end
672 else
673 setexception(5001);
674 end;
675
676 procedure TArray2.resize(x1:double);overload;
677 var
678 s1:integer;
679 begin
680 s1:=LongIntRound(x1);
681 ReSize(s1,s1)
682 end;
683
684
685 procedure TArray2.redim(x,y:double);overload;
686 var
687 ub1,ub2:integer;
688 NewSize1,newsize2:integer;
689 begin
690 ub1:=LongintRound(x);
691 ub2:=LongintRound(y);
692 NewSize1:=ub1-LBound1+1;
693 NewSize2:=ub2-LBound2+1;
694 if (0<Newsize1) and (0<NewSize2) and (NewSize1*NewSize2<=Maxsize) then
695 begin
696 Size1:=NewSize1;
697 Size2:=NewSize2;
698 end
699 else
700 setexception(5001)
701 end;
702
703
704 procedure TArray2.redim(x1,x2,y1,y2:double);overload;
705 var
706 lb1,lb2:integer;
707 NewSize1,NewSize2:integer;
708 begin
709 lb1:=LongintRound(x1);
710 lb2:=LongintRound(y1);
711 NewSize1:=LongintRound(x2)-lb1+1;
712 NewSize2:=LongintRound(y2)-lb2+1;
713 if (0<NewSize1) and (0<NewSize2) and (NewSize1*NewSize2<=Maxsize) then
714 begin
715 Lbound1:=lb1; // Lbound������������
716 Size1:=NewSize1;
717 Lbound2:=lb2; // Lbound������������
718 Size2:=NewSize2;
719 end
720 else
721 setexception(5001)
722 end;
723
724
725 function TArray2.Size:integer;overload; inline;
726 begin
727 result:=size1*size2;
728 end;
729
730 function TArray2.Size(d:Double):integer;overload;
731 begin
732 case LongintRound(d) of
733 1: result:=size1;
734 2: result:=size2;
735 else
736 setexception(4004)
737 end
738 end;
739
740 function TArray2.Lbound(d:Double):integer;
741 begin
742 case LongintRound(d) of
743 1: result:=Lbound1;
744 2: result:=Lbound2;
745 else
746 setexception(4008)
747 end;
748 end;
749
750 function TArray2.Ubound(d:Double):integer; overload;
751 begin
752 case LongintRound(d) of
753 1: result:=Lbound1 + Size1 - 1;
754 2: result:=Lbound2 + Size2 - 1;
755 else
756 setexception(4009)
757 end;
758 end;
759
760 function TArray2.index(x,y:double):integer; inline;
761 var
762 i,j:integer;
763 begin
764 i:=LongintRound(x)-Lbound1;
765 j:=LongIntRound(y)-Lbound2;
766 if (0<=i) and (i<size1) and (0<=j) and (j<size2) then
767 result:=i*size2 + j
768 else
769 setexception(2001)
770 end;
771
772 function TArray2.index(x:double; y:complex):integer;overload;
773 begin
774 result:=index(testreal(x), testreal(y))
775 end;
776
777 function TArray2.index(x:complex; y:double):integer;overload;
778 begin
779 result:=index(testreal(x), testreal(y))
780 end;
781
782 function TArray2.index(x,y:complex):integer;overload;
783 begin
784 result:=index(testreal(x), testreal(y))
785 end;
786
787
788
789 function TArray2.index(x,y:integer):integer; inline;
790 var
791 i,j:integer;
792 begin
793 i:=x-Lbound1;
794 j:=y-Lbound2;
795 if (0<=i) and (i<size1) and (0<=j) and (j<size2) then
796 result:=i*size2 + j
797 else
798 setexception(2001)
799 end;
800
801 constructor TArray2N.createCopy(a:TArray2N);
802 var
803 i:integer;
804 begin
805 TArray.create;
806 Lbound1:=a.Lbound1;
807 Size1:=a.Size1;
808 Lbound2:=a.Lbound2;
809 Size2:=a.Size2;
810 Maxsize:=Size1*size2;
811 if maxsize>0 then
812 begin
813 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
814 for i:=0 to maxsize-1 do
815 elements^[i]:=a.elements^[i];
816 end;
817 end;
818
819 function TArray2N.NewCopy:TArray2N;
820 begin
821 result:=TArray2N.createCopy(self)
822 end;
823
824
825
826
827 procedure TArray3.init0(lb1,ub1,lb2,ub2,lb3,ub3:integer);
828 var
829 Ubound1,UBound2,Ubound3:integer;
830 begin
831 lbound1:=lb1;
832 Ubound1:=ub1;
833 Lbound2:=lb2;
834 Ubound2:=ub2;
835 Lbound3:=lb3;
836 Ubound3:=ub3;
837 Size1:=Ubound1-Lbound1+1;
838 Size2:=Ubound2-Lbound2+1;
839 Size3:=Ubound3-Lbound3+1;
840 if Size1<0 then Size1:=0;
841 if Size2<0 then Size2:=0;
842 if Size3<0 then Size3:=0;
843 maxsize:=size1 * size2 * size3;
844 end;
845
846 procedure TArray3N.init(lb1,ub1,lb2,ub2,lb3, ub3:integer);
847 begin
848 init0(lb1,ub1,lb2,ub2,lb3,ub3);
849 if maxsize>0 then
850 {$IFDEF MassArrays}
851 Elements:=AllocMem(Maxsize*SizeOf(Double));
852 {$ELSE}
853 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
854 {$ENDIF}
855 end;
856
857 constructor TArray3.create(x1,x2,y1,y2,z1,z2:double);
858 begin
859 inherited create;
860 init(LongintRound(x1),LongintRound(x2),LongIntRound(y1),LongintRound(y2),
861 LongintRound(z1),LongintRound(z2));
862 end;
863
864 destructor TArray3N.destroy;
865 begin
866 {$IFDEF MassArrays}
867 FreeMem(Elements,Maxsize*SizeOf(Double));
868 {$ELSE}
869 FreeMemory(Maxsize*SizeOf(Double));
870 {$ENDIF}
871 inherited destroy;
872 end;
873
874
875 procedure TArray3.dim(x1,x2,y1,y2,z1,z2:double); overload;
876 begin
877 dim(LongintRound(x1),LongintRound(x2),LongintRound(y1),LongintRound(y2),
878 LongintRound(z1),LongintRound(z2))
879 end;
880
881
882 procedure TArray3.dim(x1,x2,y1,y2,z1,z2:integer); overload;
883 begin
884 if maxsize=0 then
885 init(x1,x2,y1,y2,z1,z2)
886 else if (x1<>Lbound1)and(x2<>Ubound(1))and(y1<>Lbound1)and(y2<>Ubound(2))
887 and(z1<>Lbound3)and(z2<>Ubound(3)) then
888 setexception(5001);
889 end;
890
891 procedure TArray3.resize(x1,x2,x3:double);overload;
892 begin
893 resize(LongIntRound(x1),LongIntRound(x2),LongIntRound(x3))
894 end;
895
896 procedure TArray3.resize(s1,s2,s3:integer);overload;
897 begin
898 if (0<s1) and (0<s2) and (0<s3) and (s1*s2*s3<=maxsize) then
899 begin
900 size1:=s1;
901 size2:=s2;
902 size3:=s3;
903 end
904 else
905 setexception(5001);
906 end;
907
908 procedure TArray3.redim(x,y,z:double);overload;
909 var
910 ub1,ub2,ub3:integer;
911 NewSize1,newsize2,NewSize3:integer;
912 begin
913 ub1:=LongintRound(x);
914 ub2:=LongintRound(y);
915 ub3:=LongintRound(z);
916 NewSize1:=ub1-LBound1+1;
917 NewSize2:=ub2-LBound2+1;
918 NewSize3:=ub3-LBound3+1;
919 if (0<Newsize1) and (0<NewSize2) and (0<NewSize3)
920 and (NewSize1*NewSize2*NewSize3<=Maxsize) then
921 begin
922 Size1:=NewSize1;
923 Size2:=NewSize2;
924 Size3:=NewSize3;
925 end
926 else
927 setexception(5001)
928 end;
929
930
931 procedure TArray3.redim(x1,x2,y1,y2,z1,z2:double); overload;
932 var
933 lb1,lb2,lb3:integer;
934 NewSize1,NewSize2,NewSize3:integer;
935 begin
936 lb1:=LongintRound(x1);
937 lb2:=LongintRound(y1);
938 lb3:=LongintRound(z1);
939 NewSize1:=LongintRound(x2)-lb1+1;
940 NewSize2:=LongintRound(y2)-lb2+1;
941 NewSize3:=LongintRound(z2)-lb3+1;
942 if (0<NewSize1) and (0<NewSize2) and (0<NewSize3)
943 and (NewSize1*NewSize2*NewSize3<=Maxsize) then
944 begin
945 Lbound1:=lb1; // Lbound������������
946 Size1:=NewSize1;
947 Lbound2:=lb2; // Lbound������������
948 Size2:=NewSize2;
949 Lbound3:=lb3; // Lbound������������
950 Size3:=NewSize3;
951 end
952 else
953 setexception(5001)
954 end;
955
956 function TArray3.Size:integer;overload; inline;
957 begin
958 result:=size1*size2*size3
959 end;
960
961
962 function TArray3.Size(d:Double):integer;overload; inline;
963 begin
964 case LongintRound(d) of
965 1: result:=size1;
966 2: result:=size2;
967 3: result:=size3;
968 else
969 setexception(4004)
970 end
971 end;
972
973 function TArray3.Lbound(d:Double):integer;
974 begin
975 case LongintRound(d) of
976 1: result:=Lbound1;
977 2: result:=Lbound2;
978 3: result:=Lbound3;
979 else
980 setexception(4008)
981 end;
982 end;
983
984 function TArray3.Ubound(d:Double):integer; overload;
985 begin
986 case LongintRound(d) of
987 1: result:=Lbound1 + Size1 - 1;
988 2: result:=Lbound2 + Size2 - 1;
989 3: result:=Lbound3 + Size3 - 1;
990 else
991 setexception(4009)
992 end;
993 end;
994
995 function TArray3.index(x,y,z:integer):integer; inline;
996 var
997 i,j,k:integer;
998 begin
999 i:=x-Lbound1;
1000 j:=y-Lbound2;
1001 k:=z-Lbound3;
1002 if (0<=i) and (i<size1) and (0<=j) and (j<size2) and (0<=k) and (k<size3) then
1003 result:=(i*size2 + j)*size3 + k
1004 else
1005 setexception(2001)
1006 end;
1007
1008 function TArray3.index(x,y,z:double):integer; inline;
1009 var
1010 i,j,k:integer;
1011 begin
1012 i:=LongintRound(x)-Lbound1;
1013 j:=LongIntRound(y)-Lbound2;
1014 k:=LongIntRound(z)-Lbound3;
1015 if (0<=i) and (i<size1) and (0<=j) and (j<size2) and (0<=k) and (k<size3) then
1016 result:=(i*size2 + j)*size3 + k
1017 else
1018 setexception(2001)
1019 end;
1020
1021 constructor TArray3N.createCopy(a:TArray3N);
1022 var
1023 i:integer;
1024 begin
1025 TArray.create;
1026 Lbound1:=a.Lbound1;
1027 Size1:=a.Size1;
1028 Lbound2:=a.Lbound2;
1029 Size2:=a.Size2;
1030 Lbound3:=a.Lbound3;
1031 Size3:=a.Size3;
1032 Maxsize:=Size1*size2*size3;
1033 if maxsize>0 then
1034 begin
1035 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
1036 for i:=0 to maxsize-1 do
1037 elements^[i]:=a.elements^[i];
1038 end;
1039 end;
1040
1041 function TArray3N.NewCopy:TArray3N;
1042 begin
1043 result:=TArray3N.createCopy(self)
1044 end;
1045
1046
1047 {TARray4}
1048
1049 procedure TArray4.init0(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);
1050 var
1051 Ubound1,UBound2,Ubound3,UBound4:integer;
1052 begin
1053 Lbound1:=lb1;
1054 Ubound1:=ub1;
1055 Lbound2:=lb2;
1056 Ubound2:=ub2;
1057 Lbound3:=lb3;
1058 Ubound3:=ub3;
1059 LBound4:=lb4;
1060 UBound4:=ub4;
1061 Size1:=Ubound1-Lbound1+1;
1062 Size2:=Ubound2-Lbound2+1;
1063 Size3:=Ubound3-Lbound3+1;
1064 Size4:=Ubound4-Lbound4+1;
1065 if Size1<0 then Size1:=0;
1066 if Size2<0 then Size2:=0;
1067 if Size3<0 then Size3:=0;
1068 if Size4<0 then Size4:=0;
1069 maxsize:=size1 * size2 * size3 * size4;
1070 end;
1071
1072
1073 procedure TArray4N.init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);
1074 begin
1075 init0(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4);
1076 if maxsize>0 then
1077 {$IFDEF MassArrays}
1078 Elements:=AllocMem(Maxsize*SizeOf(Double));
1079 {$ELSE}
1080 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
1081 {$ENDIF}
1082 end;
1083
1084
1085 constructor TArray4.create(x1,x2,y1,y2,z1,z2,w1,w2:double);
1086 begin
1087 inherited create;
1088 init(LongintRound(x1),LongintRound(x2),LongIntRound(y1),LongintRound(y2),
1089 LongintRound(z1),LongintRound(z2),LongIntRound(w1),LongintRound(w2));
1090 end;
1091
1092 destructor TArray4N.destroy;
1093 begin
1094 {$IFDEF MassArrays}
1095 FreeMem(Elements,Maxsize*SizeOf(Double));
1096 {$ELSE}
1097 FreeMemory(Maxsize*SizeOf(Double));
1098 {$ENDIF}
1099 inherited destroy;
1100 end;
1101
1102
1103 procedure TArray4.dim(x1,x2,y1,y2,z1,z2,w1,w2:double); overload;
1104 begin
1105 dim(LongintRound(x1),LongintRound(x2),LongintRound(y1),LongintRound(y2),
1106 LongintRound(z1),LongintRound(z2),LongintRound(w1),LongintRound(w2))
1107 end;
1108
1109
1110 procedure TArray4.dim(x1,x2,y1,y2,z1,z2,w1,w2:integer); overload;
1111 begin
1112 if maxsize=0 then
1113 init(x1,x2,y1,y2,z1,z2,w1,w2)
1114 else if (x1<>Lbound1)and(x2<>Ubound(1))and(y1<>Lbound1)and(y2<>Ubound(2))
1115 and(z1<>Lbound3)and(z2<>Ubound(3))and(w1<>Lbound4)and(w2<>Ubound(4)) then
1116 setexception(5001);
1117 end;
1118
1119 procedure TArray4.resize(x1,x2,x3,x4:double);overload;
1120 begin
1121 resize(LongIntRound(x1),LongIntRound(x2),LongIntRound(x3),LongIntRound(x4))
1122 end;
1123
1124 procedure TArray4.resize(s1,s2,s3,s4:integer);overload;
1125 begin
1126 if (0<s1) and (0<s2) and (0<s3) and (0<s4) and (s1*s2*s3*s4<=maxsize) then
1127 begin
1128 size1:=s1;
1129 size2:=s2;
1130 size3:=s3;
1131 size4:=s4;
1132 end
1133 else
1134 setexception(5001);
1135 end;
1136
1137 procedure TArray4.redim(x,y,z,w:double);overload;
1138 var
1139 ub1,ub2,ub3,ub4:integer;
1140 NewSize1,newsize2,NewSize3,NewSize4:integer;
1141 begin
1142 ub1:=LongintRound(x);
1143 ub2:=LongintRound(y);
1144 ub3:=LongintRound(z);
1145 ub4:=LongintRound(w);
1146 NewSize1:=ub1-LBound1+1;
1147 NewSize2:=ub2-LBound2+1;
1148 NewSize3:=ub3-LBound3+1;
1149 NewSize4:=ub4-LBound4+1;
1150 if (0<Newsize1) and (0<NewSize2) and (0<NewSize3) and (0<NewSize4)
1151 and (NewSize1*NewSize2*NewSize3*NewSize4<=Maxsize) then
1152 begin
1153 Size1:=NewSize1;
1154 Size2:=NewSize2;
1155 Size3:=NewSize3;
1156 Size4:=NewSize4;
1157 end
1158 else
1159 setexception(5001)
1160 end;
1161
1162
1163 procedure TArray4.redim(x1,x2,y1,y2,z1,z2,w1,w2:double); overload;
1164 var
1165 lb1,lb2,lb3,lb4:integer;
1166 NewSize1,NewSize2,NewSize3,NewSize4:integer;
1167 begin
1168 lb1:=LongintRound(x1);
1169 lb2:=LongintRound(y1);
1170 lb3:=LongintRound(z1);
1171 lb4:=LongintRound(w1);
1172 NewSize1:=LongintRound(x2)-lb1+1;
1173 NewSize2:=LongintRound(y2)-lb2+1;
1174 NewSize3:=LongintRound(z2)-lb3+1;
1175 NewSize4:=LongintRound(w2)-lb4+1;
1176 if (0<NewSize1) and (0<NewSize2) and (0<NewSize3) and (0<NewSize4)
1177 and (NewSize1*NewSize2*NewSize3*NewSize4<=Maxsize) then
1178 begin
1179 Lbound1:=lb1; // Lbound������������
1180 Size1:=NewSize1;
1181 Lbound2:=lb2; // Lbound������������
1182 Size2:=NewSize2;
1183 Lbound3:=lb3; // Lbound������������
1184 Size3:=NewSize3;
1185 Lbound4:=lb4; // Lbound������������
1186 Size4:=NewSize4;
1187 end
1188 else
1189 setexception(5001)
1190 end;
1191
1192 function TArray4.Size:integer;overload; inline;
1193 begin
1194 result:=size1*size2*size3*size4
1195 end;
1196
1197
1198 function TArray4.Size(d:Double):integer;overload; inline;
1199 begin
1200 case LongintRound(d) of
1201 1: result:=size1;
1202 2: result:=size2;
1203 3: result:=size3;
1204 4: result:=size4;
1205 else
1206 setexception(4004)
1207 end
1208 end;
1209
1210 function TArray4.Lbound(d:Double):integer;
1211 begin
1212 case LongintRound(d) of
1213 1: result:=Lbound1;
1214 2: result:=Lbound2;
1215 3: result:=Lbound3;
1216 4: result:=Lbound4;
1217 else
1218 setexception(4008)
1219 end;
1220 end;
1221
1222 function TArray4.Ubound(d:Double):integer; overload;
1223 begin
1224 case LongintRound(d) of
1225 1: result:=Lbound1 + Size1 - 1;
1226 2: result:=Lbound2 + Size2 - 1;
1227 3: result:=Lbound3 + Size3 - 1;
1228 4: result:=Lbound4 + Size4 - 1;
1229 else
1230 setexception(4009)
1231 end;
1232 end;
1233
1234 function TArray4.index(x,y,z,w:integer):integer; inline;
1235 var
1236 i,j,k,l:integer;
1237 begin
1238 i:=x-Lbound1;
1239 j:=y-Lbound2;
1240 k:=z-Lbound3;
1241 l:=w-Lbound4;
1242 if (0<=i) and (i<size1) and (0<=j) and (j<size2)
1243 and (0<=k) and (k<size3)
1244 and (0<=l) and (l<size4) then
1245 result:=((i*size2 + j)*size3 + k)*size4 + l
1246 else
1247 setexception(2001)
1248 end;
1249
1250 function TArray4.index(x,y,z,w:double):integer; inline;
1251 var
1252 i,j,k,l:integer;
1253 begin
1254 i:=LongintRound(x)-Lbound1;
1255 j:=LongIntRound(y)-Lbound2;
1256 k:=LongIntRound(z)-Lbound3;
1257 l:=LongIntRound(w)-Lbound4;
1258 if (0<=i) and (i<size1) and (0<=j) and (j<size2)
1259 and (0<=k) and (k<size3)
1260 and (0<=l) and (l<size4) then
1261 result:=((i*size2 + j)*size3 + k)*size4 + l
1262 else
1263 setexception(2001)
1264 end;
1265
1266 constructor TArray4N.createCopy(a:TArray4N);
1267 var
1268 i:integer;
1269 begin
1270 TArray.create;
1271 Lbound1:=a.Lbound1;
1272 Size1:=a.Size1;
1273 Lbound2:=a.Lbound2;
1274 Size2:=a.Size2;
1275 Lbound3:=a.Lbound3;
1276 Size3:=a.Size3;
1277 Lbound4:=a.Lbound4;
1278 Size4:=a.Size4;
1279 Maxsize:=Size1*size2*size3*size4;
1280 if maxsize>0 then
1281 begin
1282 Elements:=GetZeroMemory(Maxsize*SizeOf(Double));
1283 for i:=0 to maxsize-1 do
1284 elements^[i]:=a.elements^[i];
1285 end;
1286 end;
1287
1288
1289 function TArray4N.NewCopy:TArray4N;
1290 begin
1291 result:=TArray4N.createCopy(self)
1292 end;
1293
1294
1295
1296 {**************}
1297 {MAT OPERATIONS}
1298 {**************}
1299
1300 procedure TArray1N.subst(a:TArray1N);
1301 var
1302 i:integer;
1303 begin
1304 if a.size1>maxsize then setexception(5001);
1305 Size1:=a.Size1;
1306 for i:=0 to a.size1-1 do
1307 elements^[i]:=a.elements^[i]
1308
1309 end;
1310
1311 procedure TArray1N.add(a,b:TArray1N);
1312 var
1313 c:TArray1N;
1314 i:integer;
1315 begin
1316 if (a.Size1<>b.Size1) then
1317 setexception(6001);
1318 if a.Size>MaxSize then
1319 setexception(5001);
1320 c:=TArray1N.create(1,a.size1);
1321 try
1322 for i:=0 to c.size-1 do
1323 c.elements^[i]:=a.elements^[i]+b.elements^[i];
1324 subst(c)
1325 finally
1326 c.free;
1327 end;
1328 end;
1329
1330 procedure TArray1N.sub(a,b:TArray1N);
1331 var
1332 c:TArray1N;
1333 i:integer;
1334 begin
1335 if (a.Size1<>b.Size1) then
1336 setexception(6001);
1337 if a.Size>MaxSize then
1338 setexception(5001);
1339 c:=TArray1N.create(1,a.size1);
1340 try
1341 for i:=0 to c.size-1 do
1342 c.elements^[i]:=a.elements^[i]-b.elements^[i];
1343 subst(c)
1344 finally
1345 c.free;
1346 end;
1347 end;
1348
1349 procedure TArray1N.prod(a:TArray1N; b:TArray2N); overload;
1350 var
1351 i,j:integer;
1352 c:TArray1N;
1353 begin
1354 if a.size1<>b.size1 then setexception(6001);
1355 if maxsize<b.size2 then setexception(5001);
1356 c:=TArray1N.create(1, b.size2);
1357 //c.zer;
1358 try
1359 for j:=0 to b.size2-1 do
1360 for i:=0 to b.size1 -1 do
1361 c.elements^[j]:=c.elements^[j]+ a.elements^[i]*b.elements^[i*b.size2+j];
1362 subst(c);
1363 finally
1364 c.free;
1365 end;
1366
1367 end;
1368
1369 procedure TArray1N.prod(a:TArray2N; b:TArray1N); overload;
1370 var
1371 i,j:integer;
1372 c:TArray1N;
1373 begin
1374 if a.size2<>b.size1 then setexception(6001);
1375 if maxsize<a.size1 then setexception(5001);
1376 c:=TArray1N.create(1, a.size1);
1377 //c.zer;
1378 try
1379 for i:=0 to a.size1-1 do
1380 for j:=0 to a.size2 -1 do
1381 c.elements^[i]:=c.elements^[i]+ a.elements^[i*a.size2+j]*b.elements^[j];
1382 subst(c);
1383 finally
1384 c.free;
1385 end;
1386 end;
1387
1388 procedure TArray1N.scalar(x:double; a:TArray1N);
1389 var
1390 i:integer;
1391 begin
1392 subst(a);
1393 for i:=0 to size-1 do
1394 elements^[i]:=x*elements^[i]
1395 end;
1396
1397 procedure TArray1N.CON(x:double);
1398 var
1399 i:integer;
1400 begin
1401 for i:=0 to size-1 do
1402 elements^[i]:=x
1403 end;
1404
1405 procedure TArray1N.CON;
1406 begin
1407 CON(1)
1408 end;
1409
1410 procedure TArray1N.zer;overload;
1411 var
1412 i:integer;
1413 begin
1414 for i:=0 to size1-1 do
1415 elements^[i]:=0;
1416 end;
1417
1418 procedure TArray1N.zer(x:double);overload;
1419 begin
1420 zer
1421 end;
1422
1423 procedure TArray1N.CROSSsub(a,b:TArray1N);
1424 var
1425 i:integer;
1426 x,y:double;
1427 begin
1428 for i:=0 to 2 do
1429 begin
1430 elements^[i mod 3]:=0;
1431 x:=a.elements^[(i+1) mod 3];
1432 x:=x*b.elements^[(i+2) mod 3];
1433 y:=b.elements^[(i+1) mod 3];
1434 y:=y*a.elements^[(i+2) mod 3];
1435 elements^[i mod 3]:=elements^[i mod 3]+x-y;
1436 end;
1437 end;
1438
1439 procedure TArray1N.CROSS(a,b:TArray1N);
1440 var
1441 c:TArray1N;
1442 begin
1443 if (a.size<3) or (b.size<3) then setexception(6001);
1444 if MaxSize<3 then setexception(5001);
1445 c:=TArray1N.create(1,3);
1446 try
1447 c.CrossSub(a,b);
1448 subst(c);
1449 finally
1450 c.free;
1451 end;
1452 end;
1453
1454
1455
1456 procedure TArray2N.subst(a:TArray2N);
1457 var
1458 i:integer;
1459 begin
1460 if a.Size>MaxSize then
1461 setexception(5001);
1462 resize(a.size1,a.size2);
1463 for i:=0 to size-1 do
1464 elements^[i]:=A.elements^[i]
1465
1466 end;
1467
1468 procedure TArray2N.add(a,b:TArray2N);
1469 var
1470 c:TArray2N;
1471 i:integer;
1472 begin
1473 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) then
1474 setexception(6001);
1475 if a.Size>MaxSize then
1476 setexception(5001);
1477 c:=TArray2N.create(1, a.size1, 1, a.size2);
1478 try
1479 for i:=0 to c.size-1 do
1480 c.elements^[i]:=a.elements^[i]+b.elements^[i];
1481 subst(c)
1482 finally
1483 c.free;
1484 end;
1485 end;
1486
1487
1488 procedure TArray2N.sub(a,b:TArray2N);
1489 var
1490 c:TArray2N;
1491 i:integer;
1492 begin
1493 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) then
1494 setexception(6001);
1495 if a.Size>MaxSize then
1496 setexception(5001);
1497 c:=TArray2N.create(1, a.size1, 1, a.size2);
1498 try
1499 for i:=0 to c.size-1 do
1500 c.elements^[i]:=a.elements^[i]-b.elements^[i];
1501 subst(c)
1502 finally
1503 c.free;
1504 end;
1505 end;
1506
1507 procedure TArray2N.ProdSub(a:TArray2N; b:TArray2N);
1508 var
1509 i,j,k:integer;
1510 begin
1511 for i:=0 to size1-1 do
1512 for j:=0 to size2-1 do
1513 for k:=0 to a.size2-1 do
1514 elements^[size2*i+j]:=elements^[Size2*i+j]+a.elements^[a.Size2*i+k]*b.elements^[b.size2*k+j];
1515 end;
1516 procedure TArray2N.prod(a:TArray2N; b:TArray2N);
1517 var
1518 c:TArray2N;
1519 //i,j,k:integer;
1520 begin
1521 if (a.Size2<>b.Size1) then
1522 setexception(6001);
1523 if a.Size1 * b.Size2 >MaxSize then
1524 setexception(5001);
1525 c:=TArray2N.create(1, a.size1, 1, b.size2);
1526 try
1527 c.ProdSub(a,b);
1528 subst(c)
1529 finally
1530 c.free;
1531 end;
1532 end;
1533
1534 procedure TArray2N.INV(a:TArray2N);
1535 var
1536 c:TArray2N;
1537 begin
1538 c:=a.inverse;
1539 subst(c);
1540 c.free;
1541 end;
1542
1543 procedure TArray2N.TRNSub(a:TArray2N);
1544 var
1545 i,j:integer;
1546 begin
1547 for i:=0 to size1 -1 do
1548 for j:=0 to size2 -1 do
1549 elements^[j+size2*i]:=a.elements^[i+a.Size2*j];
1550 end;
1551
1552 procedure TArray2N.TRN(a:TArray2N);
1553 var
1554 c:TArray2N;
1555 begin
1556 c:=TArray2N.create(1, a.Size2, 1, a.size1);
1557 c.TRNSub(a);
1558 subst(c)
1559 end;
1560
1561 procedure TArray2N.scalar(x:double; a:TArray2N);
1562 var
1563 i:integer;
1564 begin
1565 subst(a);
1566 for i:=0 to size-1 do
1567 elements^[i]:=x*elements^[i]
1568 end;
1569
1570 procedure TArray2N.con;
1571 begin
1572 CON(1)
1573 end;
1574
1575 procedure TArray2N.con(x:double);
1576 var
1577 i:integer;
1578 begin
1579 for i:=0 to size-1 do
1580 elements^[i]:=x
1581 end;
1582
1583 procedure TArray2N.zer;overload;
1584 var
1585 i:integer;
1586 begin
1587 for i:=0 to size-1 do
1588 elements^[i]:=0;
1589 end;
1590
1591 procedure TArray2N.zer(x:double);overload;
1592 begin
1593 zer
1594 end;
1595
1596
1597 procedure TArray2N.IDN; overload;
1598 begin
1599 IDN(1)
1600 end;
1601
1602 procedure TArray2N.IDN(x:double);overload;
1603 var
1604 i:integer;
1605 begin
1606 if size1<>size2 then setexception(6004);
1607 zer;
1608 for i:=0 to size1-1 do
1609 elements^[i+size2*i]:=x
1610 end;
1611
1612
1613 procedure TArray3N.subst(a:TArray3N);
1614 var
1615 i:integer;
1616 begin
1617 if a.Size>MaxSize then
1618 setexception(5001);
1619 resize(a.size1,a.size2,a.size3);
1620 for i:=0 to size-1 do
1621 elements^[i]:=a.elements^[i]
1622
1623 end;
1624
1625 procedure TArray3N.add(a,b:TArray3N);
1626 var
1627 c:TArray3N;
1628 i:integer;
1629 begin
1630 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)then
1631 setexception(6001);
1632 if a.Size>MaxSize then
1633 setexception(5001);
1634 c:=TArray3N.create(1, a.size1, 1, a.size2, 1, a.size3);
1635 try
1636 for i:=0 to c.size-1 do
1637 c.elements^[i]:=a.elements^[i]+b.elements^[i];
1638 subst(c)
1639 finally
1640 c.free;
1641 end;
1642 end;
1643
1644
1645 procedure TArray3N.sub(a,b:TArray3N);
1646 var
1647 c:TArray3N;
1648 i:integer;
1649 begin
1650 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)then
1651 setexception(6001);
1652 if a.Size>MaxSize then
1653 setexception(5001);
1654 c:=TArray3N.create(1, a.size1, 1, a.size2, 1, a.size3);
1655 try
1656 for i:=0 to c.size-1 do
1657 c.elements^[i]:=a.elements^[i]-b.elements^[i];
1658 subst(c)
1659 finally
1660 c.free;
1661 end;
1662 end;
1663
1664
1665 procedure TArray3N.scalar(x:double; a:TArray3N);
1666 var
1667 i:integer;
1668 begin
1669 subst(a);
1670 for i:=0 to size-1 do
1671 elements^[i]:=x*elements^[i]
1672 end;
1673
1674 procedure TArray3N.con;
1675 begin
1676 CON(1)
1677 end;
1678
1679 procedure TArray3N.con(x:double);
1680 var
1681 i:integer;
1682 begin
1683 for i:=0 to size-1 do
1684 elements^[i]:=x
1685 end;
1686
1687 procedure TArray3N.zer;overload;
1688 var
1689 i:integer;
1690 begin
1691 for i:=0 to size-1 do
1692 elements^[i]:=0;
1693 end;
1694
1695 procedure TArray3N.zer(x:double);overload;
1696 begin
1697 zer
1698 end;
1699
1700 {TArray4N}
1701
1702 procedure TArray4N.subst(a:TArray4N);
1703 var
1704 i:integer;
1705 begin
1706 if a.Size>MaxSize then
1707 setexception(5001);
1708 resize(a.size1,a.size2,a.size3,a.size4);
1709 for i:=0 to size-1 do
1710 elements^[i]:=a.elements^[i]
1711
1712 end;
1713
1714 procedure TArray4N.add(a,b:TArray4N);
1715 var
1716 c:TArray4N;
1717 i:integer;
1718 begin
1719 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)
1720 or (a.Size4<>b.Size4)then
1721 setexception(6001);
1722 if a.Size>MaxSize then
1723 setexception(5001);
1724 c:=TArray4N.create(1, a.size1, 1, a.size2, 1, a.size3, 1, size4);
1725 try
1726 for i:=0 to c.size-1 do
1727 c.elements^[i]:=a.elements^[i]+b.elements^[i];
1728 subst(c)
1729 finally
1730 c.free;
1731 end;
1732 end;
1733
1734
1735 procedure TArray4N.sub(a,b:TArray4N);
1736 var
1737 c:TArray4N;
1738 i:integer;
1739 begin
1740 if (a.Size1<>b.Size1) or (a.Size2<>b.Size2) or (a.Size3<>b.Size3)
1741 or (a.Size4<>b.Size4)then
1742 setexception(6001);
1743 if a.Size>MaxSize then
1744 setexception(5001);
1745 c:=TArray4N.create(1, a.size1, 1, a.size2, 1, a.size3, 1, size4);
1746 try
1747 for i:=0 to c.size-1 do
1748 c.elements^[i]:=a.elements^[i]-b.elements^[i];
1749 subst(c)
1750 finally
1751 c.free;
1752 end;
1753 end;
1754
1755
1756 procedure TArray4N.scalar(x:double; a:TArray4N);
1757 var
1758 i:integer;
1759 begin
1760 subst(a);
1761 for i:=0 to size-1 do
1762 elements^[i]:=x*elements^[i]
1763 end;
1764
1765 procedure TArray4N.con;
1766 begin
1767 CON(1)
1768 end;
1769
1770 procedure TArray4N.con(x:double);
1771 var
1772 i:integer;
1773 begin
1774 for i:=0 to size-1 do
1775 elements^[i]:=x
1776 end;
1777
1778 procedure TArray4N.zer;overload;
1779 var
1780 i:integer;
1781 begin
1782 for i:=0 to size-1 do
1783 elements^[i]:=0;
1784 end;
1785
1786 procedure TArray4N.zer(x:double);overload;
1787 begin
1788 zer
1789 end;
1790
1791 {***********************}
1792 {String Array Operations}
1793 {***********************}
1794 procedure SubstStr(var a:StringArray; size:integer; s:string);
1795 var
1796 i:integer;
1797 begin
1798 for i:=0 to size-1 do
1799 a[i]:=s
1800 end;
1801
1802 procedure SubstNul(var a:StringArray; size:integer);
1803 begin
1804 substStr(a,size,'')
1805 end;
1806
1807 procedure CopyFrom(var a:StringArray; size:integer; const b:StringArray);
1808 var
1809 i:integer;
1810 begin
1811 for i:=0 to size-1 do
1812 a[i]:=b[i]
1813 end;
1814
1815 procedure SubstArraySubstring(var a:StringArray; size:integer;i,j:integer; const s:string); overload;
1816 var
1817 k:integer;
1818 begin
1819 for k:=0 to size-1 do
1820 SubstSubstring(a[k],i,j,s)
1821 end;
1822
1823 procedure SubstArraySubstring(var a:StringArray; size:integer; i,j:integer; const b:StringArray);overload;
1824 var
1825 k:integer;
1826 begin
1827 for k:=0 to size-1 do
1828 SubstSubstring(a[k],i,j,b[k])
1829 end;
1830
1831 procedure SubstArraySubstringByte(var a:StringArray; size:integer;i,j:integer; const s:string); overload;
1832 var
1833 k:integer;
1834 begin
1835 for k:=0 to size-1 do
1836 SubstSubstringByte(a[k],i,j,s)
1837 end;
1838
1839 procedure SubstArraySubstringByte(var a:StringArray; size:integer; i,j:integer; const b:StringArray);overload;
1840 var
1841 k:integer;
1842 begin
1843 for k:=0 to size-1 do
1844 SubstSubstringByte(a[k],i,j,b[k])
1845 end;
1846
1847 procedure ConcatArrays(var a:stringArray; size:integer; const b,c:StringArray);
1848 var
1849 i:integer;
1850 begin
1851 for i:=0 to size-1 do
1852 a[i]:=b[i]+c[i]
1853 end;
1854
1855 procedure leftConcat(var a:StringArray; size:integer; const s:string);
1856 var
1857 i:integer;
1858 begin
1859 for i:=0 to size-1 do
1860 a[i]:=s+a[i]
1861 end;
1862
1863 procedure rightConcat(var a:StringArray; size:integer; const s:string);
1864 var
1865 i:integer;
1866 begin
1867 for i:=0 to size-1 do
1868 a[i]:=a[i]+s
1869 end;
1870
1871 procedure ArraySubstring(var a:StringArray; size:integer; i,j:integer);
1872 var
1873 k:integer;
1874 begin
1875 for k:=0 to size-1 do
1876 a[k]:=baslib.substring(a[k],i,j)
1877 end;
1878
1879 procedure ArraySubstringByte(var a:StringArray; size:integer; i,j:integer);
1880 var
1881 k:integer;
1882 begin
1883 for k:=0 to size-1 do
1884 a[k]:=baslib.substringByte(a[k],i,j)
1885 end;
1886 {*************}
1887 {String Arrays}
1888 {*************}
1889
1890 procedure TArray1S.init(lb1,ub1:integer);
1891 begin
1892 init0(lb1,ub1);
1893 if maxsize>0 then
1894 Elements:=GetZeroMemory(Maxsize*SizeOf(AnsiString));
1895 end;
1896
1897 destructor TArray1S.destroy;
1898 var
1899 i:integer;
1900 begin
1901 for i:=0 to maxsize-1 do elements^[i]:='';
1902 FreeMemory(Maxsize*SizeOf(AnsiString));
1903 inherited destroy;
1904 end;
1905
1906 constructor TArray1S.CreateNulCopy(a:TArray1S);
1907 begin
1908 create(a.lbound1, a.Size1-a.lbound1+1);
1909 end;
1910
1911 constructor TArray1S.createCopy(a:TArray1S);
1912 begin
1913 CreateNulCopy(a);
1914 copyfrom(elements^,size,a.elements^)
1915 end;
1916
1917 constructor TArray1S.CreateConcat(a,b:TArray1S);
1918 begin
1919 CreateNulCopy(a);
1920 ConcatArrays(elements^,size,a.elements^,b.elements^)
1921 end;
1922
1923 function TArray1S.NewCopy:TArray1S;
1924 begin
1925 result:=TArray1S.createCopy(self);
1926 end;
1927
1928 function TArray1S.NulCopy:TArray1S;
1929 begin
1930 result:=TArray1S.CreateNulCopy(self);
1931 end;
1932
1933 procedure TArray1S.Substring(i,j:integer);
1934 begin
1935 ArraySubstring(elements^,size,i,j)
1936 end;
1937
1938 procedure TArray1S.SubStringByte(i,j:integer);
1939 begin
1940 ArraySubstringByte(elements^,size,i,j)
1941 end;
1942
1943 function TArray1S.newcopySubstring(i,j:integer):TArray1S;
1944 begin
1945 result:=NewCopy;
1946 result.Substring(i,j);
1947 end;
1948
1949 function TArray1S.newcopySubstringByte(i,j:integer):TArray1S;
1950 begin
1951 result:=NewCopy;
1952 result.SubstringByte(i,j);
1953 end;
1954
1955 procedure TArray1S.Subst(a:TArray1S);
1956 begin
1957 try
1958 if Maxsize>=a.size then
1959 begin
1960 resize(a.size) ;
1961 CopyFrom(elements^,size,a.elements^)
1962 end
1963 else
1964 setexception(5001)
1965 finally
1966 a.free
1967 end;
1968 end;
1969
1970 procedure TArray1S.SubstSubstring(i,j:integer; a:TArray1S);
1971 begin
1972 try
1973 if Maxsize>=a.size then
1974 begin
1975 resize(a.size) ;
1976 SubstArraySubstring(elements^,size,i,j, a.elements^)
1977 end
1978 else
1979 setexception(5001)
1980 finally
1981 a.free
1982 end;
1983 end;
1984
1985 procedure TArray1S.SubstSubstringByte(i,j:integer; a:TArray1S);
1986 begin
1987 try
1988 if Maxsize>=a.size then
1989 begin
1990 resize(a.size) ;
1991 SubstArraySubstringByte(elements^,size,i,j, a.elements^)
1992 end
1993 else
1994 setexception(5001)
1995 finally
1996 a.free
1997 end;
1998 end;
1999
2000
2001 class function TArray1S.Concat(a,b:TArray1S):TArray1S; overload; // a,b���������������
2002 begin
2003 try
2004 if a.size<>b.size then setexception(6101);
2005 result:=a.NulCopy;
2006 ConcatArrays(result.elements^,result.size,a.elements^,b.elements^);
2007 finally
2008 a.free;
2009 b.free;
2010 end;
2011 end;
2012
2013 class function TArray1S.Concat(a:TArray1S; const s:string):TArray1S; overload; // a���������������
2014 begin
2015 try
2016 result:=a.NewCopy;
2017 RightConcat(result.elements^,result.size,s);
2018 finally
2019 a.free;
2020 end;
2021 end;
2022
2023 class function TArray1S.Concat(const s:String; b:TArray1S):TArray1S; overload; // b���������������
2024 begin
2025 try
2026 result:=b.NewCopy;
2027 LeftConcat(result.elements^,result.size,s);
2028 finally
2029 b.free;
2030 end;
2031 end;
2032
2033
2034 procedure TArray2S.init(lb1,ub1,lb2,ub2:integer);
2035 begin
2036 init0(lb1,ub1,lb2,ub2);
2037 if maxsize>0 then
2038 Elements:=GetZeroMemory(Maxsize*SizeOf(AnsiString));
2039 end;
2040
2041 destructor TArray2S.destroy;
2042 var
2043 i:integer;
2044 begin
2045 for i:=0 to maxsize-1 do elements^[i]:='';
2046 FreeMemory(Maxsize*SizeOf(AnsiString));
2047 inherited destroy;
2048 end;
2049
2050
2051 constructor TArray2S.CreateNulCopy(a:TArray2S);
2052 begin
2053 create(a.lbound1, a.Size1-a.lbound1+1, a.lbound2, a.Size2-a.lbound2+1);
2054 end;
2055
2056 constructor TArray2S.createCopy(a:TArray2S);
2057 begin
2058 CreateNulCopy(a);
2059 copyfrom(elements^,size,a.elements^)
2060 end;
2061
2062 constructor TArray2S.CreateConcat(a,b:TArray2S);
2063 begin
2064 CreateNulCopy(a);
2065 ConcatArrays(elements^,size,a.elements^,b.elements^)
2066 end;
2067
2068 function TArray2S.NewCopy:TArray2S;
2069 begin
2070 result:=TArray2S.createCopy(self);
2071 end;
2072
2073 function TArray2S.NulCopy:TArray2S;
2074 begin
2075 result:=TArray2S.CreateNulCopy(self);
2076 end;
2077
2078 procedure TArray2S.Substring(i,j:integer);
2079 begin
2080 ArraySubstring(elements^,size,i,j)
2081 end;
2082
2083 procedure TArray2S.SubStringByte(i,j:integer);
2084 begin
2085 ArraySubstringByte(elements^,size,i,j)
2086 end;
2087
2088 function TArray2S.newcopySubstring(i,j:integer):TArray2S;
2089 begin
2090 result:=NewCopy;
2091 result.Substring(i,j);
2092 end;
2093
2094 function TArray2S.newcopySubstringByte(i,j:integer):TArray2S;
2095 begin
2096 result:=NewCopy;
2097 result.SubstringByte(i,j);
2098 end;
2099
2100 procedure TArray2S.Subst(a:TArray2S);
2101 begin
2102 try
2103 if Maxsize>=a.size then
2104 begin
2105 resize(a.size1,a.size2) ;
2106 CopyFrom(elements^,size,a.elements^)
2107 end
2108 else
2109 setexception(5001)
2110 finally
2111 a.free
2112 end;
2113 end;
2114
2115 procedure TArray2S.SubstSubstring(i,j:integer; a:TArray2S);
2116 begin
2117 try
2118 if Maxsize>=a.size then
2119 begin
2120 resize(a.size1,a.size2) ;
2121 SubstArraySubstring(elements^,size,i,j, a.elements^)
2122 end
2123 else
2124 setexception(5001)
2125 finally
2126 a.free
2127 end;
2128 end;
2129
2130 procedure TArray2S.SubstSubstringByte(i,j:integer; a:TArray2S);
2131 begin
2132 try
2133 if Maxsize>=a.size then
2134 begin
2135 resize(a.size1,a.size2) ;
2136 SubstArraySubstringByte(elements^,size,i,j, a.elements^)
2137 end
2138 else
2139 setexception(5001)
2140 finally
2141 a.free
2142 end;
2143 end;
2144
2145
2146 class function TArray2S.Concat(a,b:TArray2S):TArray2S; overload; // a,b���������������
2147 begin
2148 try
2149 if a.size<>b.size then setexception(6101);
2150 result:=a.NulCopy;
2151 ConcatArrays(result.elements^,result.size,a.elements^,b.elements^);
2152 finally
2153 a.free;
2154 b.free;
2155 end;
2156 end;
2157
2158 class function TArray2S.Concat(a:TArray2S; const s:string):TArray2S; overload; // a���������������
2159 begin
2160 try
2161 result:=a.NewCopy;
2162 RightConcat(result.elements^,result.size,s);
2163 finally
2164 a.free;
2165 end;
2166 end;
2167
2168 class function TArray2S.Concat(const s:String; b:TArray2S):TArray2S; overload; // b���������������
2169 begin
2170 try
2171 result:=b.NewCopy;
2172 LeftConcat(result.elements^,result.size,s);
2173 finally
2174 b.free;
2175 end;
2176 end;
2177
2178
2179
2180
2181
2182 destructor TArray3S.destroy;
2183 var
2184 i:integer;
2185 begin
2186 for i:=0 to maxsize-1 do elements^[i]:='';
2187 FreeMemory(Maxsize*SizeOf(AnsiString));
2188 inherited destroy;
2189 end;
2190
2191
2192 destructor TArray4S.destroy;
2193 var
2194 i:integer;
2195 begin
2196 for i:=0 to maxsize-1 do elements^[i]:='';
2197 FreeMemory(Maxsize*SizeOf(AnsiString));
2198 inherited destroy;
2199 end;
2200
2201
2202 procedure TArray3S.init(lb1,ub1,lb2,ub2,lb3, ub3:integer);
2203 begin
2204 init0(lb1,ub1,lb2,ub2,lb3, ub3);
2205 if maxsize>0 then
2206 Elements:=GetZeroMemory(Maxsize*SizeOf(AnsiString));
2207 end;
2208
2209 constructor TArray3S.CreateNulCopy(a:TArray3S);
2210 begin
2211 create(a.lbound1, a.Size1-a.lbound1+1, a.lbound2, a.Size2-a.lbound2+1,
2212 a.lbound3, a.Size3-a.lbound3+1);
2213 end;
2214
2215 constructor TArray3S.createCopy(a:TArray3S);
2216 begin
2217 CreateNulCopy(a);
2218 copyfrom(elements^,size,a.elements^)
2219 end;
2220
2221 constructor TArray3S.CreateConcat(a,b:TArray3S);
2222 begin
2223 CreateNulCopy(a);
2224 ConcatArrays(elements^,size,a.elements^,b.elements^)
2225 end;
2226
2227 function TArray3S.NewCopy:TArray3S;
2228 begin
2229 result:=TArray3S.createCopy(self);
2230 end;
2231
2232 function TArray3S.NulCopy:TArray3S;
2233 begin
2234 result:=TArray3S.CreateNulCopy(self);
2235 end;
2236
2237 procedure TArray3S.Substring(i,j:integer);
2238 begin
2239 ArraySubstring(elements^,size,i,j)
2240 end;
2241
2242 procedure TArray3S.SubStringByte(i,j:integer);
2243 begin
2244 ArraySubstringByte(elements^,size,i,j)
2245 end;
2246
2247 function TArray3S.newcopySubstring(i,j:integer):TArray3S;
2248 begin
2249 result:=NewCopy;
2250 result.Substring(i,j);
2251 end;
2252
2253 function TArray3S.newcopySubstringByte(i,j:integer):TArray3S;
2254 begin
2255 result:=NewCopy;
2256 result.SubstringByte(i,j);
2257 end;
2258
2259 procedure TArray3S.Subst(a:TArray3S);
2260 begin
2261 try
2262 if Maxsize>=a.size then
2263 begin
2264 resize(a.size1, a.size2, a.size3) ;
2265 CopyFrom(elements^,size,a.elements^)
2266 end
2267 else
2268 setexception(5001)
2269 finally
2270 a.free
2271 end;
2272 end;
2273
2274 procedure TArray3S.SubstSubstring(i,j:integer; a:TArray3S);
2275 begin
2276 try
2277 if Maxsize>=a.size then
2278 begin
2279 resize(a.size1, a.size2, a.size3) ;
2280 SubstArraySubstring(elements^,size,i,j, a.elements^)
2281 end
2282 else
2283 setexception(5001)
2284 finally
2285 a.free
2286 end;
2287 end;
2288
2289 procedure TArray3S.SubstSubstringByte(i,j:integer; a:TArray3S);
2290 begin
2291 try
2292 if Maxsize>=a.size then
2293 begin
2294 resize(a.size1, a.size2, a.size3) ;
2295 SubstArraySubstringByte(elements^,size,i,j, a.elements^)
2296 end
2297 else
2298 setexception(5001)
2299 finally
2300 a.free
2301 end;
2302 end;
2303
2304
2305 class function TArray3S.Concat(a,b:TArray3S):TArray3S; overload; // a,b���������������
2306 begin
2307 try
2308 if a.size<>b.size then setexception(6101);
2309 result:=a.NulCopy;
2310 ConcatArrays(result.elements^,result.size,a.elements^,b.elements^);
2311 finally
2312 a.free;
2313 b.free;
2314 end;
2315 end;
2316
2317 class function TArray3S.Concat(a:TArray3S; const s:string):TArray3S; overload; // a���������������
2318 begin
2319 try
2320 result:=a.NewCopy;
2321 RightConcat(result.elements^,result.size,s);
2322 finally
2323 a.free;
2324 end;
2325 end;
2326
2327 class function TArray3S.Concat(const s:String; b:TArray3S):TArray3S; overload; // b���������������
2328 begin
2329 try
2330 result:=b.NewCopy;
2331 LeftConcat(result.elements^,result.size,s);
2332 finally
2333 b.free;
2334 end;
2335 end;
2336
2337
2338 procedure TArray4S.init(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4:integer);
2339 begin
2340 init0(lb1,ub1,lb2,ub2,lb3,ub3,lb4,ub4);
2341 if maxsize>0 then
2342 Elements:=GetZeroMemory(Maxsize*SizeOf(AnsiString));
2343 end;
2344
2345 constructor TArray4S.CreateNulCopy(a:TArray4S);
2346 begin
2347 create(a.lbound1, a.Size1-a.lbound1+1, a.lbound2, a.Size2-a.lbound2+1,
2348 a.lbound3, a.Size3-a.lbound3+1, a.lbound4, a.size4-a.lbound4+1);
2349 end;
2350
2351 constructor TArray4S.createCopy(a:TArray4S);
2352 begin
2353 CreateNulCopy(a);
2354 copyfrom(elements^,size,a.elements^)
2355 end;
2356
2357 constructor TArray4S.CreateConcat(a,b:TArray4S);
2358 begin
2359 CreateNulCopy(a);
2360 ConcatArrays(elements^,size,a.elements^,b.elements^)
2361 end;
2362
2363 function TArray4S.NewCopy:TArray4S;
2364 begin
2365 result:=TArray4S.createCopy(self);
2366 end;
2367
2368 function TArray4S.NulCopy:TArray4S;
2369 begin
2370 result:=TArray4S.CreateNulCopy(self);
2371 end;
2372
2373 procedure TArray4S.Substring(i,j:integer);
2374 begin
2375 ArraySubstring(elements^,size,i,j)
2376 end;
2377
2378 procedure TArray4S.SubStringByte(i,j:integer);
2379 begin
2380 ArraySubstringByte(elements^,size,i,j)
2381 end;
2382
2383 function TArray4S.newcopySubstring(i,j:integer):TArray4S;
2384 begin
2385 result:=NewCopy;
2386 result.Substring(i,j);
2387 end;
2388
2389 function TArray4S.newcopySubstringByte(i,j:integer):TArray4S;
2390 begin
2391 result:=NewCopy;
2392 result.SubstringByte(i,j);
2393 end;
2394
2395 procedure TArray4S.Subst(a:TArray4S);
2396 begin
2397 try
2398 if Maxsize>=a.size then
2399 begin
2400 resize(a.size1, a.size2, a.size3, a.size4) ;
2401 CopyFrom(elements^,size,a.elements^)
2402 end
2403 else
2404 setexception(5001)
2405 finally
2406 a.free
2407 end;
2408 end;
2409
2410 procedure TArray4S.SubstSubstring(i,j:integer; a:TArray4S);
2411 begin
2412 try
2413 if Maxsize>=a.size then
2414 begin
2415 resize(a.size1, a.size2, a.size3, a.size4) ;
2416 SubstArraySubstring(elements^,size,i,j, a.elements^)
2417 end
2418 else
2419 setexception(5001)
2420 finally
2421 a.free
2422 end;
2423 end;
2424
2425 procedure TArray4S.SubstSubstringByte(i,j:integer; a:TArray4S);
2426 begin
2427 try
2428 if Maxsize>=a.size then
2429 begin
2430 resize(a.size1, a.size2, a.size3, a.size4) ;
2431 SubstArraySubstringByte(elements^,size,i,j, a.elements^)
2432 end
2433 else
2434 setexception(5001)
2435 finally
2436 a.free
2437 end;
2438 end;
2439
2440
2441 class function TArray4S.Concat(a,b:TArray4S):TArray4S; overload; // a,b���������������
2442 begin
2443 try
2444 if a.size<>b.size then setexception(6101);
2445 result:=a.NulCopy;
2446 ConcatArrays(result.elements^,result.size,a.elements^,b.elements^);
2447 finally
2448 a.free;
2449 b.free;
2450 end;
2451 end;
2452
2453 class function TArray4S.Concat(a:TArray4S; const s:string):TArray4S; overload; // a���������������
2454 begin
2455 try
2456 result:=a.NewCopy;
2457 RightConcat(result.elements^,result.size,s);
2458 finally
2459 a.free;
2460 end;
2461 end;
2462
2463 class function TArray4S.Concat(const s:String; b:TArray4S):TArray4S; overload; // b���������������
2464 begin
2465 try
2466 result:=b.NewCopy;
2467 LeftConcat(result.elements^,result.size,s);
2468 finally
2469 b.free;
2470 end;
2471 end;
2472
2473 function ConCatArray(const s:string; b:TArray1S):TArray1S;overload;
2474 begin
2475 result:=TArray1S.Concat(s,b)
2476 end;
2477 function ConCatArray(a:TArray1S; const s:string):TArray1S;overload;
2478 begin
2479 result:=TArray1S.Concat(a,s)
2480 end;
2481 function ConCatArray(a,b:TArray1S):TArray1S;overload;
2482 begin
2483 result:=TArray1S.Concat(a,b)
2484 end;
2485
2486
2487 function ConCatArray(const s:string; b:TArray2S):TArray2S;overload;
2488 begin
2489 result:=TArray2S.Concat(s,b)
2490 end;
2491 function ConCatArray(a:TArray2S; const s:string):TArray2S;overload;
2492 begin
2493 result:=TArray2S.Concat(a,s)
2494 end;
2495 function ConCatArray(a,b:TArray2S):TArray2S;overload;
2496 begin
2497 result:=TArray2S.Concat(a,b)
2498 end;
2499
2500
2501 function ConCatArray(const s:string; b:TArray3S):TArray3S;overload;
2502 begin
2503 result:=TArray3S.Concat(s,b)
2504 end;
2505 function ConCatArray(a:TArray3S; const s:string):TArray3S;overload;
2506 begin
2507 result:=TArray3S.Concat(a,s)
2508 end;
2509 function ConCatArray(a,b:TArray3S):TArray3S;overload;
2510 begin
2511 result:=TArray3S.Concat(a,b)
2512 end;
2513
2514
2515
2516
2517 {*******}
2518 {MAT I/O}
2519 {*******}
2520
2521 procedure TArray1N.MatPrint(ch:tTextDevice; direction:integer);
2522 var
2523 i:integer;
2524 begin
2525 ch.newlineifneed;
2526 for i:=0 to size1 -1 do
2527 begin
2528 if direction<>0 then ch.NewZone;
2529 ch.AppendStrV2(elements^[i])
2530 end;
2531 ch.newline;
2532 ch.newline;
2533 end;
2534
2535 procedure TArray2N.MatPrint(ch:tTextDevice; direction:integer);
2536 var
2537 i,j:integer;
2538 begin
2539 ch.newlineifneed;
2540 for i:=0 to size1 -1 do
2541 begin
2542 for j:=0 to size2-1 do
2543 begin
2544 if direction<>0 then ch.NewZone;
2545 ch.AppendStrV2(elements^[i*size2 + j])
2546 end;
2547 ch.newline;
2548 end;
2549 ch.newline
2550 end;
2551
2552 procedure TArray3N.MatPrint(ch:tTextDevice; direction:integer);
2553 var
2554 i,j,k:integer;
2555 begin
2556 ch.newlineifneed;
2557 for i:=0 to size1 -1 do
2558 begin
2559 for j:=0 to size2-1 do
2560 begin
2561 for k:=0 to size3-1 do
2562 begin
2563 if direction<>0 then ch.NewZone;
2564 ch.AppendStrV2(elements^[(i*size2 + j)*size3 + k])
2565 end;
2566 ch.newline;
2567 end;
2568 ch.newline;
2569 end;
2570 end;
2571
2572 procedure TArray4N.MatPrint(ch:tTextDevice; direction:integer);
2573 var
2574 i,j,k,l:integer;
2575 begin
2576 ch.newlineifneed;
2577 for i:=0 to size1 -1 do
2578 begin
2579 for j:=0 to size2-1 do
2580 begin
2581 for k:=0 to size3-1 do
2582 begin
2583 for l:=0 to size4-1 do
2584 begin
2585 if direction<>0 then ch.NewZone;
2586 ch.AppendStrV2(elements^[((i*size2 + j)*size3 + k)*size4+l])
2587 end;
2588 ch.newline;
2589 end;
2590 ch.newline;
2591 end;
2592 ch.newline;
2593 end;
2594 end;
2595
2596
2597 procedure TArray1S.MatPrint(ch:tTextDevice; direction:integer);
2598 var
2599 i:integer;
2600 begin
2601 ch.newlineifneed;
2602 for i:=0 to size1 -1 do
2603 begin
2604 if direction<>0 then ch.NewZone;
2605 ch.AppendStrV2(elements^[i])
2606 end;
2607 ch.newline;
2608 ch.newline;
2609 end;
2610
2611 procedure TArray2S.MatPrint(ch:tTextDevice; direction:integer);
2612 var
2613 i,j:integer;
2614 begin
2615 ch.newlineifneed;
2616 for i:=0 to size1 -1 do
2617 begin
2618 for j:=0 to size2-1 do
2619 begin
2620 if direction<>0 then ch.NewZone;
2621 ch.AppendStrV2(elements^[i*size2 + j])
2622 end;
2623 ch.newline;
2624 end;
2625 ch.newline
2626 end;
2627
2628 procedure TArray3S.MatPrint(ch:tTextDevice; direction:integer);
2629 var
2630 i,j,k:integer;
2631 begin
2632 ch.newlineifneed;
2633 for i:=0 to size1 -1 do
2634 begin
2635 for j:=0 to size2-1 do
2636 begin
2637 for k:=0 to size3-1 do
2638 begin
2639 if direction<>0 then ch.NewZone;
2640 ch.AppendStrV2(elements^[(i*size2 + j)*size3 + k])
2641 end;
2642 ch.newline;
2643 end;
2644 ch.newline;
2645 end;
2646 end;
2647
2648 procedure TArray4S.MatPrint(ch:tTextDevice; direction:integer);
2649 var
2650 i,j,k,l:integer;
2651 begin
2652 ch.newlineifneed;
2653 for i:=0 to size1 -1 do
2654 begin
2655 for j:=0 to size2-1 do
2656 begin
2657 for k:=0 to size3-1 do
2658 begin
2659 for l:=0 to size4 -1 do
2660 begin
2661 if direction<>0 then ch.NewZone;
2662 ch.AppendStrV2(elements^[((i*size2 + j)*size3 + k)*size4+l])
2663 end;
2664 ch.newline;
2665 end;
2666 ch.newline;
2667 end;
2668 ch.newline;
2669 end;
2670 end;
2671
2672
2673 procedure TArray1N.MatWrite(ch:tTextDevice);
2674 var
2675 i:integer;
2676 begin
2677 for i:=0 to size1 -1 do
2678 begin
2679 if i>0 then
2680 ch.WriteSeparator(false);
2681 ch.AppendStrV2(elements^[i])
2682 end;
2683 end;
2684
2685 procedure TArray2N.MatWrite(ch:tTextDevice);
2686 var
2687 i:integer;
2688 begin
2689 for i:=0 to size -1 do
2690 begin
2691 if i>0 then
2692 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2693 ch.AppendStrV2(elements^[i])
2694 end;
2695 end;
2696
2697 procedure TArray3N.MatWrite(ch:tTextDevice);
2698 var
2699 i:integer;
2700 begin
2701 for i:=0 to size -1 do
2702 begin
2703 if i>0 then
2704 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2705 ch.AppendStrV2(elements^[i])
2706 end;
2707 end;
2708
2709 procedure TArray4N.MatWrite(ch:tTextDevice);
2710 var
2711 i:integer;
2712 begin
2713 for i:=0 to size -1 do
2714 begin
2715 if i>0 then
2716 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2717 ch.AppendStrV2(elements^[i])
2718 end;
2719 end;
2720
2721
2722 procedure TArray1S.MatWrite(ch:tTextDevice);
2723 var
2724 i:integer;
2725 begin
2726 for i:=0 to size1 -1 do
2727 begin
2728 if i>0 then
2729 ch.WriteSeparator(false);
2730 ch.AppendStrV2(elements^[i])
2731 end;
2732 end;
2733
2734 procedure TArray2S.MatWrite(ch:tTextDevice);
2735 var
2736 i:integer;
2737 begin
2738 for i:=0 to size -1 do
2739 begin
2740 if i>0 then
2741 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2742 ch.AppendStrV2(elements^[i])
2743 end;
2744 end;
2745
2746 procedure TArray3S.MatWrite(ch:tTextDevice);
2747 var
2748 i:integer;
2749 begin
2750 for i:=0 to size -1 do
2751 begin
2752 if i>0 then
2753 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2754 ch.AppendStrV2(elements^[i])
2755 end;
2756 end;
2757
2758 procedure TArray4S.MatWrite(ch:tTextDevice);
2759 var
2760 i:integer;
2761 begin
2762 for i:=0 to size -1 do
2763 begin
2764 if i>0 then
2765 ch.WriteSeparator((ch.RecType=rcCSV) and (i mod size1=0));
2766 ch.AppendStrV2(elements^[i])
2767 end;
2768 end;
2769
2770
2771
2772
2773 procedure TArray1N.Read(list:TStringList;var p:integer); //list���p���������������������
2774 var
2775 i:integer;
2776 begin
2777 for i:=0 to size-1 do
2778 begin
2779 elements^[i]:=StrToFloat(list.Strings[p]);
2780 inc(p)
2781 end;
2782 end;
2783
2784 procedure TArray2N.Read(list:TStringList;var p:integer); //list���p���������������������
2785 var
2786 i:integer;
2787 begin
2788 for i:=0 to size-1 do
2789 begin
2790 elements^[i]:=StrToFloat(list.Strings[p]);
2791 inc(p)
2792 end;
2793 end;
2794
2795 procedure TArray3N.Read(list:TStringList;var p:integer); //list���p���������������������
2796 var
2797 i:integer;
2798 begin
2799 for i:=0 to size-1 do
2800 begin
2801 elements^[i]:=StrToFloat(list.Strings[p]);
2802 inc(p)
2803 end;
2804 end;
2805
2806 procedure TArray4N.Read(list:TStringList;var p:integer); //list���p���������������������
2807 var
2808 i:integer;
2809 begin
2810 for i:=0 to size-1 do
2811 begin
2812 elements^[i]:=StrToFloat(list.Strings[p]);
2813 inc(p)
2814 end;
2815 end;
2816
2817
2818 function TArray1N.kindlist:ansistring;
2819 begin
2820 result:=StringOfChar('n',size);
2821 end;
2822
2823 function TArray2N.kindlist:ansistring;
2824 begin
2825 result:=StringOfChar('n',size);
2826 end;
2827
2828 function TArray3N.kindlist:ansistring;
2829 begin
2830 result:=StringOfChar('n',size);
2831 end;
2832
2833 function TArray4N.kindlist:ansistring;
2834 begin
2835 result:=StringOfChar('n',size);
2836 end;
2837
2838
2839 function TArray1N.InputDirective:string;
2840 begin
2841 result:=StringOfChar('n',size1);
2842 end;
2843
2844 function TArray2N.InputDirective:string;
2845 begin
2846 result:=StringOfChar('n',size1*Size2);
2847 end;
2848
2849 function TArray3N.InputDirective:string;
2850 begin
2851 result:=StringOfChar('n',size1*Size2*Size3);
2852 end;
2853
2854 function TArray4N.InputDirective:string;
2855 begin
2856 result:=StringOfChar('n',size1*Size2*Size3*size4);
2857 end;
2858
2859
2860 function TArray1S.kindlist:ansistring;
2861 begin
2862 result:=StringOfChar('s',size);
2863 end;
2864
2865 function TArray2S.kindlist:ansistring;
2866 begin
2867 result:=StringOfChar('s',size);
2868 end;
2869
2870 function TArray3S.kindlist:ansistring;
2871 begin
2872 result:=StringOfChar('s',size);
2873 end;
2874
2875 function TArray4S.kindlist:ansistring;
2876 begin
2877 result:=StringOfChar('s',size);
2878 end;
2879
2880 function TArray1S.InputDirective:string;
2881 begin
2882 result:=StringOfChar('s',size1);
2883 end;
2884
2885 function TArray2S.InputDirective:string;
2886 begin
2887 result:=StringOfChar('s',size1*Size2);
2888 end;
2889
2890 function TArray3S.InputDirective:string;
2891 begin
2892 result:=StringOfChar('s',size1*Size2*Size3);
2893 end;
2894
2895 function TArray4S.InputDirective:string;
2896 begin
2897 result:=StringOfChar('s',size1*Size2*Size3*Size4);
2898 end;
2899
2900 procedure TArray1S.Read(list:TStringList;var p:integer); //list���p���������������������
2901 var
2902 i:integer;
2903 begin
2904 for i:=0 to size-1 do
2905 begin
2906 elements^[i]:=list.Strings[p];
2907 inc(p)
2908 end;
2909 end;
2910
2911 procedure TArray2S.Read(list:TStringList;var p:integer); //list���p���������������������
2912 var
2913 i:integer;
2914 begin
2915 for i:=0 to size-1 do
2916 begin
2917 elements^[i]:=list.Strings[p];
2918 inc(p)
2919 end;
2920 end;
2921
2922 procedure TArray3S.Read(list:TStringList;var p:integer); //list���p���������������������
2923 var
2924 i:integer;
2925 begin
2926 for i:=0 to size-1 do
2927 begin
2928 elements^[i]:=list.Strings[p];
2929 inc(p)
2930 end;
2931 end;
2932
2933 procedure TArray4S.Read(list:TStringList;var p:integer); //list���p���������������������
2934 var
2935 i:integer;
2936 begin
2937 for i:=0 to size-1 do
2938 begin
2939 elements^[i]:=list.Strings[p];
2940 inc(p)
2941 end;
2942 end;
2943
2944
2945 procedure TArray1S.AssignVarilen(list:TstringList);
2946 var
2947 i:integer;
2948 begin
2949 ReSize(list.count);
2950 with list do
2951 for i:=0 to Count-1 do
2952 elements^[i]:=Strings[i];
2953 end;
2954
2955 procedure TArray1N.AssignVarilen(list:TstringList);
2956 var
2957 i:integer;
2958 begin
2959 ReSize(list.count);
2960 with list do
2961 for i:=0 to Count-1 do
2962 elements^[i]:=StrToFloat(Strings[i]);
2963 end;
2964
2965 procedure TArray1N.LetWithTrace(ch:tTextDevice; name: ansistring; index1:double; value: double);
2966 begin
2967 elements^[index(index1)]:=value;
2968 ch.PRINT([],rsNone, false ,[' '+name+'('+Format17(LongintRound(index1))+')=',
2969 value, TNewLine.create]);
2970 end;
2971
2972 procedure TArray2N.LetWithTrace(ch:tTextDevice; name: ansistring; index1,index2:double;