comparison liboctave/mx-inlines.cc @ 4563:742993a501b9

[project @ 2003-10-29 06:25:12 by jwe]
author jwe
date Wed, 29 Oct 2003 06:25:12 +0000
parents 802818bfac91
children 01e4957409a4
comparison
equal deleted inserted replaced
4562:4699bdb4c362 4563:742993a501b9
348 348
349 #define MX_ALL_OP(DIM) MX_ANY_ALL_OP (DIM, true, ==, false) 349 #define MX_ALL_OP(DIM) MX_ANY_ALL_OP (DIM, true, ==, false)
350 350
351 #define MX_ANY_OP(DIM) MX_ANY_ALL_OP (DIM, false, !=, true) 351 #define MX_ANY_OP(DIM) MX_ANY_ALL_OP (DIM, false, !=, true)
352 352
353 #define MX_ND_ALL_EXPR elem (iter_idx) == 0 353 #define MX_ND_ALL_EXPR elem (iter_idx) == 0
354 354
355 #define MX_ND_ANY_EXPR elem (iter_idx) 355 #define MX_ND_ANY_EXPR elem (iter_idx) != 0
356 356
357 #define MX_ND_ALL_EVAL(TEST_EXPR) \ 357 #define MX_ND_ALL_EVAL(TEST_EXPR) \
358 if (TEST_EXPR) \ 358 if (TEST_EXPR) \
359 { \ 359 { \
360 if (dim > -1) \ 360 if (dim > -1) \
361 iter_idx (dim) = 0; \ 361 iter_idx (dim) = 0; \
362 retval (iter_idx) = 0; \ 362 retval (iter_idx) = 0; \
363 break; \ 363 break; \
364 } \ 364 } \
365 else \ 365 else \
366 { \ 366 { \
367 if (dim > -1) \ 367 if (dim > -1) \
368 iter_idx (dim) = 0; \ 368 iter_idx (dim) = 0; \
369 retval (iter_idx) = 1; \ 369 retval (iter_idx) = 1; \
370 } \ 370 } \
376 iter_idx (dim) = 0; \ 376 iter_idx (dim) = 0; \
377 retval (iter_idx) = 1; \ 377 retval (iter_idx) = 1; \
378 break; \ 378 break; \
379 } 379 }
380 380
381 #define MX_ND_ALL_ANY(EVAL_EXPR) \ 381 #define MX_ND_ANY_ALL(EVAL_EXPR, VAL) \
382 \ 382 \
383 boolNDArray retval; \ 383 boolNDArray retval; \
384 \ 384 \
385 dim_vector dv = dims (); \ 385 dim_vector dv = dims (); \
386 /* Check to see if we have a empty matrix: [] */ \ 386 \
387 for (int i = 0; i < dv.length (); i++)\ 387 int empty = true; \
388 if (dv (i) == 0) \ 388 \
389 { \ 389 for (int i = 0; i < dv.length (); i++) \
390 dim_vector dv_temp (1, 1); \ 390 { \
391 retval.resize (dv_temp, false); \ 391 if (dv(i) > 0) \
392 return retval; \ 392 { \
393 } \ 393 empty = false; \
394 if (dim == -1)/* We need to find first non-singleton dim */ \ 394 break; \
395 { \ 395 } \
396 /* Be sure to return a scalar if we have a vector */ \ 396 } \
397 if (dv.length () == 2 && dv (0) == 1 && dv (1) >= 1) \ 397 \
398 dim = 1; \ 398 if (empty) \
399 else \ 399 { \
400 for (int i = 0; i < dv.length (); i++) \ 400 dim_vector retval_dv (1, 1); \
401 { \ 401 retval.resize (retval_dv, VAL); \
402 if (dv (i) > 1) \ 402 return retval; \
403 { \ 403 } \
404 dim = i; \ 404 \
405 break; \ 405 if (dim == -1) /* We need to find first non-singleton dim */ \
406 } \ 406 { \
407 } \ 407 for (int i = 0; i < dv.length (); i++) \
408 { \
409 if (dv (i) != 1) \
410 { \
411 dim = i; \
412 break; \
413 } \
414 } \
415 \
408 if (dim == -1) \ 416 if (dim == -1) \
417 dim = 0; \
418 } \
419 \
420 int squeezed = 0; \
421 \
422 for (int i = 0; i < dv.length (); i++) \
423 { \
424 if (dv(i) == 0) \
409 { \ 425 { \
410 (*current_liboctave_error_handler) \ 426 squeezed = 1;\
411 ("all dimensions are singleton"); \ 427 break;\
412 return retval; \ 428 } \
413 } \ 429 } \
414 } \ 430 \
415 /* Length of Dimension */\ 431 if (squeezed) \
432 { \
433 dv(dim) = 1; \
434 \
435 retval.resize (dv, VAL); \
436 \
437 return retval; \
438 } \
439 \
440 /* Length of Dimension */ \
416 int dim_length = 1; \ 441 int dim_length = 1; \
442 \
417 /* dim = -1 means from here that the user specified a */ \ 443 /* dim = -1 means from here that the user specified a */ \
418 /* dimension which is larger that the number of dimensions */ \ 444 /* dimension which is larger that the number of dimensions */ \
419 /* of the array */ \ 445 /* of the array */ \
446 \
420 if (dim >= dv.length ()) \ 447 if (dim >= dv.length ()) \
421 dim = -1; \ 448 dim = -1; \
422 else \ 449 else \
423 dim_length = dv (dim); \ 450 dim_length = dv(dim); \
451 \
424 if (dim > -1) \ 452 if (dim > -1) \
425 dv (dim) = 1; \ 453 dv(dim) = 1; \
426 \ 454 \
427 /* We need to find the number of elements we need to */ \ 455 /* We need to find the number of elements we need to */ \
428 /* fill in retval. First we need to get last idx of */ \ 456 /* fill in retval. First we need to get last idx of */ \
429 /* the dimension vector */ \ 457 /* the dimension vector */ \
458 \
430 Array<int> temp_dv (dv.length (), 0); \ 459 Array<int> temp_dv (dv.length (), 0); \
460 \
431 for (int x = 0; x < dv.length (); x++) \ 461 for (int x = 0; x < dv.length (); x++) \
432 temp_dv (x) = dv (x) - 1; \ 462 temp_dv(x) = dv(x) - 1; \
433 \ 463 \
434 /* This finds the number of elements in retval */ \ 464 /* This finds the number of elements in retval */ \
435 int num_iter = compute_index (temp_dv, dv) + 1; \ 465 int num_iter = compute_index (temp_dv, dv) + 1; \
436 \ 466 \
437 /* Make sure retval has correct dimensions */ \ 467 /* Make sure retval has correct dimensions */ \
438 retval.resize (dv, false); \ 468 retval.resize (dv, false); \
439 \ 469 \
440 Array<int> iter_idx (dv.length (), 0); \ 470 Array<int> iter_idx (dv.length (), 0); \
441 \ 471 \
442 /* Filling in values. */ \ 472 /* Filling in values. */ \
443 /* First loop finds new index */ \ 473 /* First loop finds new index */ \
474 \
444 for (int j = 0; j < num_iter; j++) \ 475 for (int j = 0; j < num_iter; j++) \
445 { \ 476 { \
446 for (int i = 0; i < dim_length; i++) \ 477 for (int i = 0; i < dim_length; i++) \
447 { \ 478 { \
448 if (dim > -1) \ 479 if (dim > -1) \
449 iter_idx (dim) = i; \ 480 iter_idx(dim) = i; \
450 \ 481 \
451 EVAL_EXPR \ 482 EVAL_EXPR; \
452 } \ 483 } \
453 \ 484 \
454 if (dim > -1) \ 485 if (dim > -1) \
455 iter_idx (dim) = 0; \ 486 iter_idx (dim) = 0; \
456 \ 487 \
457 increment_index (iter_idx, dv); \ 488 increment_index (iter_idx, dv); \
458 } \ 489 } \
459 \ 490 \
460 return retval 491 return retval
461 492
462 493
463 #endif 494 #endif
464 495
465 /* 496 /*
466 ;;; Local Variables: *** 497 ;;; Local Variables: ***