Mercurial > hg > octave-nkf
annotate scripts/miscellaneous/orderfields.m @ 10285:22a7913bbeb5
optimize return values of find and sort
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 09 Feb 2010 12:56:47 +0100 |
parents | 9d1a14e12431 |
children | 95c3e38098bf |
rev | line source |
---|---|
8920 | 1 ## Copyright (C) 2006, 2007, 2009 Paul Kienzle |
5881 | 2 ## |
3 ## This file is part of Octave. | |
4 ## | |
5 ## Octave is free software; you can redistribute it and/or modify it | |
6 ## under the terms of the GNU General Public License as published by | |
7016 | 7 ## the Free Software Foundation; either version 3 of the License, or (at |
8 ## your option) any later version. | |
5881 | 9 ## |
10 ## Octave is distributed in the hope that it will be useful, but | |
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 ## General Public License for more details. | |
14 ## | |
15 ## You should have received a copy of the GNU General Public License | |
7016 | 16 ## along with Octave; see the file COPYING. If not, see |
17 ## <http://www.gnu.org/licenses/>. | |
5881 | 18 |
19 ## -*- texinfo -*- | |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
20 ## @deftypefn {Function File} {[@var{t}, @var{p}] =} orderfields (@var{s1}[, @var{s2}]) |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
21 ## Return a copy of @var{s1} with fields arranged alphabetically or |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
22 ## as specified by @var{s2}. |
5881 | 23 ## |
24 ## Given one struct, arrange field names in @var{s1} alphabetically. | |
25 ## | |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
26 ## If the second argument is a struct, arrange field names in @var{s1} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
27 ## as they appear in @var{s2}. The second argument may also specify the |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
28 ## order in a permutation vector or a cell array of strings containing |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
29 ## the fieldnames of @var{s1} in the desired order. |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
30 ## |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
31 ## The optional second output argument @var{p} is assigned the permutation vector |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
32 ## which converts the original name order into the new name order. |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
33 ## |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
34 ## Examples: |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
35 ## |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
36 ## @example |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
37 ## @group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
38 ## s = struct("d", 4, "b", 2, "a", 1, "c", 3); |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
39 ## t1 = orderfields(s) |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
40 ## @result{} t1 = |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
41 ## @{ |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
42 ## a = 1 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
43 ## b = 2 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
44 ## c = 3 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
45 ## d = 4 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
46 ## @} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
47 ## @end group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
48 ## @group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
49 ## t = struct("d", @{@}, "c", @{@}, "b", "a", @{@}); |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
50 ## t2 = orderfields(s, t) |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
51 ## @result{} t2 = |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
52 ## @{ |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
53 ## d = 4 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
54 ## c = 3 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
55 ## b = 2 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
56 ## a = 1 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
57 ## @} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
58 ## @end group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
59 ## @group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
60 ## t3 = orderfields(s, [3, 2, 4, 1]); |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
61 ## @result{} t3 = |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
62 ## @{ |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
63 ## a = 1 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
64 ## b = 2 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
65 ## c = 3 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
66 ## d = 4 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
67 ## @} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
68 ## @end group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
69 ## @group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
70 ## [t4, p] = orderfields(s, @{"d", "c", "b", "a"@}) |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
71 ## @result{} t4 = @{ |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
72 ## d = 4 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
73 ## c = 3 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
74 ## b = 2 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
75 ## a = 1 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
76 ## @} |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
77 ## p = |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
78 ## 1 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
79 ## 4 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
80 ## 2 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
81 ## 3 |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
82 ## @end group |
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
83 ## @end example |
5881 | 84 ## |
85 ## @seealso{getfield, rmfield, isfield, isstruct, fieldnames, struct} | |
86 ## @end deftypefn | |
87 | |
88 ## Author: Paul Kienzle <pkienzle@users.sf.net> | |
89 ## Adapted-By: jwe | |
90 | |
91 function [t, p] = orderfields (s1, s2) | |
92 | |
93 if (nargin == 1 || nargin == 2) | |
94 if (! isstruct (s1)) | |
95 error ("orderfields: expecting argument to be a struct"); | |
96 endif | |
97 else | |
98 print_usage (); | |
99 endif | |
100 | |
101 if (nargin == 1) | |
102 ## One structure: return the fields in alphabetical order. | |
6862 | 103 if (isstruct (s1)) |
5881 | 104 names = sort (fieldnames (s1)); |
105 endif | |
106 elseif (nargin == 2) | |
6862 | 107 if (isstruct (s2)) |
5881 | 108 ## Two structures: return the fields in the order of s2. |
109 names = fieldnames (s2); | |
110 if (! isequal (sort (fieldnames (s1)), sort (names))) | |
5887 | 111 error ("orderfields: structures do not have same fields"); |
5881 | 112 endif |
113 elseif (iscellstr (s2)) | |
114 ## A structure and a list of fields: order by the list of fields. | |
115 t1 = sort (fieldnames (s1)); | |
116 t2 = sort (s2(:)); | |
117 if (! isequal (t1, t2)) | |
5887 | 118 error ("orderfields: name list does not match structure fields"); |
5881 | 119 endif |
120 names = s2; | |
121 elseif (isvector (s2)) | |
122 ## A structure and a permutation vector: permute the order of s1. | |
123 names = fieldnames (s1); | |
124 t1 = sort (s2); | |
125 t1 = t1(:)'; | |
6862 | 126 t2 = 1:numel (names); |
5881 | 127 if (! isequal (t1, t2)) |
128 error ("orderfields: invalid permutation vector"); | |
129 endif | |
6862 | 130 names = names (s2); |
5881 | 131 endif |
132 endif | |
133 | |
134 ## Find permutation vector which converts the original name order | |
135 ## into the new name order. Note: could save a couple of sorts | |
136 ## in some cases, but performance isn't critical. | |
137 | |
138 if (nargout == 2) | |
139 [oldel, oldidx] = sort (fieldnames (s1)); | |
140 [newel, newidx] = sort (names); | |
141 p = oldidx(newidx); | |
142 endif | |
143 | |
144 ## Permute the names in the structure. | |
6862 | 145 if (numel (s1) == 0) |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
146 args = cell (1, 2 * numel (names)); |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
147 args(1:2:end) = names; |
8455
fd11a08a9b31
disallow invalid {}-indexed assigments
Jaroslav Hajek <highegg@gmail.com>
parents:
7017
diff
changeset
|
148 args(2:2:end) = {[]}; |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
149 t = struct (args{:}); |
6862 | 150 else |
8612
20d23d65cc84
fix & optimize orderfields
Jaroslav Hajek <highegg@gmail.com>
parents:
8605
diff
changeset
|
151 n = numel (s1); |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
152 for i = 1:numel (names) |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
153 el = names(i); |
8612
20d23d65cc84
fix & optimize orderfields
Jaroslav Hajek <highegg@gmail.com>
parents:
8605
diff
changeset
|
154 [t(1:n).(el)] = s1(:).(el); |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
155 endfor |
8612
20d23d65cc84
fix & optimize orderfields
Jaroslav Hajek <highegg@gmail.com>
parents:
8605
diff
changeset
|
156 ## inherit dimensions |
20d23d65cc84
fix & optimize orderfields
Jaroslav Hajek <highegg@gmail.com>
parents:
8605
diff
changeset
|
157 t = reshape (t, size (s1)); |
6862 | 158 endif |
5881 | 159 |
160 endfunction | |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
161 |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
162 %!shared a, b, c |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
163 %! a = struct ("foo", {1, 2}, "bar", {3, 4}); |
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
164 %! b = struct ("bar", 6, "foo", 5); |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
165 %! c = struct ("bar", {7, 8}, "foo", 9); |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
166 %!test |
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
167 %! a(2) = orderfields (b, a); |
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
168 %! assert (a(2).foo, 5) |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
169 %! assert (a(2).bar, 6) |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
170 %!test |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
171 %! [a(2), p] = orderfields (b, [2 1]); |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
172 %! assert (a(2).foo, 5) |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
173 %! assert (a(2).bar, 6) |
10122
9d1a14e12431
Update docs and add tests for container functions
Thorsten Meyer <thorsten.meyier@gmx.de>
parents:
8920
diff
changeset
|
174 %! assert (p, [2; 1]); |
8594
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
175 %!test |
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
176 %! a(2) = orderfields (b, fieldnames (a)); |
756b0ba61350
orderfields.m: avoid loop for non-empty cases. New tests.
Jason Riedy <jason@acm.org>
parents:
8455
diff
changeset
|
177 %! assert (a(2).foo, 5) |
8605
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
178 %! assert (a(2).bar, 6) |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
179 %!test |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
180 %! a(1:2) = orderfields (c, fieldnames (a)); |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
181 %! assert (a(2).foo, 9) |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
182 %! assert (a(2).bar, 8) |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
183 |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
184 %!test |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
185 %! aa.x = {1, 2}; |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
186 %! aa.y = 3; |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
187 %! aa(2).x = {4, 5}; |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
188 %! bb.y = {6, 7}; |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
189 %! bb.x = 8; |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
190 %! aa(2) = orderfields (bb, aa); |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
191 %! assert (aa(2).x, 8); |
9fc72c114ce1
Really fix indexing in orderfields.m
Jason Riedy <jason@acm.org>
parents:
8594
diff
changeset
|
192 %! assert (aa(2).y{1}, 6); |