comparison src/data.cc @ 7433:402168152bb9

[project @ 2008-01-31 18:59:09 by dbateman]
author dbateman
date Thu, 31 Jan 2008 18:59:11 +0000
parents 3fade00a6ac7
children bd2bd04e68ca
comparison
equal deleted inserted replaced
7432:3c999b2b5de8 7433:402168152bb9
3303 retval (0) = sys + usr; 3303 retval (0) = sys + usr;
3304 3304
3305 return retval; 3305 return retval;
3306 } 3306 }
3307 3307
3308 DEFUN (sort, args, nargout,
3309 "-*- texinfo -*-\n\
3310 @deftypefn {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x})\n\
3311 @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{dim})\n\
3312 @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{mode})\n\
3313 @deftypefnx {Loadable Function} {[@var{s}, @var{i}] =} sort (@var{x}, @var{dim}, @var{mode})\n\
3314 Return a copy of @var{x} with the elements arranged in increasing\n\
3315 order. For matrices, @code{sort} orders the elements in each column.\n\
3316 \n\
3317 For example,\n\
3318 \n\
3319 @example\n\
3320 @group\n\
3321 sort ([1, 2; 2, 3; 3, 1])\n\
3322 @result{} 1 1\n\
3323 2 2\n\
3324 3 3\n\
3325 @end group\n\
3326 @end example\n\
3327 \n\
3328 The @code{sort} function may also be used to produce a matrix\n\
3329 containing the original row indices of the elements in the sorted\n\
3330 matrix. For example,\n\
3331 \n\
3332 @example\n\
3333 @group\n\
3334 [s, i] = sort ([1, 2; 2, 3; 3, 1])\n\
3335 @result{} s = 1 1\n\
3336 2 2\n\
3337 3 3\n\
3338 @result{} i = 1 3\n\
3339 2 1\n\
3340 3 2\n\
3341 @end group\n\
3342 @end example\n\
3343 \n\
3344 If the optional argument @var{dim} is given, then the matrix is sorted\n\
3345 along the dimension defined by @var{dim}. The optional argument @code{mode}\n\
3346 defines the order in which the values will be sorted. Valid values of\n\
3347 @code{mode} are `ascend' or `descend'.\n\
3348 \n\
3349 For equal elements, the indices are such that the equal elements are listed\n\
3350 in the order that appeared in the original list.\n\
3351 \n\
3352 The @code{sort} function may also be used to sort strings and cell arrays\n\
3353 of strings, in which case the dictionary order of the strings is used.\n\
3354 \n\
3355 The algorithm used in @code{sort} is optimized for the sorting of partially\n\
3356 ordered lists.\n\
3357 @end deftypefn")
3358 {
3359 octave_value_list retval;
3360
3361 int nargin = args.length ();
3362 sortmode smode = ASCENDING;
3363
3364 if (nargin < 1 || nargin > 3)
3365 {
3366 print_usage ();
3367 return retval;
3368 }
3369
3370 bool return_idx = nargout > 1;
3371
3372 octave_value arg = args(0);
3373
3374 int dim = 0;
3375 if (nargin > 1)
3376 {
3377 if (args(1).is_string ())
3378 {
3379 std::string mode = args(1).string_value();
3380 if (mode == "ascend")
3381 smode = ASCENDING;
3382 else if (mode == "descend")
3383 smode = DESCENDING;
3384 else
3385 {
3386 error ("sort: mode must be either \"ascend\" or \"descend\"");
3387 return retval;
3388 }
3389 }
3390 else
3391 dim = args(1).nint_value () - 1;
3392 }
3393
3394 if (nargin > 2)
3395 {
3396 if (args(1).is_string ())
3397 {
3398 print_usage ();
3399 return retval;
3400 }
3401
3402 if (! args(2).is_string ())
3403 {
3404 error ("sort: mode must be a string");
3405 return retval;
3406 }
3407 std::string mode = args(2).string_value();
3408 if (mode == "ascend")
3409 smode = ASCENDING;
3410 else if (mode == "descend")
3411 smode = DESCENDING;
3412 else
3413 {
3414 error ("sort: mode must be either \"ascend\" or \"descend\"");
3415 return retval;
3416 }
3417 }
3418
3419 dim_vector dv = arg.dims ();
3420 if (error_state)
3421 {
3422 gripe_wrong_type_arg ("sort", arg);
3423 return retval;
3424 }
3425 if (nargin == 1 || args(1).is_string ())
3426 {
3427 // Find first non singleton dimension
3428 for (int i = 0; i < dv.length (); i++)
3429 if (dv(i) > 1)
3430 {
3431 dim = i;
3432 break;
3433 }
3434 }
3435 else
3436 {
3437 if (dim < 0 || dim > dv.length () - 1)
3438 {
3439 error ("sort: dim must be a valid dimension");
3440 return retval;
3441 }
3442 }
3443
3444 if (return_idx)
3445 {
3446 Array<octave_idx_type> sidx;
3447
3448 retval (0) = arg.sort (sidx, dim, smode);
3449
3450 octave_idx_type *ps = sidx.fortran_vec ();
3451 NDArray midx (sidx.dims ());
3452 double *pm = midx.fortran_vec ();
3453
3454 for (octave_idx_type i = 0; i < sidx.numel (); i++)
3455 pm [i] = static_cast<double>
3456 (ps [i] + static_cast<octave_idx_type> (1));
3457
3458 retval (1) = midx;
3459 }
3460 else
3461 retval(0) = arg.sort (dim, smode);
3462
3463 return retval;
3464 }
3465
3466 /*
3467
3468 %% Double
3469 %!assert (sort ([NaN, 1, -1, 2, Inf]), [-1, 1, 2, Inf, NaN])
3470 %!assert (sort ([NaN, 1, -1, 2, Inf], 1), [NaN, 1, -1, 2, Inf])
3471 %!assert (sort ([NaN, 1, -1, 2, Inf], 2), [-1, 1, 2, Inf, NaN])
3472 %!error (sort ([NaN, 1, -1, 2, Inf], 3))
3473 %!assert (sort ([NaN, 1, -1, 2, Inf], "ascend"), [-1, 1, 2, Inf, NaN])
3474 %!assert (sort ([NaN, 1, -1, 2, Inf], 2, "ascend"), [-1, 1, 2, Inf, NaN])
3475 %!assert (sort ([NaN, 1, -1, 2, Inf], "descend"), [NaN, Inf, 2, 1, -1])
3476 %!assert (sort ([NaN, 1, -1, 2, Inf], 2, "descend"), [NaN, Inf, 2, 1, -1])
3477 %!assert (sort ([3, 1, 7, 5; 8, 2, 6, 4]), [3, 1, 6, 4; 8, 2, 7, 5])
3478 %!assert (sort ([3, 1, 7, 5; 8, 2, 6, 4], 1), [3, 1, 6, 4; 8, 2, 7, 5])
3479 %!assert (sort ([3, 1, 7, 5; 8, 2, 6, 4], 2), [1, 3, 5, 7; 2, 4, 6, 8])
3480 %!assert (sort (1), 1)
3481
3482 %!test
3483 %! [v, i] = sort ([NaN, 1, -1, Inf, 1]);
3484 %! assert (v, [-1, 1, 1, Inf, NaN])
3485 %! assert (i, [3, 2, 5, 4, 1])
3486
3487 %% Complex
3488 %!assert (sort ([NaN, 1i, -1, 2, Inf]), [1i, -1, 2, Inf, NaN])
3489 %!assert (sort ([NaN, 1i, -1, 2, Inf], 1), [NaN, 1i, -1, 2, Inf])
3490 %!assert (sort ([NaN, 1i, -1, 2, Inf], 2), [1i, -1, 2, Inf, NaN])
3491 %!error (sort ([NaN, 1i, -1, 2, Inf], 3))
3492 %!assert (sort ([NaN, 1i, -1, 2, Inf], "ascend"), [1i, -1, 2, Inf, NaN])
3493 %!assert (sort ([NaN, 1i, -1, 2, Inf], 2, "ascend"), [1i, -1, 2, Inf, NaN])
3494 %!assert (sort ([NaN, 1i, -1, 2, Inf], "descend"), [NaN, Inf, 2, -1, 1i])
3495 %!assert (sort ([NaN, 1i, -1, 2, Inf], 2, "descend"), [NaN, Inf, 2, -1, 1i])
3496 %!assert (sort ([3, 1i, 7, 5; 8, 2, 6, 4]), [3, 1i, 6, 4; 8, 2, 7, 5])
3497 %!assert (sort ([3, 1i, 7, 5; 8, 2, 6, 4], 1), [3, 1i, 6, 4; 8, 2, 7, 5])
3498 %!assert (sort ([3, 1i, 7, 5; 8, 2, 6, 4], 2), [1i, 3, 5, 7; 2, 4, 6, 8])
3499 %!assert (sort (1i), 1i)
3500
3501 %!test
3502 %! [v, i] = sort ([NaN, 1i, -1, Inf, 1, 1i]);
3503 %! assert (v, [1, 1i, 1i, -1, Inf, NaN])
3504 %! assert (i, [5, 2, 6, 3, 4, 1])
3505
3506 %% Bool
3507 %!assert (sort ([true, false, true, false]), [false, false, true, true])
3508 %!assert (sort ([true, false, true, false], 1), [true, false, true, false])
3509 %!assert (sort ([true, false, true, false], 2), [false, false, true, true])
3510 %!error (sort ([true, false, true, false], 3))
3511 %!assert (sort ([true, false, true, false], "ascend"), [false, false, true, true])
3512 %!assert (sort ([true, false, true, false], 2, "ascend"), [false, false, true, true])
3513 %!assert (sort ([true, false, true, false], "descend"), [true, true, false, false])
3514 %!assert (sort ([true, false, true, false], 2, "descend"), [true, true, false, false])
3515 %!assert (sort (true), true)
3516
3517 %!test
3518 %! [v, i] = sort ([true, false, true, false]);
3519 %! assert (v, [false, false, true, true])
3520 %! assert (i, [2, 4, 1, 3])
3521
3522 %% Sparse Double
3523 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf])), sparse ([-1, 0, 0, 1, 2, Inf, NaN]))
3524 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), 1), sparse ([0, NaN, 1, 0, -1, 2, Inf]))
3525 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), 2), sparse ([-1, 0, 0, 1, 2, Inf, NaN]))
3526 %!error (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), 3))
3527 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), "ascend"), sparse ([-1, 0, 0, 1, 2, Inf, NaN]))
3528 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), 2, "ascend"), sparse ([-1, 0, 0, 1, 2, Inf, NaN]))
3529 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), "descend"), sparse ([NaN, Inf, 2, 1, 0, 0, -1]))
3530 %!assert (sort (sparse ([0, NaN, 1, 0, -1, 2, Inf]), 2, "descend"), sparse ([NaN, Inf, 2, 1, 0, 0, -1]))
3531
3532 %!shared a
3533 %! a = randn (10, 10);
3534 %! a (a < 0) = 0;
3535 %!assert (sort (sparse (a)), sparse (sort (a)))
3536 %!assert (sort (sparse (a), 1), sparse (sort (a, 1)))
3537 %!assert (sort (sparse (a), 2), sparse (sort (a, 2)))
3538 %!test
3539 %! [v, i] = sort (a);
3540 %! [vs, is] = sort (sparse (a));
3541 %! assert (vs, sparse (v))
3542 %! assert (is, i)
3543
3544 %% Sparse Complex
3545 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf])), sparse ([0, 0, 1i, -1, 2, Inf, NaN]))
3546 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), 1), sparse ([0, NaN, 1i, 0, -1, 2, Inf]))
3547 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), 2), sparse ([0, 0, 1i, -1, 2, Inf, NaN]))
3548 %!error (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), 3))
3549 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), "ascend"), sparse ([0, 0, 1i, -1, 2, Inf, NaN]))
3550 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), 2, "ascend"), sparse ([0, 0, 1i, -1, 2, Inf, NaN]))
3551 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), "descend"), sparse ([NaN, Inf, 2, -1, 1i, 0, 0]))
3552 %!assert (sort (sparse ([0, NaN, 1i, 0, -1, 2, Inf]), 2, "descend"), sparse ([NaN, Inf, 2, -1, 1i, 0, 0]))
3553
3554 %!shared a
3555 %! a = randn (10, 10);
3556 %! a (a < 0) = 0;
3557 %! a = 1i * a;
3558 %!assert (sort (sparse (a)), sparse (sort (a)))
3559 %!assert (sort (sparse (a), 1), sparse (sort (a, 1)))
3560 %!assert (sort (sparse (a), 2), sparse (sort (a, 2)))
3561 %!test
3562 %! [v, i] = sort (a);
3563 %! [vs, is] = sort (sparse (a));
3564 %! assert (vs, sparse (v))
3565 %! assert (is, i)
3566
3567 %% Sparse Bool
3568 %!assert (sort (sparse ([true, false, true, false])), sparse ([false, false, true, true]))
3569 %!assert (sort (sparse([true, false, true, false]), 1), sparse ([true, false, true, false]))
3570 %!assert (sort (sparse ([true, false, true, false]), 2), sparse ([false, false, true, true]))
3571 %!error (sort (sparse ([true, false, true, false], 3)))
3572 %!assert (sort (sparse ([true, false, true, false]), "ascend"), sparse([false, false, true, true]))
3573 %!assert (sort (sparse ([true, false, true, false]), 2, "ascend"), sparse([false, false, true, true]))
3574 %!assert (sort (sparse ([true, false, true, false]), "descend"), sparse ([true, true, false, false]))
3575 %!assert (sort (sparse ([true, false, true, false]), 2, "descend"), sparse([true, true, false, false]))
3576
3577 %!test
3578 %! [v, i] = sort (sparse([true, false, true, false]));
3579 %! assert (v, sparse([false, false, true, true]))
3580 %! assert (i, [2, 4, 1, 3])
3581
3582 %% Cell string array
3583 %!shared a, b, c
3584 %! a = {"Alice", "Cecile", "Eric", "Barry", "David"};
3585 %! b = {"Alice", "Barry", "Cecile", "David", "Eric"};
3586 %! c = {"Eric", "David", "Cecile", "Barry", "Alice"};
3587 %!assert (sort (a), b);
3588 %!assert (sort (a, 1), a)
3589 %!assert (sort (a, 2), b)
3590 %!error (sort (a, 3))
3591 %!assert (sort (a, "ascend"), b)
3592 %!assert (sort (a, 2, "ascend"), b)
3593 %!assert (sort (a, "descend"), c)
3594 %!assert (sort (a, 2, "descend"), c)
3595
3596 %!test
3597 %! [v, i] = sort (a);
3598 %! assert (i, [1, 4, 2, 5, 3])
3599
3600 */
3601
3308 /* 3602 /*
3309 ;;; Local Variables: *** 3603 ;;; Local Variables: ***
3310 ;;; mode: C++ *** 3604 ;;; mode: C++ ***
3311 ;;; End: *** 3605 ;;; End: ***
3312 */ 3606 */