Changeset 785 in Sophya for trunk/SophyaLib/TArray/tarray.cc
- Timestamp:
- Mar 16, 2000, 7:36:24 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/TArray/tarray.cc
r772 r785 9 9 10 10 11 // Classe utilitaires12 Sequence::Sequence(double start, double step)13 {14 start_ = start;15 step_ = step;16 }17 11 18 12 // Variables statiques globales … … 53 47 totsize_ = 0; 54 48 minstep_ = 0; 49 moystep_ = 0; 55 50 offset_ = 0; 56 51 // Default for matrices : Lines = Y , Columns = X … … 123 118 124 119 template <class T> 125 TArray<T> TArray<T>::SubArray(uint_4 ndim, uint_4 * siz, uint_4 * pos)126 {127 if ( (ndim > ndim_) || (ndim < 1) ) throw(SzMismatchError("TArray<T>::SubArray( ... ) NDim Error") );128 int k;129 for(k=0; k<ndim; k++)130 if ( (siz[k]+pos[k]) > size_[k] )131 throw(SzMismatchError("TArray<T>::SubArray( ... ) Size/Pos Error (1)") );132 for(k=ndim; k<ndim_; k++)133 if ( (pos[k]) >= size_[k] )134 throw(SzMismatchError("TArray<T>::SubArray( ... ) Size/Pos Error (2)") );135 TArray<T> ra(*this);136 ra.ndim_ = ndim;137 for(k=ndim; k<TARRAY_MAXNDIMS; k++) {138 ra.size_[k] = 1;139 ra.step_[k] = 0;140 }141 ra.offset_ = offset_;142 for(k=0; k<ndim_; k++) ra.offset_ += pos[k]*step_[k];143 ra.SetTemp(true);144 return(ra);145 }146 147 template <class T>148 120 TArray<T>& TArray<T>::operator = (const TArray<T>& a) 149 121 { … … 192 164 } 193 165 166 template <class T> 167 TArray<T>& TArray<T>::CompactDim() 168 { 169 if (ndim_ < 2) return(*this); 170 uint_4 ndim = 0; 171 uint_4 size[TARRAY_MAXNDIMS]; 172 uint_4 step[TARRAY_MAXNDIMS]; 173 for(int k=0; k<ndim_; k++) { 174 if (size_[k] < 2) continue; 175 size[ndim] = size_[k]; 176 step[ndim] = step_[k]; 177 ndim++; 178 } 179 if (ndim == 0) { 180 size[0] = size_[0]; 181 step[0] = step_[0]; 182 ndim = 1; 183 } 184 string exmsg = "TArray<T>::CompactDim() "; 185 if (!UpdateSizes(ndim, size, step, offset_, exmsg)) throw( ParmError(exmsg) ); 186 return(*this); 187 } 188 189 190 template <class T> 191 uint_4 TArray<T>::MinStepKA() const 192 { 193 for(int ka=0; ka<ndim_; ka++) 194 if (step_[ka] == minstep_) return(ka); 195 return(0); 196 } 197 198 template <class T> 199 uint_4 TArray<T>::MaxSizeKA() const 200 { 201 uint_4 ka = 0; 202 uint_4 mx = size_[0]; 203 for(int k=0; k<ndim_; k++) 204 if (size_[k] > mx) { ka = k; mx = size_[k]; } 205 return(ka); 206 } 207 208 209 // Acces lineaire aux elements .... Calcul d'offset 210 211 template <class T> 212 uint_8 TArray<T>::Offset(uint_8 ip) const 213 { 214 if (ip == 0) return(offset_); 215 uint_4 idx[TARRAY_MAXNDIMS]; 216 int k; 217 uint_8 rest = ip; 218 for(k=0; k<ndim_; k++) { idx[k] = rest%size_[k]; rest /= size_[k]; } 219 uint_8 off = offset_; 220 for(k=0; k<ndim_; k++) off += idx[k]*step_[k]; 221 return (off); 222 } 223 224 // SubArrays 225 template <class T> 226 TArray<T> TArray<T>::operator () (Range rx, Range ry, Range rz, Range rt, Range ru) 227 { 228 uint_4 ndim = 0; 229 uint_4 size[TARRAY_MAXNDIMS]; 230 uint_4 step[TARRAY_MAXNDIMS]; 231 uint_4 pos[TARRAY_MAXNDIMS]; 232 size[0] = rx.Size(); 233 size[1] = ry.Size(); 234 size[2] = rz.Size(); 235 size[3] = rt.Size(); 236 size[4] = ru.Size(); 237 238 step[0] = rx.Step(); 239 step[1] = ry.Step(); 240 step[2] = rz.Step(); 241 step[3] = rt.Step(); 242 step[4] = ru.Step(); 243 244 pos[0] = rx.Start(); 245 pos[1] = ry.Start(); 246 pos[2] = rz.Start(); 247 pos[3] = rt.Start(); 248 pos[4] = ru.Start(); 249 250 ndim = ndim_; 251 TArray<T> ra; 252 SubArray(ra, ndim, size, pos, step); 253 ra.SetTemp(true); 254 return(ra); 255 } 256 194 257 // ...... Operation de calcul sur les tableaux ...... 195 258 // ------- Attention -------- … … 197 260 // Possibilite de // , vectorisation 198 261 template <class T> 199 TArray<T>& TArray<T>::operator = (Sequence & seq) 200 { 201 T * pe = Data(); 202 uint_8 step = Step(); 203 for(uint_8 k=0; k<totsize_; k++ ) pe[k*step] = seq(k); 262 TArray<T>& TArray<T>::operator = (Sequence seq) 263 { 264 T * pe; 265 uint_8 j,k; 266 if (AvgStep() > 0) { // regularly spaced elements 267 uint_8 step = AvgStep(); 268 pe = Data(); 269 for(k=0; k<totsize_; k++ ) pe[k*step] = seq(k); 270 } 271 else { // Non regular data spacing ... 272 uint_4 ka = MaxSizeKA(); 273 uint_8 step = Step(ka); 274 uint_8 gpas = Size(ka); 275 for(j=0; j<totsize_; j += Size(ka)) { 276 pe = mNDBlock.Begin()+Offset(j); 277 for(k=0; k<gpas; k++) pe[k*step] = seq(j+k); 278 } 279 } 204 280 return(*this); 205 281 } … … 210 286 TArray<T>& TArray<T>::operator = (T x) 211 287 { 212 T * pe = Data(); 213 uint_8 step = Step(); 214 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] = x; 288 T * pe; 289 uint_8 j,k; 290 if (AvgStep() > 0) { // regularly spaced elements 291 uint_8 step = AvgStep(); 292 uint_8 maxx = totsize_*step; 293 pe = Data(); 294 for(k=0; k<maxx; k+=step ) pe[k] = x; 295 } 296 else { // Non regular data spacing ... 297 uint_4 ka = MaxSizeKA(); 298 uint_8 step = Step(ka); 299 uint_8 gpas = Size(ka)*step; 300 for(j=0; j<totsize_; j += Size(ka)) { 301 pe = mNDBlock.Begin()+Offset(j); 302 for(k=0; k<gpas; k+=step) pe[k] = x; 303 } 304 } 215 305 return(*this); 216 306 } … … 219 309 TArray<T>& TArray<T>::operator += (T x) 220 310 { 221 T * pe = Data(); 222 uint_8 step = Step(); 223 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] += x; 311 T * pe; 312 uint_8 j,k; 313 if (AvgStep() > 0) { // regularly spaced elements 314 uint_8 step = AvgStep(); 315 uint_8 maxx = totsize_*step; 316 pe = Data(); 317 for(k=0; k<maxx; k+=step ) pe[k] += x; 318 } 319 else { // Non regular data spacing ... 320 uint_4 ka = MaxSizeKA(); 321 uint_8 step = Step(ka); 322 uint_8 gpas = Size(ka)*step; 323 for(j=0; j<totsize_; j += Size(ka)) { 324 pe = mNDBlock.Begin()+Offset(j); 325 for(k=0; k<gpas; k+=step) pe[k] += x; 326 } 327 } 224 328 return(*this); 225 329 } … … 228 332 TArray<T>& TArray<T>::operator -= (T x) 229 333 { 230 T * pe = Data(); 231 uint_8 step = Step(); 232 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] -= x; 334 T * pe; 335 uint_8 j,k; 336 if (AvgStep() > 0) { // regularly spaced elements 337 uint_8 step = AvgStep(); 338 uint_8 maxx = totsize_*step; 339 pe = Data(); 340 for(k=0; k<maxx; k+=step ) pe[k] -= x; 341 } 342 else { // Non regular data spacing ... 343 uint_4 ka = MaxSizeKA(); 344 uint_8 step = Step(ka); 345 uint_8 gpas = Size(ka)*step; 346 for(j=0; j<totsize_; j += Size(ka)) { 347 pe = mNDBlock.Begin()+Offset(j); 348 for(k=0; k<gpas; k+=step) pe[k] -= x; 349 } 350 } 233 351 return(*this); 234 352 } … … 237 355 TArray<T>& TArray<T>::operator *= (T x) 238 356 { 239 T * pe = Data(); 240 uint_8 step = Step(); 241 for(uint_8 k=0; k<totsize_; k += step) pe[k] *= x; 357 T * pe; 358 uint_8 j,k; 359 if (AvgStep() > 0) { // regularly spaced elements 360 uint_8 step = AvgStep(); 361 uint_8 maxx = totsize_*step; 362 pe = Data(); 363 for(k=0; k<maxx; k+=step ) pe[k] *= x; 364 } 365 else { // Non regular data spacing ... 366 uint_4 ka = MaxSizeKA(); 367 uint_8 step = Step(ka); 368 uint_8 gpas = Size(ka)*step; 369 for(j=0; j<totsize_; j += Size(ka)) { 370 pe = mNDBlock.Begin()+Offset(j); 371 for(k=0; k<gpas; k+=step) pe[k] *= x; 372 } 373 } 242 374 return(*this); 243 375 } … … 246 378 TArray<T>& TArray<T>::operator /= (T x) 247 379 { 248 T * pe = Data(); 249 uint_8 step = Step(); 250 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] /= x; 380 T * pe; 381 uint_8 j,k; 382 if (AvgStep() > 0) { // regularly spaced elements 383 uint_8 step = AvgStep(); 384 uint_8 maxx = totsize_*step; 385 pe = Data(); 386 for(k=0; k<maxx; k+=step ) pe[k] /= x; 387 } 388 else { // Non regular data spacing ... 389 uint_4 ka = MaxSizeKA(); 390 uint_8 step = Step(ka); 391 uint_8 gpas = Size(ka)*step; 392 for(j=0; j<totsize_; j += Size(ka)) { 393 pe = mNDBlock.Begin()+Offset(j); 394 for(k=0; k<gpas; k+=step) pe[k] /= x; 395 } 396 } 251 397 return(*this); 252 398 } … … 258 404 { 259 405 if (!CompareSizes(a)) throw(SzMismatchError("TArray<T>::operator += (const TArray<T>&)")) ; 260 T * pe = Data(); 261 const T * pea = a.Data(); 262 uint_8 step = Step(); 263 uint_8 stepa = a.Step(); 264 uint_8 k, ka; 265 k = ka = 0; 266 for(k=0; k<totsize_; k += step) { 267 pe[k] += pea[ka]; 268 ka += stepa; 406 407 T * pe; 408 const T * pea; 409 uint_8 j,k,ka; 410 if ((AvgStep() > 0) && (a.AvgStep() > 0) ) { // regularly spaced elements 411 uint_8 step = AvgStep(); 412 uint_8 stepa = a.AvgStep(); 413 uint_8 maxx = totsize_*step; 414 pe = Data(); 415 pea = a.Data(); 416 for(k=0, ka=0; k<maxx; k+=step, ka+=stepa ) pe[k] += pea[ka] ; 417 } 418 else { // Non regular data spacing ... 419 uint_4 ax = MaxSizeKA(); 420 uint_8 step = Step(ax); 421 uint_8 stepa = a.Step(ax); 422 uint_8 gpas = Size(ax)*step; 423 for(j=0; j<totsize_; j += Size(ax)) { 424 pe = mNDBlock.Begin()+Offset(j); 425 pea = a.DataBlock().Begin()+a.Offset(j); 426 for(k=0, ka=0; k<gpas; k+=step, ka+=stepa) pe[k] += pea[ka]; 427 } 269 428 } 270 429 return(*this); … … 275 434 { 276 435 if (!CompareSizes(a)) throw(SzMismatchError("TArray<T>::operator -= (const TArray<T>&)")) ; 277 T * pe = Data(); 278 const T * pea = a.Data(); 279 uint_8 step = Step(); 280 uint_8 stepa = a.Step(); 281 uint_8 k, ka; 282 k = ka = 0; 283 for(k=0; k<totsize_; k += step) { 284 pe[k] -= pea[ka]; 285 ka += stepa; 436 437 T * pe; 438 const T * pea; 439 uint_8 j,k,ka; 440 if ((AvgStep() > 0) && (a.AvgStep() > 0) ) { // regularly spaced elements 441 uint_8 step = AvgStep(); 442 uint_8 stepa = a.AvgStep(); 443 uint_8 maxx = totsize_*step; 444 pe = Data(); 445 pea = a.Data(); 446 for(k=0, ka=0; k<maxx; k+=step, ka+=stepa ) pe[k] -= pea[ka] ; 447 } 448 else { // Non regular data spacing ... 449 uint_4 ax = MaxSizeKA(); 450 uint_8 step = Step(ax); 451 uint_8 stepa = a.Step(ax); 452 uint_8 gpas = Size(ax)*step; 453 for(j=0; j<totsize_; j += Size(ax)) { 454 pe = mNDBlock.Begin()+Offset(j); 455 pea = a.DataBlock().Begin()+a.Offset(j); 456 for(k=0, ka=0; k<gpas; k+=step, ka+=stepa) pe[k] -= pea[ka]; 457 } 286 458 } 287 459 return(*this); … … 293 465 { 294 466 if (!CompareSizes(a)) throw(SzMismatchError("TArray<T>::MultElt(const TArray<T>&)")) ; 295 T * pe = Data(); 296 const T * pea = a.Data(); 297 uint_8 step = Step(); 298 uint_8 stepa = a.Step(); 299 uint_8 k, ka; 300 k = ka = 0; 301 for(k=0; k<totsize_; k += step) { 302 pe[k] *= pea[ka]; 303 ka += stepa; 467 468 T * pe; 469 const T * pea; 470 uint_8 j,k,ka; 471 if ((AvgStep() > 0) && (a.AvgStep() > 0) ) { // regularly spaced elements 472 uint_8 step = AvgStep(); 473 uint_8 stepa = a.AvgStep(); 474 uint_8 maxx = totsize_*step; 475 pe = Data(); 476 pea = a.Data(); 477 for(k=0, ka=0; k<maxx; k+=step, ka+=stepa ) pe[k] *= pea[ka] ; 478 } 479 else { // Non regular data spacing ... 480 uint_4 ax = MaxSizeKA(); 481 uint_8 step = Step(ax); 482 uint_8 stepa = a.Step(ax); 483 uint_8 gpas = Size(ax)*step; 484 for(j=0; j<totsize_; j += Size(ax)) { 485 pe = mNDBlock.Begin()+Offset(j); 486 pea = a.DataBlock().Begin()+a.Offset(j); 487 for(k=0, ka=0; k<gpas; k+=step, ka+=stepa) pe[k] *= pea[ka]; 488 } 304 489 } 305 490 return(*this); … … 310 495 { 311 496 if (!CompareSizes(a)) throw(SzMismatchError("TArray<T>::DivElt(const TArray<T>&)")) ; 312 T * pe = Data(); 313 const T * pea = a.Data(); 314 uint_8 step = Step(); 315 uint_8 stepa = a.Step(); 316 uint_8 k, ka; 317 k = ka = 0; 318 for(k=0; k<totsize_; k += step) { 319 pe[k] /= pea[ka]; 320 ka += stepa; 497 498 T * pe; 499 const T * pea; 500 uint_8 j,k,ka; 501 if ((AvgStep() > 0) && (a.AvgStep() > 0) ) { // regularly spaced elements 502 uint_8 step = AvgStep(); 503 uint_8 stepa = a.AvgStep(); 504 uint_8 maxx = totsize_*step; 505 pe = Data(); 506 pea = a.Data(); 507 for(k=0, ka=0; k<maxx; k+=step, ka+=stepa ) pe[k] /= pea[ka] ; 508 } 509 else { // Non regular data spacing ... 510 uint_4 ax = MaxSizeKA(); 511 uint_8 step = Step(ax); 512 uint_8 stepa = a.Step(ax); 513 uint_8 gpas = Size(ax)*step; 514 for(j=0; j<totsize_; j += Size(ax)) { 515 pe = mNDBlock.Begin()+Offset(j); 516 pea = a.DataBlock().Begin()+a.Offset(j); 517 for(k=0, ka=0; k<gpas; k+=step, ka+=stepa) pe[k] /= pea[ka]; 518 } 321 519 } 322 520 return(*this); … … 330 528 TArray<T>& TArray<T>::ApplyFunction(Arr_DoubleFunctionOfX f) 331 529 { 332 T * pe = Data(); 333 uint_8 step = Step(); 334 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] = (T)(f((double)pe[k])); 530 T * pe; 531 uint_8 j,k; 532 if (AvgStep() > 0) { // regularly spaced elements 533 uint_8 step = AvgStep(); 534 uint_8 maxx = totsize_*step; 535 pe = Data(); 536 for(k=0; k<maxx; k+=step ) pe[k] = (T)(f((double)pe[k])); 537 } 538 else { // Non regular data spacing ... 539 uint_4 ka = MaxSizeKA(); 540 uint_8 step = Step(ka); 541 uint_8 gpas = Size(ka)*step; 542 for(j=0; j<totsize_; j += Size(ka)) { 543 pe = mNDBlock.Begin()+Offset(j); 544 for(k=0; k<gpas; k+=step) pe[k] = (T)(f((double)pe[k])); 545 } 546 } 335 547 return(*this); 336 548 } … … 339 551 TArray<T>& TArray<T>::ApplyFunction(Arr_FloatFunctionOfX f) 340 552 { 341 T * pe = Data(); 342 uint_8 step = Step(); 343 for(uint_8 k=0; k<totsize_*step; k += step) pe[k] = (T)(f((float)pe[k])); 553 T * pe; 554 uint_8 j,k; 555 if (AvgStep() > 0) { // regularly spaced elements 556 uint_8 step = AvgStep(); 557 uint_8 maxx = totsize_*step; 558 pe = Data(); 559 for(k=0; k<maxx; k+=step ) pe[k] = (T)(f((float)pe[k])); 560 } 561 else { // Non regular data spacing ... 562 uint_4 ka = MaxSizeKA(); 563 uint_8 step = Step(ka); 564 uint_8 gpas = Size(ka)*step; 565 for(j=0; j<totsize_; j += Size(ka)) { 566 pe = mNDBlock.Begin()+Offset(j); 567 for(k=0; k<gpas; k+=step) pe[k] = (T)(f((float)pe[k])); 568 } 569 } 344 570 return(*this); 345 571 } … … 382 608 os << " Step(X Y ...)= " ; 383 609 for(int k=0; k<ndim_; k++) os << step_[k] << " " ; 384 os << " \n " << endl;610 os << " Offset= " << offset_ << "\n " << endl; 385 611 if (si && (mInfo != NULL)) os << (*mInfo) << endl; 386 612 … … 395 621 int k0,k1,k2,k3,k4; 396 622 for(k4=0; k4<size_[4]; k4++) { 397 if (size_[4] > 1) cout << "\n ----- Dimension 5 (U) K4= " << k4 ;623 if (size_[4] > 1) cout << "\n ----- Dimension 5 (U) K4= " << k4 << endl; 398 624 for(k3=0; k3<size_[3]; k3++) { 399 if (size_[3] > 1) cout << "\n ----- Dimension 4 (T) K3= " << k3 ;625 if (size_[3] > 1) cout << "\n ----- Dimension 4 (T) K3= " << k3 << endl; 400 626 for(k2=0; k2<size_[2]; k2++) { 401 if (size_[2] > 1) cout << "\n ----- Dimension 3 (Z) K2= " << k2 ;627 if (size_[2] > 1) cout << "\n ----- Dimension 3 (Z) K2= " << k2 << endl; 402 628 for(k1=0; k1<size_[1]; k1++) { 403 if ( (size_[1] > 1) && (size_[0] > 10) ) cout << "----- Dimension 2 (Y) K1= " << k1 ;629 if ( (size_[1] > 1) && (size_[0] > 10) ) cout << "----- Dimension 2 (Y) K1= " << k1 << endl; 404 630 for(k0=0; k0<size_[0]; k0++) { 405 os << Elem(k0, k1, k2, k3, k4) << ", "; npr++; 631 if(k0 > 0) os << ", "; 632 os << Elem(k0, k1, k2, k3, k4); npr++; 406 633 if (npr >= maxprt) { 407 634 if (npr < totsize_) os << "\n .... " << endl; return; … … 434 661 } 435 662 436 minstep_ = 1;663 minstep_ = moystep_ = step; 437 664 438 665 // Flagging bad updates ... … … 478 705 step_[k] = 0; 479 706 } 480 minstep_= step[0];707 uint_4 minstep = step[0]; 481 708 for(k=0; k<ndim; k++) { 482 709 size_[k] = siz[k] ; 483 710 step_[k] = step[k]; 484 711 totsize_ *= size_[k]; 485 if (step_[k] < minstep _) minstep_= step_[k];486 } 487 if (minstep _< 1) {712 if (step_[k] < minstep) minstep = step_[k]; 713 } 714 if (minstep < 1) { 488 715 exmsg += " Step(=0) Error"; return false; 489 716 } … … 491 718 exmsg += " Size Error"; return false; 492 719 } 720 uint_8 plast = 0; 721 for(k=0; k<ndim; k++) plast += (siz[k]-1)*step[k]; 722 if (plast == minstep*totsize_ ) moystep_ = minstep; 723 else moystep_ = 0; 724 minstep_ = minstep; 493 725 offset_ = offset; 494 726 // Default for matrices : Lines = Y , Columns = X … … 499 731 return true; 500 732 } 733 501 734 template <class T> 502 735 bool TArray<T>::UpdateSizes(const TArray<T>& a, string & exmsg) … … 515 748 step_[k] = 0; 516 749 } 517 minstep_= a.step_[0];750 uint_4 minstep = a.step_[0]; 518 751 for(k=0; k<a.ndim_; k++) { 519 752 size_[k] = a.size_[k] ; 520 753 step_[k] = a.step_[k]; 521 754 totsize_ *= size_[k]; 522 if (step_[k] < minstep _) minstep_= step_[k];523 } 524 if (minstep _< 1) {755 if (step_[k] < minstep) minstep = step_[k]; 756 } 757 if (minstep < 1) { 525 758 exmsg += " Step(=0) Error"; return false; 526 759 } … … 529 762 } 530 763 764 minstep_ = a.minstep_; 765 moystep_ = a.moystep_; 531 766 offset_ = a.offset_; 532 767 macoli_ = a.macoli_; … … 553 788 } 554 789 790 791 template <class T> 792 void TArray<T>::SubArray(TArray<T> & ra, uint_4 ndim, uint_4 * siz, uint_4 * pos, uint_4 * step) 793 { 794 if ( (ndim > ndim_) || (ndim < 1) ) throw(SzMismatchError("TArray<T>::SubArray( ... ) NDim Error") ); 795 int k; 796 for(k=0; k<ndim; k++) 797 if ( (siz[k]*step[k]+pos[k]) > size_[k] ) 798 throw(SzMismatchError("TArray<T>::SubArray( ... ) Size/Pos Error") ); 799 (ra.mNDBlock).Share(mNDBlock); 800 uint_8 offset = offset_; 801 for(k=0; k<ndim_; k++) { 802 offset += pos[k]*step_[k]; 803 step[k] *= step_[k]; 804 } 805 string exm = "TArray<T>::SubArray() "; 806 if (!ra.UpdateSizes(ndim, siz, step, offset, exm)) 807 throw( ParmError(exm) ); 808 (ra.mNDBlock).Share(mNDBlock); 809 return; 810 } 555 811 556 812 ///////////////////////////////////////////////////////////////
Note:
See TracChangeset
for help on using the changeset viewer.