Mercurial > octave-nkf
annotate liboctave/dim-vector.cc @ 10683:4fdb36ffa066
omitted file from 10681:0ba9bd294421
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Mon, 07 Jun 2010 07:14:57 +0200 |
parents | |
children | 8675858ba1e2 |
rev | line source |
---|---|
10683
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
1 /* |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
2 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
3 Copyright (C) 2010 VZLU Prague |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
4 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
5 This file is part of Octave. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
6 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
7 Octave is free software; you can redistribute it and/or modify it |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
8 under the terms of the GNU General Public License as published by the |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
9 Free Software Foundation; either version 3 of the License, or (at your |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
10 option) any later version. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
11 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
12 Octave is distributed in the hope that it will be useful, but WITHOUT |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
15 for more details. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
16 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
17 You should have received a copy of the GNU General Public License |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
18 along with Octave; see the file COPYING. If not, see |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
19 <http://www.gnu.org/licenses/>. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
20 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
21 */ |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
22 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
23 #ifdef HAVE_CONFIG_H |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
24 #include <config.h> |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
25 #endif |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
26 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
27 #include <iostream> |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
28 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
29 #include "dim-vector.h" |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
30 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
31 void |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
32 dim_vector::chop_all_singletons (void) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
33 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
34 make_unique (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
35 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
36 int j = 0; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
37 int l = ndims(); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
38 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
39 for (int i = 0; i < l; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
40 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
41 if (rep[i] != 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
42 rep[j++] = rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
43 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
44 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
45 if (j == 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
46 rep[1] = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
47 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
48 ndims () = j > 2 ? j : 2; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
49 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
50 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
51 std::string |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
52 dim_vector::str (char sep) const |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
53 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
54 std::ostringstream buf; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
55 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
56 for (int i = 0; i < length (); i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
57 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
58 buf << elem (i); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
59 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
60 if (i < length () - 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
61 buf << sep; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
62 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
63 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
64 std::string retval = buf.str (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
65 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
66 return retval; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
67 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
68 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
69 int |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
70 dim_vector::num_ones (void) const |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
71 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
72 int retval = 0; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
73 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
74 for (int i = 0; i < length (); i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
75 if (elem (i) == 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
76 retval++; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
77 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
78 return retval; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
79 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
80 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
81 octave_idx_type |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
82 dim_vector::safe_numel (void) const |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
83 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
84 octave_idx_type idx_max = std::numeric_limits<octave_idx_type>::max () - 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
85 octave_idx_type n = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
86 int n_dims = length (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
87 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
88 for (int i = 0; i < n_dims; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
89 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
90 n *= rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
91 if (rep[i] != 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
92 idx_max /= rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
93 if (idx_max <= 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
94 throw std::bad_alloc (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
95 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
96 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
97 return n; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
98 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
99 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
100 dim_vector |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
101 dim_vector::squeeze (void) const |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
102 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
103 dim_vector new_dims = *this; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
104 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
105 bool dims_changed = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
106 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
107 int k = 0; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
108 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
109 for (int i = 0; i < length (); i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
110 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
111 if (elem (i) == 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
112 dims_changed = true; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
113 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
114 new_dims(k++) = elem (i); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
115 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
116 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
117 if (dims_changed) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
118 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
119 if (k == 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
120 new_dims = dim_vector (1, 1); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
121 else if (k == 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
122 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
123 // There is one non-singleton dimension, so we need |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
124 // to decide the correct orientation. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
125 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
126 if (elem (0) == 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
127 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
128 // The original dimension vector had a leading |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
129 // singleton dimension. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
130 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
131 octave_idx_type tmp = new_dims(0); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
132 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
133 new_dims.resize (2); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
134 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
135 new_dims(0) = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
136 new_dims(1) = tmp; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
137 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
138 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
139 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
140 // The first element of the original dimension vector |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
141 // was not a singleton dimension. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
142 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
143 new_dims.resize (2); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
144 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
145 new_dims(1) = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
146 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
147 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
148 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
149 new_dims.resize(k); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
150 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
151 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
152 return new_dims; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
153 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
154 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
155 bool |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
156 dim_vector::concat (const dim_vector& dvb, int dim) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
157 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
158 int orig_nd = ndims (), ndb = dvb.ndims (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
159 int new_nd = dim < ndb ? ndb : dim + 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
160 if (new_nd > orig_nd) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
161 resize (new_nd, 1); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
162 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
163 new_nd = orig_nd; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
164 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
165 make_unique (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
166 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
167 bool match = true; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
168 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
169 for (int i = 0; i < ndb; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
170 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
171 if (i != dim && rep[i] != dvb(i)) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
172 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
173 match = false; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
174 break; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
175 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
176 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
177 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
178 for (int i = ndb; i < new_nd; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
179 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
180 if (i != dim && rep[i] != 1) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
181 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
182 match = false; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
183 break; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
184 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
185 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
186 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
187 if (match) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
188 rep[dim] += (dim < ndb ? dvb(dim) : 1); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
189 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
190 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
191 // Dimensions don't match. The only allowed fix is |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
192 // to omit 0x0. |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
193 if (ndb == 2 && dvb(0) == 0 && dvb(1) == 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
194 match = true; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
195 else if (orig_nd == 2 && rep[0] == 0 && rep[1] == 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
196 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
197 *this = dvb; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
198 match = true; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
199 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
200 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
201 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
202 chop_trailing_singletons (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
203 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
204 return match; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
205 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
206 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
207 dim_vector |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
208 dim_vector::redim (int n) const |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
209 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
210 int n_dims = length (); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
211 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
212 if (n_dims == n) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
213 return *this; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
214 else if (n_dims < n) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
215 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
216 dim_vector retval = alloc (n); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
217 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
218 int pad = 0; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
219 for (int i = 0; i < n_dims; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
220 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
221 retval.rep[i] = rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
222 if (rep[i] != 0) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
223 pad = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
224 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
225 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
226 for (int i = n_dims; i < n; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
227 retval.rep[i] = pad; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
228 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
229 return retval; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
230 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
231 else |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
232 { |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
233 if (n < 1) n = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
234 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
235 dim_vector retval = alloc (n); |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
236 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
237 retval.rep[1] = 1; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
238 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
239 for (int i = 0; i < n-1; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
240 retval.rep[i] = rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
241 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
242 int k = rep[n-1]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
243 for (int i = n; i < n_dims; i++) |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
244 k *= rep[i]; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
245 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
246 retval.rep[n-1] = k; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
247 |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
248 return retval; |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
249 } |
4fdb36ffa066
omitted file from 10681:0ba9bd294421
Jaroslav Hajek <highegg@gmail.com>
parents:
diff
changeset
|
250 } |