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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }