Mercurial > octave
annotate libinterp/corefcn/perms.cc @ 33005:349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
* perms.cc: #include <numeric> at top of file.
* perms.cc (is_equal_T): New template function.
* perms.cc (is_equal_T<octave_value>): New template specialization function.
* perms.cc (GetPerms): Remove third input "do_sort". Merge code from
GetPermsNoSort(). Use std::iota rather than hand-rolled for loop.
* perms.cc (GetPermsNoSort): Delete function.
* perms.cc (Fperms): Rename functions calls to GetPermsNoSort() to GetPerms().
Rewrite input validation error message to refer to input "V".
author | Hendrik Koerner <koerhen@web.de> |
---|---|
date | Sun, 11 Feb 2024 10:06:09 +0800 |
parents | 9c9f4df5e4c3 |
children | 8adbe07a6835 |
rev | line source |
---|---|
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
1 //////////////////////////////////////////////////////////////////////// |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
2 // |
32632
2e484f9f1f18
maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
32589
diff
changeset
|
3 // Copyright (C) 2023-2024 The Octave Project Developers |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
4 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
5 // See the file COPYRIGHT.md in the top-level directory of this |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
6 // distribution or <https://octave.org/copyright/>. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
7 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
8 // This file is part of Octave. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
9 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
10 // Octave is free software: you can redistribute it and/or modify it |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
11 // under the terms of the GNU General Public License as published by |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
12 // the Free Software Foundation, either version 3 of the License, or |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
13 // (at your option) any later version. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
14 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
15 // Octave is distributed in the hope that it will be useful, but |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
16 // WITHOUT ANY WARRANTY; without even the implied warranty of |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
18 // GNU General Public License for more details. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
19 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
20 // You should have received a copy of the GNU General Public License |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
21 // along with Octave; see the file COPYING. If not, see |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
22 // <https://www.gnu.org/licenses/>. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
23 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
24 //////////////////////////////////////////////////////////////////////// |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
25 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
26 #if defined(HAVE_CONFIG_H) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
27 # include "config.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
28 #endif |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
29 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
30 #include <algorithm> |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
31 #include <numeric> |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
32 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
33 #include "defun.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
34 #include "error.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
35 #include "errwarn.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
36 #include "ovl.h" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
37 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
38 OCTAVE_BEGIN_NAMESPACE (octave) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
39 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
40 static inline double |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
41 Factorial (octave_idx_type n) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
42 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
43 double ret = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
44 for (octave_idx_type i = 2; i <= n; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
45 ret *= i; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
46 return ret; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
47 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
48 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
49 // |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
50 // Use C++ template to cater for the different octave array classes. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
51 // |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
52 |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
53 // FIXME: To allow comparison between all supported template types, we need |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
54 // to use either "if constexpr" (supported in C++17) or template specialisation |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
55 // (supported in C++11). Currently (2024), Octave stipulates the usage of |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
56 // C++11, so the (slightly more complex) template specialization is used. |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
57 // Once Octave moves to C++17 or beyond, the following code snippet is |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
58 // preferrable and the comparison templates can be removed: |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
59 // bool isequal; |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
60 // if constexpr (std::is_same<T, octave_value>::value) |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
61 // isEqual = Ar[i].is_equal (Ar[j]); |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
62 // else |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
63 // isEqual = (Ar[i] == Ar[j]); |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
64 |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
65 template <typename T> |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
66 bool is_equal_T (T a, T b) |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
67 { |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
68 return a == b; |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
69 } |
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
70 |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
71 template <> |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
72 bool is_equal_T<octave_value> (octave_value a, octave_value b) |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
73 { |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
74 return a.is_equal (b); |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
75 } |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
76 |
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
77 template <typename T> |
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
78 static inline Array<T> |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
79 GetPerms (const Array<T>& ar_in, bool uniq_v = false) |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
80 { |
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
81 octave_idx_type m = ar_in.numel (); |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
82 double nr; // number of rows of resulting array |
33004
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
83 |
9c9f4df5e4c3
maint: Backed out changeset c9d869d9c989.
Rik <rik@octave.org>
parents:
33003
diff
changeset
|
84 // Setup index vector filled from 0..m-1 |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
85 OCTAVE_LOCAL_BUFFER (octave_idx_type, myvidx, m); |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
86 std::iota (&myvidx[0], &myvidx[m], 0); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
87 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
88 const T *Ar = ar_in.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
89 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
90 if (uniq_v) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
91 { |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
92 // Mutual Comparison is used to detect duplicated values. |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
93 // Using sort would be possible for numerical values and be of |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
94 // O(n*log (n)) complexity instead of O(n*(n -1) / 2). But sort |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
95 // is not supported for the octave_value container (structs/cells). |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
96 // Moreover, sort requires overhead for creating, filling, and sorting |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
97 // the intermediate array which would need to be post-processed. |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
98 // In practice, and because n must be very small, mutual comparison is |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
99 // typically faster and consumes less memory. |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
100 |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
101 octave_idx_type N_el = 1; |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
102 double denom = 1.0; |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
103 // Number of unique permutations is n! / (n_el1! * n_el2! * ...) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
104 for (octave_idx_type i = 0; i < m - 1; i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
105 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
106 for (octave_idx_type j = i + 1; j < m; j++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
107 { |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
108 bool isequal = is_equal_T<T>(Ar[i], Ar[j]); |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
109 if (myvidx[j] > myvidx[i] && isequal) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
110 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
111 myvidx[j] = myvidx[i]; // not yet processed... |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
112 N_el++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
113 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
114 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
115 { |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
116 denom *= Factorial (N_el); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
117 N_el = 1; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
118 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
119 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
120 } |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
121 denom *= Factorial (N_el); |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
122 nr = Factorial (m) / denom; |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
123 } |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
124 else |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
125 nr = Factorial (m); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
126 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
127 // Sort vector indices for inverse lexicographic order later. |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
128 std::sort (myvidx, myvidx + m, std::greater<octave_idx_type> ()); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
129 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
130 // Set up result array |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
131 octave_idx_type n = static_cast<octave_idx_type> (nr); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
132 Array<T> res (dim_vector (n, m)); |
32660
f53ac65ffba6
maint: New method rwdata() as clearer alternative to fortran_vec().
Rik <rik@octave.org>
parents:
32632
diff
changeset
|
133 T *Res = res.rwdata (); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
134 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
135 // Do the actual job |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
136 octave_idx_type i = 0; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
137 do |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
138 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
139 for (octave_idx_type j = 0; j < m; j++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
140 Res[i + j * n] = Ar[myvidx[j]]; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
141 i++; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
142 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
143 while (std::next_permutation (myvidx, myvidx + m, std::greater<int> ())); |
32458
e516b6f4d1e0
perms.cc: Replace variable length arrays with new and delete[]
Arun Giridhar <arungiridhar@gmail.com>
parents:
32151
diff
changeset
|
144 |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
145 return res; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
146 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
147 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
148 DEFUN (perms, args, , |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
149 doc: /* -*- texinfo -*- |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
150 @deftypefn {} {@var{P} =} perms (@var{v}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
151 @deftypefnx {} {@var{P} =} perms (@var{v}, "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
152 Generate all permutations of vector @var{v} with one row per permutation. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
153 |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
154 Results are returned in reverse lexicographic order if @var{v} is in ascending |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
155 order. If @var{v} is in a different permutation, then the result is permuted |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
156 that way too. Consequently, an input in descending order yields a result in |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
157 normal lexicographic order. The result has size |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
158 @code{factorial (@var{n}) * @var{n}}, where @var{n} is the length of @var{v}. |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
159 Any repeated elements are included in the output. |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
160 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
161 If the optional argument @qcode{"unique"} is given then only unique |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
162 permutations are returned, using less memory and taking less time than calling |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
163 @code{unique (perms (@var{v}), "rows")}. |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
164 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
165 Example 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
166 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
167 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
168 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
169 perms ([1, 2, 3]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
170 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
171 3 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
172 3 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
173 2 3 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
174 2 1 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
175 1 3 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
176 1 2 3 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
177 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
178 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
179 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
180 Example 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
181 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
182 @example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
183 @group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
184 perms ([1, 1, 2, 2], "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
185 @result{} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
186 2 2 1 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
187 2 1 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
188 2 1 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
189 1 2 2 1 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
190 1 2 1 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
191 1 1 2 2 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
192 @end group |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
193 @end example |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
194 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
195 Programming Note: If the @qcode{"unique"} option is not used, the length of |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
196 @var{v} should be no more than 10-12 to limit memory consumption. Even with |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
197 @qcode{"unique"}, there should be no more than 10-12 unique elements in |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
198 @var{v}. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
199 @seealso{permute, randperm, nchoosek} |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
200 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
201 @end deftypefn */) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
202 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
203 int nargin = args.length (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
204 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
205 if (nargin < 1 || nargin > 2) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
206 print_usage (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
207 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
208 octave_value retval; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
209 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
210 // Parameter check "unique" |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
211 bool uniq_v = false; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
212 if (nargin == 2) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
213 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
214 const charMatrix opt = args (1).char_matrix_value (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
215 const char *str = opt.data (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
216 if (std::string (str, opt.cols ()) != "unique") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
217 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
218 error ("perms: option must be the string \"unique\"."); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
219 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
220 uniq_v = true; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
221 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
222 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
223 if (! (args (0).is_matrix_type () || args (0).is_range () |
32589
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
diff
changeset
|
224 || args (0).iscell () || args (0).is_scalar_type () |
05b4479c29d8
maint: C++ style check for libinterp/ before 9.1 release.
Rik <rik@octave.org>
parents:
32465
diff
changeset
|
225 || args (0).isstruct ())) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
226 { |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
227 error ("perms: V must be a matrix, range, cell array, " |
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
228 "struct, or a scalar."); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
229 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
230 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
231 std::string clname = args (0).class_name (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
232 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
233 // Execute main permutation code for the different classes |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
234 if (clname == "double") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
235 retval = GetPerms<double> (args (0).array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
236 else if (clname == "single") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
237 retval = GetPerms<float> (args (0).float_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
238 else if (clname == "logical") |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
239 retval = GetPerms<bool> (args (0).bool_array_value (), uniq_v); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
240 else if (clname == "char") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
241 retval = GetPerms<char> (args (0).char_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
242 else if (clname == "int8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
243 retval = GetPerms<octave_int8> (args (0).int8_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
244 else if (clname == "int16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
245 retval = GetPerms<octave_int16> (args (0).int16_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
246 else if (clname == "int32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
247 retval = GetPerms<octave_int32> (args (0).int32_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
248 else if (clname == "int64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
249 retval = GetPerms<octave_int64> (args (0).int64_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
250 else if (clname == "uint8") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
251 retval = GetPerms<octave_uint8> (args (0).uint8_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
252 else if (clname == "uint16") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
253 retval = GetPerms<octave_uint16> (args (0).uint16_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
254 else if (clname == "uint32") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
255 retval = GetPerms<octave_uint32> (args (0).uint32_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
256 else if (clname == "uint64") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
257 retval = GetPerms<octave_uint64> (args (0).uint64_array_value (), uniq_v); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
258 else if (clname == "cell") |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
259 retval = GetPerms<octave_value> (args (0).cell_value (), uniq_v); |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
260 else if (clname == "struct") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
261 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
262 const octave_map map_in (args (0).map_value ()); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
263 string_vector fn = map_in.fieldnames (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
264 if (fn.numel () == 0 && map_in.numel () != 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
265 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
266 octave_scalar_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
267 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
268 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
269 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
270 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
271 octave_map out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
272 if (fn.numel () == 0) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
273 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
274 out = octave_map (dim_vector (1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
275 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
276 else |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
277 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
278 for (octave_idx_type i = 0; i < fn.numel (); i++) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
279 { |
33005
349b4adf686a
Simplify code complexity of perms.cc (bug #65244)
Hendrik Koerner <koerhen@web.de>
parents:
33004
diff
changeset
|
280 out.assign (fn (i), GetPerms<octave_value> |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
281 (map_in.contents (fn (i)), uniq_v)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
282 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
283 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
284 retval = out; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
285 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
286 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
287 else // none of the above class criteria were met |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
288 { |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
289 warning ("perms: unable to permute for class %s", clname.c_str ()); |
32151
72dcb1cef2c9
maint: Strip trailing whitespace from source files.
John W. Eaton <jwe@octave.org>
parents:
31949
diff
changeset
|
290 // retval stays empty |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
291 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
292 return ovl (retval); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
293 } |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
294 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
295 /* |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
296 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
297 %!assert (rows (perms (1:6)), factorial (6)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
298 %!assert (perms (pi), pi) |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
299 %!assert (perms ([e, pi]), [pi, e; e, pi]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
300 %!assert (perms ([pi, e]), [e, pi; pi, e]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
301 %!assert (perms ([1 2 3]), [3 2 1; 3 1 2; 2 3 1; 2 1 3; 1 3 2; 1 2 3]) |
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
302 %!assert (sortrows (perms (1:5)), sortrows (perms ([2 5 4 1 3]'))) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
303 %!assert (perms ("abc"), char ("cba", "cab", "bca", "bac", "acb", "abc")) |
31949
1dba35103327
perms.cc: Resequenced output for compatibility (bug #50426)
Arun Giridhar <arungiridhar@gmail.com>
parents:
31942
diff
changeset
|
304 %!assert (sortrows (perms ("fobar")), unique (perms ("fobar"), "rows")) |
31942
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
305 %!assert (unique (perms (1:5)(:))', 1:5) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
306 %!assert (perms (int8 (1:4)), int8 (perms (1:4))) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
307 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
308 %!assert (sortrows (perms ("abb", "unique")), ["abb"; "bab"; "bba"]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
309 %!assert (size (perms ([1 1 1 1 2 2 2 3 3], "unique")), [1260 9]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
310 %!assert (size (perms (int8([1 1 1 1 1 2 2 2 2 3 3 3]), "unique")), [27720 12]) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
311 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
312 ## Should work for any array type, such as cells and structs, |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
313 ## and not only for numeric data. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
314 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
315 %!assert <*52431> (perms ({1}), {1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
316 %!assert <*52431> (perms ({0.1, "foo"}), {"foo", 0.1; 0.1, "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
317 %!assert <*52431> (perms ({"foo", 0.1}), {0.1, "foo"; "foo", 0.1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
318 %!assert <*52431> (perms ({"foo"; 0.1}), {0.1, "foo"; "foo", 0.1}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
319 %!assert <*52431> (perms ({0.1; "foo"}), {"foo", 0.1; 0.1, "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
320 %!assert <*52431> (perms ({"foo", "bar"}), {"bar", "foo"; "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
321 %!assert <*52431> (perms ({"bar", "foo"}), {"foo", "bar"; "bar", "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
322 %! |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
323 %!assert <*52431> (perms (struct ()), struct ()) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
324 %!assert <*52431> (perms (struct ("foo", {1, 2})), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
325 %! struct ("foo", {2, 1; 1, 2})) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
326 %!assert <*52431> (perms (struct ("foo", {1, 2}, "bar", {3, 4})), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
327 %! struct ("foo", {2, 1; 1, 2}, "bar", {4, 3; 3, 4})) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
328 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
329 ## Also sort logical input with order dependent on the input order and |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
330 ## not their values. |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
331 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
332 %!assert <*52431> (perms (logical ([1 0])), logical ([0 1;, 1 0])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
333 %!assert <*52431> (perms (logical ([0 1])), logical ([1 0; 0 1])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
334 %!assert <*52431> (perms (logical ([0 1 0])), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
335 %! logical ([0 1 0; 0 0 1; 1 0 0; 1 0 0; 0 0 1; 0 1 0])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
336 %!assert <*52431> (perms (logical ([0 1 1])), |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
337 %! logical ([1 1 0; 1 0 1; 1 1 0; 1 0 1; 0 1 1; 0 1 1])) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
338 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
339 %!assert <*52432> (perms ([]), reshape ([], 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
340 %!assert <*52432> (perms (single ([])), reshape (single ([]), 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
341 %!assert <*52432> (perms (int8 ([])), reshape (int8 ([]), 1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
342 %!assert <*52432> (perms ({}), cell (1, 0)) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
343 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
344 %!test <*52432> |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
345 %! s = struct (); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
346 %! s(1) = []; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
347 %! assert (perms (reshape (s, 0, 0)), reshape (s, 1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
348 %! assert (perms (reshape (s, 0, 1)), reshape (s, 1, 0)); |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
349 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
350 ## test if "unique" works also for cell arrays |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
351 %!assert <*63965> (perms ({"foo"; "foo"}, "unique"), {"foo", "foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
352 %!assert <*63965> (perms ({"foo", "foo", "bar"}, "unique"), ... |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
353 %! {"bar", "foo", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
354 %! "foo", "bar", "foo"; |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
355 %! "foo", "foo", "bar"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
356 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
357 ## Test input validation |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
358 %!error <Invalid call> perms () |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
359 %!error <option must be the string "unique"> perms (1:5, "foobar") |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
360 %!error <option must be the string "unique"> perms (1:5, {"foo"}) |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
361 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
362 */ |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
363 |
7782d1ead0a0
Replace perms.m with new perms.cc (bugs 63962 and 63965)
Hendrik Koerner <koerhen@web.de>
parents:
diff
changeset
|
364 OCTAVE_END_NAMESPACE (octave) |